BLOG

[실습예제] Amazon ES와 Amazon Kinesis Data Firehose를 사용한 Amazon AppStream 2.0 모니터링
작성일: 2020-03-02

Amazon AppStream 2.0 은 확장성 있는 어플리케이션의 스트리밍 솔루션을 제공합니다. 그러나 많은 세션들로 로그나 성능 메트릭와 같은 각 세션의 정보에 대한 인사이트가 복잡해질 수 있습니다. Amazon Kinesis Agent for Microsoft Windows를 사용하여 로그와 매트릭스 수집을 단순화할 수 있습니다. Window용 Kinesis Agent는 Amazon Kinesis Data Firehose를 통하여 여러 대상에서 지원하는 로그 또는 매트릭스를 push할 수 있습니다.

이번 글에서는 Window용 Kinesis Agent가 로그를 Kinesis Data Firehose에 어떻게 push 하는지 솔루션 프로세스를 설정하는 방법을 다루어 보겠습니다. 이러한 기능은 Amazon ES에 전송 하고 Kibana는 로그를 시각화 하는데 도움을 줍니다.

 

아키텍쳐

Window용 Kinesis Agent를 사용하여 AppStream 2.0 Kinesis Data Firehose 및 Amazon ES로 로그를 push 하는 다이어그램

  • 클라이언트인 Amazon AppStream 2.0 스트리밍 인스턴스는 Window용 Kinesis Agent를 사용하여 로그를 Kinesis Data Firehose에 push합니다.
  • Kinesis Data Firehose는 Amazon ES에 로그를 전송합니다.

 

개요

이번 단계에서는, us-east-1 리젼에 AppStream 2.0, Kinesis Data Firehose, Amazon ES를 사용해 보겠습니다. 아래의 단계를 참고하십시오.

  1. Amazon ES 도메인을 생성하십시오.
  2. Kinesis Data Firehose 전송 스트림을 생성하십시오.
  3. IAM역할을 생성하십시오.
  4. Amazon AppStream 2.0에서 사용자 커스텀 이미지를 생성하십시오.
  5. Amazon AppStream 2.0에서 stack 과 fleet를 생성하십시오.
  6. Kibana에서 매트릭스를 확인하십시오.

 

전제 조건

이번 단계에서는 다음과 같은 리소스가 필요합니다.

  • AWS 계정
  • 솔루션에 사용된 AWS 서비스에 액세스 할 수 있는 IAM 사용자

 

1 단계: Amazon ES 도메인 생성하기

아래를 참고하여 새로운 Amazon ES 도메인을 생성하십시오.

아래의 단계는 production용이 아닙니다. 도메인이 준비되기까지 약 10분정도의 시간이 걸립니다.

  • Name: example-domain
  • Deployment type: Development and testing
  • Elasticsearch version: 7.1
  • Instance type: t2.medium.elasticsearch
  • Number of instance: 2
  • Storage
    • Storage type: EBS
    • EBS volume type: SSD
    • EBS storage size per node: 35(GB)
  • Public access
  • Access policy (액세스 정책)
    • 네트워크 위치에서 액세스를 허용하십시오. checkip 사이트에서 퍼블릭 IP주소를 확인할 수 있습니다.

 

IP주소 범위에서 액세스를 허용하기 위한 정책 샘플:

