BLOG
Amazon AppStream 2.0을 사용하면 이미지 빌더의 실행 파일을 통해 제공되는 Image Assistant CLI (명령 줄 인터페이스) 작업을 사용하여 프로그래밍 방식으로 이미지를 생성할 수 있습니다.
CLI를 사용하면 사용자가 기동 가능한 애플리케이션, 애플리케이션 실행 가속화를 최적 할 필요가 있는 파일 및 그 외 이미지 세부 정보를 지정할 수 있습니다.
또한 CLI를 사용하면 이미지 빌더에 연결하지 않고도 이미지를 작성할 수 있습니다. 그리고 AppStream 2.0을 CI / CD (Continuous Integration / Continuous Deployment) 프로세스와 통합하여 각 소프트웨어의 빌드마다 이미지를 자동으로 생성 할 수 있습니다.
Image Assistant CLI 작업에 대한 자세한 내용은 AppStream 2.0 설명서의 ‘Image Assistant CLI 조작을 사용하여 프로그래밍 방식으로 AppStream 2.0 이미지 만들기’를 참고해 주시기 바랍니다.
파헤쳐 보기
오늘 블로그에선 높은 수준에서 다음의 단계들을 설명해 드릴 예정입니다.
- 원격 명령을 수락하기 위한 이미지 빌더의 준비
- DescribeImageBuilders API를 원격으로 제어하기 위해 사용되는 관리 서버로 Microsoft Windows EC2의 인스턴스 구성
- Notepad ++가 설치된 이미지를 프로그래밍 방식으로 만들기
- 이미지가 정상적으로 작동하는지 확인
전제 조건
사전에 다음과 같은 리소스가 필요합니다.
- 실행 상태의 AppStream 2.0 이미지 빌더.
- DescribeImageBuilders API 에 대한 권한이 있는 IAM 역할이 첨부된 이미지 빌더와 동일한 서브넷 내에 있는 Microsoft Windows EC2 인스턴스 .
- Notepad ++. Exe로 이름이 변경된 Notepad ++ 인스톨러를 포함한 S3 버킷
1 단계 : 원격 명령 수락을 위한 이미지 빌더 준비
시작하기 위해서는 대상으로 하는 이미지 빌더에서 수행해야 하는 몇 가지 단계가 있습니다. 첫 번째는 명령을 원격으로 연결하고 실행하는 데 사용할 로컬 관리자를 만드는 것입니다. 이미지 빌더가 Active Directory 도메인에 가입된 경우, 그룹 정책 또는 Active Directory 그룹 멤버십을 사용하여 이미지 빌더에 대한 관리자 권한이 제공된 도메인 계정을 대신 사용할 수 있습니다.
로컬 관리자 계정을 만들기 위해서는
- 이미지 빌더 인스턴스에 연결하십시오.
- 시작을 선택하고 compmgmt.msc를 입력 한 다음 Enter 키를 누릅니다.
- 로컬 사용자 및 그룹을 펼치십시오.
- 사용자 폴더에서 컨텍스트 (오른쪽 클릭) 메뉴를 열고 새 사용자를 선택하십시오.
- 사용자명과 비밀번호 정보를 입력하고, 확인을 눌러 사용자를 만듭니다. 이 예시에서는 ImageAdmin을 사용자 이름으로 만들었습니다.
- 이제 그룹 폴더를 열고 관리자를 여십시오.
- 관리자 특성 창에서 추가를 선택하고 방금 작성한 사용자 이름을 입력하십시오. 확인을 두 번 선택하십시오.
그런 다음 PowerShell 원격 기능이 활성화되어 있는지 확인해 주세요. 이 게시 글에서는 동일한 서브넷을 대상으로 하는 EC2 인스턴스와 이미지 빌더가 있으므로 변경할 필요가 없습니다. PowerShell 원격에 대한 자세한 내용은 원격 요구 사항 정보를 참조하십시오.
2 단계 : 이미지 빌더를 원격으로 제어하기 위한 Microsoft Windows EC2 관리 서버 구성
EC2 관리 서버는 애플리케이션을 원격으로 설치하기 위한 정보로 구성되어야 하며 Image Assistant API를 사용하여 이미지에 대해 애플리케이션을 지정해야 합니다. 이를 구성하려면 자동으로 또는 상호 작용 없이 설치할 수 있는 응용 프로그램이 필요합니다. 이 예시에서는 Notepad ++을 사용하였습니다.
다음으로 파일 탐색기를 열고 C 드라이브를 찾으십시오. C 드라이브의 루트에서 다음 폴더 구조를 작성하십시오.
C:\Source\Software\Notepad++
Notepad ++ 폴더에서 manifest.txt라는 파일을 만들고 다음 행을 그 안에 넣습니다. 이 파일은 애플리케이션 기동 파일을 최적화 하여 기동 시간을 단축 시키기 위해 사용됩니다. 이것은 Notepad++의 전체 목록이 아니라 파일 형식을 지정하는 방법에 대한 예입니다. 애플리케이션 기동의 최적화에 대한 자세한 내용은 AppStream 2.0 설명서의 Image Assistant CLI Operations을 사용한 애플리케이션 기동 성능의 최적화 섹션을 참고하십시오.
C:\Program Files (x86)\Notepad++\notepad++.exe
C:\Windows\SYSTEM32\ntdll.dll
C:\Windows\SYSTEM32\wow64.dll
C:\Windows\system32\wow64cpu.dll
C:\Windows\system32\wow64win.dll
그런 다음 C:\Source named ApplicationList.csv.라는 CSV 파일을 만듭니다. 이 파일은 이미지 빌더에서 실행될 애플리케이션 설치 세부 사항 및 Image Assistant API의 애플리케이션 메타 데이터를 지정합니다.
CSV 필드는 Image Assistant 그래픽 사용자 인터페이스 및 Image Assistant API에 표시되는 필드와 일치합니다. CSV에는 열 이름이 있는 첫 번째 행과 응용 프로그램 메타데이터가 있는 후속 행이 있어야 합니다. 이 예시에서 CSV에는 다음이 포함됩니다.
Name,DisplayName,LaunchPath,WorkingDir,IconPath,LaunchParameters,ManifestPath,InstallerPath
Notepad++,Notepad++,’C:\Program Files (x86)\Notepad++\Notepad++.exe’,,,,
C:\Source\Software\Notepad++\manifest.txt,C:\Source\Software\Notepad++\Notepad++.exe
마지막으로 C:\Source에서 Create-Image.ps1이라는 새 Powershell 파일을 만들고 다음 코드를 붙여 넣습니다. 이 스크립트에는 두 가지 필수 매개 변수가 있습니다.
- SourceFile – 이전에 생성 된 CSV 파일을 가리켜야 합니다.
- ComputerName – 대상으로 삼고 있는 이미지 빌더의 이름입니다.
세 번째 선택적 매개 변수인 S3Bucket을 제공 할 수 있습니다. 지정된 경우 스크립트는 제공된 S3 버킷에서 이미지 빌더로 소프트웨어를 다운로드합니다. 그런 다음 .csv 파일에 제공된 매개 변수를 기반으로 소프트웨어를 자동으로 설치하고 Image Assistant에 추가합니다.
스크립트가 CSV 파일의 각 행을 처리하면 원격 이미지 빌더에서 이미지 작성을 시작하여 다음 이름 형식으로 이미지를 작성합니다. <Image Builder Name> -MMDDYYYY-mm
스크립트는 다음과 같습니다.
# AppStream 2.0 Remote Programmatic Image Creation Script
param(
[Parameter(Mandatory = $true,
HelpMessage = “Full path to CSV file EG: c:\source\ApplicationList.csv”)]
[string]$SourceFile,
[Parameter(Mandatory = $true,
ValueFromPipeline = $True,
HelpMessage = “Image Builder Name”)]
[string[]]$ComputerName,
[Parameter(HelpMessage = “S3 Bucket that Installers are stored in. This is case sensitive.”)]
[string]$s3bucket
)
$CSV = Import-Csv -Delimiter “,” -Path $SourceFile
$exePath = “C:\Program Files\Amazon\Photon\ConsoleImageBuilder”
$credential = Get-Credential
foreach ($Computer in $ComputerName) {
$IBQuery = Get-APSImageBuilderList -name $Computer -region us-west-2
$IBIP = $IBQuery.NetworkAccessConfiguration.EniPrivateIpAddress
$session = New-PSSession -ComputerName $IBIP -Credential $credential
foreach ($App in $CSV) {
#AppStream’s Image Assistant Required Parameters
$AppName = $App.Name
$Params = ” –name ” + $AppName + ” –-absolute-app-path ” + $App.LaunchPath
#AppStream’s Image Assistant Optional Parameters
if ($App.DisplayName) { $Params += “ –display-name ” + $App.DisplayName }
if ($App.WorkingDir) { $Params += ” –working-directory ” + $App.WorkingDir }
if ($App.IconPath) { $Params += ” –absolute-icon-path ” + $App.IconPath }
if ($App.LaunchParameters) { $Params += ” –launch-parameters ” + $App.LaunchParameters }
if ($App.ManifestPath) { $Params += ” –absolute-manifest-path ” + $App.ManifestPath }
#Download and Install applicatoin to Image Builder
if ($App.InstallerPath) {
$InstallerPath = $App.InstallerPath
$exeName = Split-Path -Path $InstallerPath -Leaf
$exeFolder = Split-Path -Path $InstallerPath
if ($s3bucket) {
$s3presigned = “Get-S3PresignedURL -BucketName ” + $s3bucket + ” -Key ” + $exeName + ” -Expires (Get-Date).AddDays(30)”
$s3url = Invoke-Expression $s3presigned
Invoke-Command -Session $session -ScriptBlock {
New-Item -ItemType “directory” -Path $using:exeFolder -Force | Out-Null
Write-Host “Downloading $using:exeName to $using:exeFolder”
Invoke-WebRequest -Uri $using:s3url -OutFile $using:InstallerPath
Write-Host “Installing $using:AppName…”
Start-Process -FilePath $using:InstallerPath -ArgumentList ‘/S’ -Wait
}
}
}
#Use AppStream’s Image Assistant API to add applications
Invoke-Command -Session $session -ScriptBlock {
Set-Location $using:exePath
$AddAppCMD = ‘.\image-assistant.exe add-application ‘ + $using:Params
$AddApp = Invoke-Expression $AddAppCMD | ConvertFrom-Json
if ($AddApp.status -eq 0) {
Write-Host “Added $using:AppName”
} else {
Write-Host “ERROR adding $using:AppName”
Write-Host $AddApp.message
}
}
}
#Use AppStream’s Image Assistant API to create image
Invoke-Command -Session $session -ScriptBlock {
Set-Location $using:exePath
$IBName = (get-item env:AppStream_Resource_Name).Value
$ImageName = “$IBName-” + “$(Get-Date -Format “MMddyyyy-mm”)”
$CreateCMD = ‘.\image-assistant.exe create-image –name ‘ + $ImageName
$Create = Invoke-Expression $CreateCMD | ConvertFrom-Json
if ($Create.status –eq 0) {
Write-Host “Successfully started creating image $ImageName“
} else {
Write-Host “ERROR creating Image $ImageName”
Write-Host “$Create.message”
}
}
Remove-PSSession $session
}
3 단계 : Notepad++를 포함한 이미지를 프로그래밍 방식으로 만들기
이제 모든 준비가 완료되었으므로 스크립트를 실행할 수 있습니다. EC2 관리 서버에서 PowerShell을 시작하고 작업 디렉토리를 C:\Source로 변경한 후 다음을 입력하십시오.
.\Create-Image.ps1 -SourceFile C:\Source\ApplicationList.csv -ComputerName <Image Builder name> -s3bucket <S3 Bucket Name>
PowerShell 스크립트를 실행하면 자격 정보 창이 나타납니다. 이미지 빌더에 대한 관리자 권한이 있는 계정의 사용자 이름 및 비밀번호를 입력하십시오.
먼저, 스크립트는 Notepad ++를 대상 이미지 빌더로 복사한 다음 자동으로 설치됩니다. 다음으로 Notepad++는 Image Assistant CLI 조작을 통해 원격으로 Image Assistant에 추가된 다음 이름을 사용하여 이미지 작성을 시작합니다. 스크립트를 성공적으로 실행하면 다음과 같은 결과가 나타납니다.
4 단계 : 이미지 정상 작동 확인
제대로 작동하는지 확인 확인하려면 AppStream 2.0 콘솔을 시작하고 이미지 빌더가 실행 중인 AWS 영역으로 이동한 다음 이미지를 선택하십시오. 보류 중인 상태의 이미지와 스냅샷 상태의 이미지 빌더를 찾을 수 있습니다. 이미지가 사용 가능한 상태에 도달하면 적용하여 애플리케이션을 시작할 수 있습니다.
결론
AppStream 2.0을 위한 새로운 Image Assistant CLI 작업을 통해 애플리케이션 및 보안 업데이트 자동화에 대한 제어 기능이 향상되었습니다. 이 게시 글에서는 Image Assistant CLI 작업을 사용하여 하나의 중앙 위치에서 AppStream 2.0 이미지 빌더를 업데이트 할 수 있는 한 가지 방법을 확인했습니다.
** 메가존 클라우드 TechBlog는 AWS BLOG 영문 게재 글 중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역 및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.