BLOG

[실습] IAM 역할과 Window 작업 스케줄러를 사용하여 S3에 AppStream 2.0 Windows 이벤트 로그를 저장하기
작성일: 2020-03-12

최근 AWS는 이미지 빌더 및 집합에서 IAM 역할에 대한 사용 지원을 발표했습니다. 이제는 Amazon AppStream 2.0 스트리밍 인스턴스는 AWS API 액션에 대한 역할 기반의 액세스에 유연성과 보안성을 장점으로 이용할 수 있습니다.

 

이 애플리케이션의 주요한 기능 중 하나는 문제 해결을 위한 Windows 이벤트 로그를 쉽게 저장하고 업로드할 수 있다는 것입니다. AppStream 2.0 스트리밍 인스턴스의 경우, Windows 이벤트 로그는 자동으로 캡처되어 저장되지 않습니다.

 

정기적으로 실행되는PowerShell 스크립트와 새로운 IAM 역할을 사용하면 Windows 이벤트 로그를 Amazon S3에 업로드할 수 있습니다. AppStream 2.0에 제공된 이름순으로 파일을 저장한다면 최종 사용자 문제해결에 필요한 로그를 찾을 때 훨씬 쉽게 찾을 수 있습니다.

 

개요

이번 블로그 포스팅으로는 리소스 설정 및 예약된 작업을 통해 반복하는 작업을 안내해 드립니다. 아래의 단계들을 수행하여 작업해주시면 됩니다.

  1. AppStream 2.0 스트리밍 인스턴스가 S3 버킷에 액세스 할 수 있도록 IAM 정책 및 역할을 생성하십시오.
  2. AppStream 2.0 이미지 빌더 에서 PowerShell 스크립트 및 예약 작업을 구성하십시오.
  3. AppStream 2.0 이미지 빌더 에서 사용자 지정 이미지를 생성하십시오.
  4. 사용자 지정 이미지에서 Stack과 집합을 만듭니다.

 

전제 조건

위 작업을 위해서는 아래의 작업들이 먼저 완료되어야 합니다.

  • AWS 계정
  • 기존의 S3 버킷
  • 인터넷 액세스가 가능하거나 또는 S3를 위해 구성된 서비스 endpoint가 있는 VPC
  • AppStream 2.0 이미지 빌더

 

IAM 역할을 사용하여 AppStream 2.0 스트리밍 인스턴스에서 실행되는 애플리케이션과 스크립트 에 권한 부여를 하는 방법에 대한 상세 설명은 해당 링크를 클릭해 주십시오.

 

 

IAM 정책과 역할 생성

이번 단계에서는 S3 버킷에 권한을 부여하는 IAM 정책을 생성할 것입니다. 다음으로는 생성된 IAM 정책을 AppStream 2.0 스트리밍 인스턴스가 추정할 수 있는 IAM 역할에 연결합니다.

  1. IAM console로 이동하십시오.
  2. 정책, 정책 생성을 선택하십시오.
  3. JSON 탭을 선택하십시오. Policy document에서 아래의 JSON 정책을 복사하여 로그의 대상에 붙여넣으십시오.
  4. <s3-bucket-name>을 기존 버킷 이름으로 변경하십시오.
  5. Review Policy를 선택하십시오.
  6. 선택한 이름을 입력하고 Create policy를 선택하십시오.

 

 

S3 버킷 정책 문서 예시