{

  “Version”: “2012-10-17”,

  “Statement”: [

    {

      “Effect”: “Allow”,

      “Principal”: {

        “AWS”: “*”

      },

      “Action”: “es:*”,

      “Resource”: “arn:aws:es:us-east-1:123456789012:domain/example-domain/*”,

      “Condition”: {

        “IpAddress”: {

          “aws:SourceIp”: [

            “192.16.0.0/32”

          ]

        }

      }

    }

  ]

}

 

2 단계: Kinesis Data Firehose 전송 스트림 생성하기

이번에는 아래 단계들을 통하여 Kinesis Data Firehose 전송 스트림을 생성하십시오

  • Delivery stream name: Example-Stream
  • Source: Direct PUT or other source
  • Transform source records with AWS Lambda: Disabled
  • Convert record format: Disabled
  • Select destination: Amazon Elasticsearch Service
    • Domain: example-domain
    • Index: example
  • 인덱스는 데이터베이스와 유사합니다. 예를 들어, 각 이메일 캠페인에서 개별적으로 이벤트에 액세스하는 쉬운 방법을 위해 각 캠페인마다 다른 Kinesis Data Firehose stream및 index를 사용할 수 있습니다.
    • Index rotation: No rotation
    • Type: none(지정된 유형의 이름이 없다면 새로운 유형의 이름이 생성됩니다.)
    • Retry duration: 60 seconds

 

  • S3 backup
    • Failed records only
    • Backup Amazon S3 bucket (만약 계정 내에 단계를 수행할 S3 버킷이 없다면 새로 만드십시오.)
  • Buffer size: 1 MB
  • Buffer interval: 60 seconds
  • S3 compression/encryption: Disabled
  • Error logging: Enabled
  • IAM role
    • 새로운 IAM 역할을 생성하십시오. 필요한 권한이 IAM에 자동으로 부여될 것입니다.

 

3 단계: IAM 역할 생성하기

아래의 단계를 통하여 새로운 AppStream 2.0 스트림 인스턴스에 대한 새로운 IAM 역할을 생성하십시오.

  • IAM role name: AS2-KinesisAgent-Role
  • IAM trust relationship: See the following policy

 

{

  “Version”: “2012-10-17”,

  “Statement”: [

    {

      “Effect”: “Allow”,

      “Principal”: {

        “Service”: [

          “appstream.amazonaws.com”

        ]

      },

      “Action”: “sts:AssumeRole”

    }

  ]

}

 

  • IAM policy: See the following sample policy (아래의 정책 예시를 참고하십시오.)

 

{

    “Version”: “2012-10-17”,

    “Statement”: [

        {

            “Effect”: “Allow”,

            “Action”: [

                “firehose:PutRecord”,

                “firehose:PutRecordBatch”

            ],

            “Resource”: “arn:aws:firehose:us-east-1:123456789012:deliverystream/Example-Stream”

        }

    ]

}

 

4 단계: Amazon AppStream 2.0에서 사용자 지정 이미지 생성

아래의 단계를 통하여 사용자 맞춤형 AppStream 2.0 이미지를 생성하십시오.

첫 번째로, AppStream-WinServer2019-<date>라는 이름으로 시작하는 기본 이미지 중 하나를 사용하여 example-image라는 이름의 새로운 이미지 빌더를 생성하십시오. 인터넷 액세스 옵션을 활성화 하여 Window용 Kinesis Agent를 다운로드하고 설치 하십시오.

 

샘플 이미지 빌더

{

    “Sources”: [

        {

            “Id”: “ApplicationLog”,

            “SourceType”: “WindowsEventLogSource”,

            “LogName”: “Application”

        },

        {

            “Id”: “SystemLog”,

            “SourceType”: “WindowsEventLogSource”,

            “LogName”: “System”

        }

    ],

    “Sinks”: [

        {

            “Id”: “myKinesisFirehoseSink”,

            “SinkType”: “KinesisFirehose”,

            “ProfileName”: “appstream_machine_role”,

            “Region”: “us-east-1”,

            “StreamName”: “Example-Stream”,

            “ObjectDecoration”: “{appstreamVariables};APPSTREAM_SESSION_CONTEXT={env:APPSTREAM_SESSION_CONTEXT};AppStream_Image_Arn={env:AppStream_Image_Arn};AppStream_Instance_Type={env:AppStream_Instance_Type};AppStream_Resource_Type={env:AppStream_Resource_Type};AppStream_Resource_Name={env:AppStream_Resource_Name}”,

            “Format”: “json”

        }

    ],

    “Pipes”: [

        {

            “Id”: “ApplicationLogToKinesisFirehose”,

            “SourceRef”: “ApplicationLog”,

            “SinkRef”: “myKinesisFirehoseSink”

        },

        {

            “Id”: “ApplicationLogToKinesisFirehose”,

            “SourceRef”: “SystemLog”,

            “SinkRef”: “myKinesisFirehoseSink”

        }

    ],

    “SelfUpdate”: 0

}

 

 

다음으로는 AppStream2.0 세션 스크립트 구성입니다. 시스템 세션 시작 스크립트는 사용자의 변수를 읽고 Window용 kinesis Agent의 appsettings.json 파일을 업데이트해야 합니다.

아래의 단계를 통하여 C:\AppStream\SessionScripts\config.json 업데이트 하십시오. 구성의 사용자 시스템 컨텐스트에서 세션 시작 스크립트를 실행합니다.

세션 스크립트용 config.json

{

    “SessionStart”: {

        “executables”: [

            {

                “context”: “system”,

                “filename”: “C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe”,

                “arguments”: “-NonInteractive -File C:\\Scripts\\system_session_start.ps1”,

                “s3LogEnabled”: true

            },

            {

                “context”: “user”,

                “filename”: “”,

                “arguments”: “”,

                “s3LogEnabled”: true

            }

        ],

        “waitingTime”: 30

    },

    “SessionTermination”: {

        “executables”: [

            {

                “context”: “system”,

                “filename”: “”,

                “arguments”: “”,

                “s3LogEnabled”: true

            },

            {

                “context”: “user”,

                “filename”: “”,

                “arguments”: “”,

                “s3LogEnabled”: true

            }

        ],

        “waitingTime”: 30

    }

}

 

C:\ 아래에 Scripts 라는 이름의 디렉토리를 생성하십시오. PowerShell 스크립트를 사용하여 C:\Scripts\ 아래 system_session_start.ps1 저장합니다. 스크립트는 the AppStream 2.0 user environment variables 를 검색하고 이를 사용하여 Windows용 Kinesis Agent 의 appsettings.json 파일을 업데이트 해야 합니다. 환경 변수는 사용자 이름과 같은 세션정보를 기반으로 검색할 있도록 Amazon ES push 로그에 추가됩니다.

 

#########################################################

# Setting variables for the Kinesis Agent appsettings file path

$kinesisAgentConfigFile = “C:\Program Files\Amazon\AWSKinesisTap\appsettings.json”

 

#########################################################

# Log helper function

function Write-Log {

    param(

        [Parameter(Mandatory=$true)]

        $message,

        [ValidateSet(‘INFO’,’WARNING’, ‘ERROR’)]

        $logLevel = ‘INFO’

        )

        $timestamp = Get-Date -Format o

        Write-Host “[$($timestamp)] [$($logLevel)] $($message) “

    }

 

#########################################################

Write-Log “Starting the system session script”

Write-Log “Waiting for 5 seconds”

Start-Sleep -Seconds 5

 

#########################################################

# Getting AppStream user variables

New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS

#Check if user is connected, else sleep

if ((Get-WmiObject win32_computersystem).username) {

    $ConsoleUser = (Get-WmiObject win32_computersystem).username.split(“\\”)[1]

    $filterstring = “name = ‘” + $ConsoleUser + “‘”

    $ConsoleUserSID = (Get-WmiObject win32_useraccount -Filter $filterstring).SID

    #Check if AppStream_UserName environment variable is set yet

    $waitSeconds = 0

    while($null -eq $AppStream_UserName){

        if($waitSeconds -eq 21){

            Write-Log “Waited for 20 seconds. The stdout log file is null.” -logLevel ‘ERROR’

            break

        }

        try{

            Get-ItemProperty -Path HKU:\$ConsoleUserSID\Environment -Name AppStream_UserName

            $AppStream_Stack_Name = (Get-ItemProperty -Path HKU:\$ConsoleUserSID\Environment -Name AppStream_Stack_Name -ErrorAction SilentlyContinue).AppStream_Stack_Name

            $AppStream_UserName = (Get-ItemProperty -Path HKU:\$ConsoleUserSID\Environment -Name AppStream_UserName -ErrorAction SilentlyContinue).AppStream_UserName

            $AppStream_Stack_Name = (Get-ItemProperty -Path HKU:\$ConsoleUserSID\Environment -Name AppStream_Stack_Name -ErrorAction SilentlyContinue).AppStream_Stack_Name

            $AppStream_User_Access_Mode = (Get-ItemProperty -Path HKU:\$ConsoleUserSID\Environment -Name AppStream_User_Access_Mode -ErrorAction SilentlyContinue).AppStream_User_Access_Mode

            $AppStream_Session_Reservation_DateTime = (Get-ItemProperty -Path HKU:\$ConsoleUserSID\Environment -Name AppStream_Session_Reservation_DateTime -ErrorAction SilentlyContinue).AppStream_Session_Reservation_DateTime

            $AppStream_Session_ID = (Get-ItemProperty -Path HKU:\$ConsoleUserSID\Environment -Name AppStream_Session_ID -ErrorAction SilentlyContinue).AppStream_Session_ID

        }catch{

            Write-Log “AppStream user environment variables are not ready.” -logLevel ‘WARNING’

            Start-Sleep -Seconds 1

        }

    }

}

$appstreamVariables=”AppStream_Stack_Name=$($AppStream_Stack_Name);AppStream_User_Access_Mode=$($AppStream_User_Access_Mode);AppStream_Session_Reservation_DateTime=$($AppStream_Session_Reservation_DateTime);AppStream_UserName=$($AppStream_UserName);AppStream_Session_ID=$($AppStream_Session_ID)”

 

#########################################################

# Read the Kinesis Agent for Windows appsettings.json

Write-Log “Reading the Kinesis Agent appsettings.json”

$kinesisAgentConfig = Get-Content $kinesisAgentConfigFile

Write-Log “Original Kinesis Agent Config: $($kinesisAgentConfig)”

# Stopping the Kinesis Agent service

$processId = Get-Process -Name AWSKinesisTap -ErrorAction SilentlyContinue

if([string]::IsNullOrWhiteSpace($processId)){

    Write-Log “AWSKinesisTap is not running” -logLevel ‘WARNING’

}else{

    Write-Log “AWSKinesisTap is running”

    taskkill /pid $processId.Id /F

    Write-Log “AWSKinesisTap is stopped”

}

# Update the appsettings.json file with the AppStream user environment variables

Write-Log “AppStream user variables: $($appstreamVariables)”

$updatedKinesisAgentConfig = $kinesisAgentConfig -replace(“{appstreamVariables}”, $appstreamVariables)

Write-Log “Updated Kinesis appsettings.json: $updatedKinesisAgentConfig”

# Write the updated appsettings.json content with the AppStream user variables.

Set-Content -Path $kinesisAgentConfigFile -Value $updatedKinesisAgentConfig

Start-Service -Name AWSKinesisTap

Write-Log “Ending the system session script.”

#########################################################

 

Window Kinesis Agent appsettings.json 구성된 이후 config.json 세션 스크립트, 그리고 시스템 세션 시작 스크립트를 구성한 후 Image Assistant를 통해 이미지 빌더에서 사용자 지정 이미지를 생성하십시오. 제가 사용한 구성은 아래와 같습니다.

 

구성 예제

Application:

App1

  • Name: Firefox
  • DisplayName: Firefox
  • Launch Path: C:\Program Files (x86)\Mozilla Firefox\firefox.exe
  • Working Directory: C:\Program Files (x86)\Mozilla Firefox

App2

  • Name: PowerShell
  • Display Name: PowerShell
  • Launch Path: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

Image Details

  • Name: Example-Image

 

5 단계: Amazon AppStream 2.0에서 Stack Fleet 생성하기

사용자 지정 이미지가 사용 가능할 때, Stack 과 Fleet를 생성하십시오. Fleet를 생성하는 동안 5단계에서 만든 사용자 지정 이미지를 선택하십시오. Stack에는 이 단계에서 생성한 새로운 Fleet을 사용하십시오.

  • Stack: Example-Stack
  • Fleet: Example-Fleet
    • Image: Example-Image
    • VPC:
      • 기본 인터넷 액세스를 활성화 하십시오. 만약 활성화가 되지 않는다면, TCP 포트 443을 통해 Fleet이 인터넷에 액세스 가능한지 확인하십시오.
      • IAM 역할: AS2-KinesisAgent-Role

Fleet이 실행 상태일 때, 스트리밍 세션에 액세스하십시오.

 

6 단계: Kibana에서 데이터 모니터링

Amazon ES의 Kibana를 사용함으로써 클러스터에 저장된 로그를 쉽게 시각화 할 수 있습니다. 이 연습을 통해 사용한 어플리케이션 및 시스템 로그는 AppStream 2.0 Fleet 인스턴스를 소스로 사용하여 Kibana에서 분석했습니다. 아래의 단계들을 따라 하여 로그인하고 어플리케이션과 시스템 이벤트 로그를 읽을 수 있습니다.

  1. 다음 URL을 사용하여 Kibana에 로그인 하십시오
  2. 관리 탭에서 example 라는 이름의 인덱스 패턴을 생성하십시오.
  3. Discover 페이지에서 로그를 확인하십시오.

인덱스 패턴이 생성된 후, Discover 페이지로 이동하십시오. 이제 AppStream 2.0 변수가 있는 로그를 확인할 수 있습니다.

 

 

결론

이번 글에서는 Amazon AppStream 2.0에서 Amazon Kinesis Data Firehose와 Amazon ES로 어플리케이션 및 시스템 이벤트 로그를 push 하는 방법을 단계별로 다루어 보았습니다.

 

이제는 Fleet 세션 정보를 거의 실시간으로 시각화 할 수 있습니다. Windows 용 Kinesis Agent는 시스템 매트릭스 및 다른 로그를 push 할 수 있습니다. Amazon ES 뿐만 아니라 Amazon S3, Amazon Redshift, 그리고 Splunk와 같은 다른 대상에도 로그와 매트릭스를 전송할 수 있습니다.

 

 


원문 URL: https://aws.amazon.com/ko/blogs/desktop-and-application-streaming/monitoring-amazon-appstream-2-0-with-amazon-es-and-amazon-kinesis-data-firehose/

 

** 메가존 클라우드 TechBlog는 AWS BLOG 영문 게재 글 중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 개제하고 있습니다. 추가로 번역 및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달드리도록 하겠습니다.