{

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

    “Statement”: [

        {

            “Effect”: “Allow”,

            “Action”: “s3:PutObject”,

            “Resource”: “arn:aws:s3:::<s3-bucket-name>/*”

        }

    ]

}

 

이제 IAM 정책이 생성되었습니다. 조금 전 생성한 정책을 기반으로 AppStream 2.0 에서 IAM 역할을 생성할 수 있습니다.

  1. IAM 콘솔을 여십시오.
  2. Role을 선택한 뒤에 Create Role을 선택하십시오
  3. Select type of trusted entity를 선택하고 AWS service를 선택하십시오.
  4. AppStream 2.0 을 선택한 뒤에 Next: Permission 을 선택하십시오.
  5. Filter policies 박스에서 전 단계에서 새로 만든 정책의 이름을 입력하고 정책 이름 옆에 있는 체크 박스를 클릭하십시오.
  6. Next: Tags,를 선택하십시오. 정책에 태그를 지정할 수 있지만 지금은 필요하지 않습니다.
  7. Next: Review 를 선택하십시오.
  8. 역할을 찾기 쉽게 이름을 입력하고 Create role을 선택하십시오.

 

PowerShell 스크립트 구성 예약 작업

  1. 관리자로 AppStream 2.0 이미지 빌더에 연결하십시오.
  2. 더욱 쉬운 구성을 위해 이미지 빌더의 루트 드라이브에 PowerShell 스크립트를 위한 폴더를 만드십시오.
  3. 텍스트 편집기를 열고 다음 스크립트를 복사하여 <Name of S3 Bucket>과 <S3 Region> 을 바꾼 뒤 이전에 만든 폴더에 저장하십시오.
  • PowerShell 스크립트는 인스턴스에서 활성 사용자 세션을 기다리는 동안 실행됩니다. 사용자가 연결되면 스크립트는 사용자의 context에서 다양한 변수를 읽고 S3 키 이름을 찾아냅니다. Window 이벤트 로그는 시스템 시작 마지막 런타임 중 최근 날짜부터 읽습니다. 모든 이벤트가 업로드된 후에는, 스크립트는 변수 $PollingInterval 에 의해 정의된 시간 후 비활성화 상태가 됩니다. 그리고 나서, $LastRun 타임 스탬프 후에 Window 이벤트 로그를 확인하기 위해 loops back 됩니다.

 

PowerShell script

#Define which logs and event types are shipped how often

$S3Bucket = “<s3-bucket-name>” #Replace with the S3 bucket created for storing logs.

$bucketRegion = “<S3 Region>” #Replace with the S3 bucket region.

$eventLogs = @(“application”,”system”) #Define which Windows Event logs are shipped in a comma-separated list

$EventTypes = @(“error”,”warning”) #Define which event types are shipped in a comma-separated list

$PollingInterval = 60 #Time to wait between checking for new Windows Event log events in seconds

#Add PS drive for HKEY_USERS to access the user-context environment variables

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

#While loop to run while the instance is up

while ($true){

#Check if user is connected, else sleep

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

    #Get logged in username

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

    #Set up filter string for getting logged-in user SID

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

    #Get logged-in user SID

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

    #Check if AppStream_UserName environment variable is set yet

    if ((get-ItemProperty -Path HKU:\$ActiveUserSID\Environment -Name AppStream_UserName -ErrorAction SilentlyContinue)){

        #Set variable to be used in the S3 key name from the registry value

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

        #Determine what the last log event collected should be, either from startup, or from the last run.

        $windowsStart = (Get-WinEvent -FilterHashtable @{Logname=’System’;ID=12;ProviderName=’Microsoft-Windows-Kernel-General’} | Select-Object -first 1).TimeCreated

        if ($LastRun) {

            if ($LastRun -gt $windowsStart) {$LogDate = $LastRun} else {$LogDate = $windowsStart}

        } else {

            $LogDate = $windowsStart

        }

        #Write current time as the last-run value for the next run

        $LastRun = get-date

        #Process logs

        foreach ($logName in $eventLogs) {

            $events = Get-Eventlog -LogName $logName -EntryType $EventTypes -After ($LogDate)

            foreach ($event in $events) {

                $KeyName = $AppStream_UserName + “/” + $logName + “/” + $event.EntryType + “/” + $event.TimeGenerated.ToString(“dd-MM-yyyy HH:MM:ss”) + “-EventID-” + $event.EventID + “.JSON”

                $LogJSON = $event | ConvertTo-Json

                Write-S3Object -BucketName $S3Bucket -Key $KeyName -Content $LogJSON -Region $bucketRegion -ProfileName appstream_machine_role

            }

        }

    }

}

#Wait time between upload cycles in seconds

Start-Sleep -Seconds $PollingInterval

}

 

  1. 시스템 시작 시 PowerShell 스크립트를 실행하기 위한 예약 작업을 추가하려면, admin 명령어 프롬프트를 열고 다음의 명령어를 입력하십시오.  <TaskName> 와 이전 단계에서 만든 PowerShell 스크립트의 전체 경로에 있던 <Full-path-to-ps1-file>을 교체하십시오.

 

AppStream 2.0에서 사용자지정 이미지, 집합 그리고 stack 생성

  1. PowerShell 스크립트에서 작업 스케줄을 구성한 후 이미지 빌더에서 이미지 assistant를 통해 사용자 지정 이미지를 생성하십시오. 자세한 내용은 다음 링크를 확인하십시오. (Tutorial: Create a Custom AppStream 2.0 Image by Using the AppStream 2.0 Console)
  2. 사용자 지정 이미지가 사용 가능할 때, stack과 집합을 생성하십시오. 집합을 만드는 동안에 마지막 단계에서 사용자지정 이미지를 선택하십시오. 이때 집합이 인터넷 또는 적절한 VPC endpoint에서 액세스가 가능한지 확인하십시오. 그리고 1단계에서 생성한 IAM 역할을 집합에 할당하십시오. 자세한 내용은 다음 링크를 확인하십시오. ( Tutorial: Create an AppStream 2.0 Fleet and Stack)
  3. 마지막으로, 새로 생성된 stack에서 애플리케이션을 테스트하십시오. 사용자가 집합 인스턴트에 연결할 때 스크립트는 사용자 이름으로 구성된 로그를 업로드 하기 시작합니다.

 

Log 예제

 

삭제 처리

이후에 청구되는 것을 방지하기 위해 S3 버킷에서 사용되지 않은 AppStream 2.0 리소스와 불필요한 이벤트를 중지하고 삭제하십시오.

 

 

결론

오늘은 저장소(storage), 문제해결, 그리고 분석을 위해 Windows 이벤트 로그를 AppStream 2.0 스트리밍 인스턴트에서 S3로 push 하는 방법에 대하여 다루어 보았습니다. 심화 학습을 원하신다면 ‘Amazon Athena를 사용한 S3에서 데이터를 분석하는 방법’에 대한 블로그 글을 확인해 보시기 바랍니다.

 

 


원문 URL: https://aws.amazon.com/ko/blogs/desktop-and-application-streaming/storing-appstream-2-0-windows-event-logs-with-iam-roles-and-windows-task-scheduler/

 

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