Amazon AppStream 2.0のイメージをコマンドラインから作成する

Amazon AppStream 2.0 のイメージビルダーには Image Assistant CLI(image-assistant.exe)というプログラムがインストールされています。 このプログラムを使用し、コマンドラインからカスタムイメージを作成する方法を紹介します。

前提

イメージビルダーは、2019 年 7 月 26 日以降にリリースされたバージョンの AppStream 2.0 エージェントを使用する必要があります。

やってみた

次の手順でイメージを作成します。

  1. イメージビルダーを起動
  2. イメージビルダーに必要なアプリケーションをインストール
  3. アプリケーションのメタデータを登録
  4. イメージを作成
  5. フリートにイメージを紐付け
  6. アプリケーションの動作確認

インストールするアプリケーションには SSH クライアントの PuTTY を利用します。

また、イメージビルダー内のコマンドライン操作には PowerShell を利用します。

1. イメージビルダーを起動

イメージビルダーを起動し、インスタンスに Connect し、Administrator でログインします。

2. イメージビルダーに必要なアプリケーションをインストール

PuTTY をダウンロードします。

PS C:\Users\ImageBuilderAdmin> Invoke-WebRequest `
  -Uri https://the.earth.li/~sgtatham/putty/latest/w64/putty-64bit-0.72-installer.msi `
  -OutFile putty-64bit-0.72-installer.msi

インストールを実行します。

PS C:\Users\ImageBuilderAdmin> msiexec /i putty-64bit-0.72-installer.msi `
  /passive /l*v install-putty-64bit-0.72-installer.msi.log

PS C:\Users\ImageBuilderAdmin> dir 'C:\Program Files\PuTTY\'


    Directory: C:\Program Files\PuTTY


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        7/14/2019   8:59 AM           1471 LICENCE
-a----        7/14/2019   9:01 AM         327552 pageant.exe
-a----        7/14/2019   9:01 AM         680856 plink.exe
-a----        7/14/2019   9:01 AM         688504 pscp.exe
-a----        7/14/2019   9:01 AM         704392 psftp.exe
-a----        7/14/2019   8:59 AM         295163 putty.chm
-a----        7/14/2019   9:01 AM         886144 putty.exe
-a----        7/14/2019   9:01 AM         404864 puttygen.exe
-a----        7/14/2019   8:58 AM           1573 README.txt
-a----        7/14/2019   8:58 AM            104 website.url

PuTTY は C:\Program Files\PuTTY\ 以下にインストールされています。

3. アプリケーションのメタデータを登録

add-application API でアプリケーションを登録します。

# アプリケーションを登録
PS C:\Users\ImageBuilderAdmin> image-assistant add-application `
  --display-name PuTTY `
  --name PuTTY-0.72 `
  --absolute-app-path "C:\Program Files\PuTTY\putty.exe" `
  --working-directory "C:\Program Files\PuTTY"
{
  "status": 0,
  "message": "Success"
}
# 登録済みアプリケーション一覧を確認
PS C:\Users\ImageBuilderAdmin> image-assistant list-applications
{
  "status": 0,
  "message": "Success",
  "applications": [
    {
      "Name": "PuTTY-0.72",
      "AbsoluteAppPath": "C:\\Program Files\\PuTTY\\putty.exe",
      "DisplayName": "PuTTY",
      "AbsoluteIconPath": "C:\\ProgramData\\Amazon\\Photon\\AppCatalogHelper\\AppIcons\\3de069ab-6079-4399-af8f-745920ff9a48.png",
      "WorkingDirectory": "C:\\Program Files\\PuTTY",
      "AbsoluteManifestPath": "C:\\ProgramData\\Amazon\\Photon\\AppCatalogHelper\\AppManifests\\9d3bfe1f-89bf-47d0-9267-42c0ae93b146.txt"
    }
  ]
}

--display-name はユーザーが起動アプリケーションを選択するときに利用され、--nameはイメージビルダー内のアプリケーション管理に利用されます。 そのため、--display-name は汎用的な名前にし、--name にはバージョンも含めた名前にすると管理しやすいでしょう。

4. イメージを作成

create-image API でイメージを作成します。

PS C:\Users\ImageBuilderAdmin> image-assistant create-image `
  --name CLI20191001 `
  --description "CLI Image Created At 20191001" `
  --use-latest-agent-version
{
  "status": 0,
  "message": "Success"
}

イメージ名はリージョン内でユニークである必要があります。 --nameにはイメージ作成日時を含めた名前にすると管理しやすいでしょう。

このコマンドを実行すると、イメージビルダーインスタンスはステータスが RUNNNING から SNAPSHOTTING に遷移し、ユーザーはログアウトします。 イメージビルダーのステータスは、最終的には STOPPED になります。

同時に、作成命令を行ったイメージが Image Registry にPENDINGで作成されているのを確認できます。

このステータスが AVAILABLE になると、利用可能です。

残念ながら、ステート遷移時にイベントは発火されないようです。

5. フリートにイメージを紐付け

最後に作成したイメージをフリートに紐付けます。

コンソールのフリート編集画面からイメージを選択することもできますし、以下のように update-fleet API で更新することも可能です。

# フリートに紐付いたイメージを確認
$ aws appstream describe-fleets --name CLI
{
    "Fleets": [
        {
            "Arn": "arn:aws:appstream:eu-central-1:123456789012:fleet/CLI",
            "Name": "CLI",
            "DisplayName": "CLI",
            "Description": "CLI Fleet",
            "ImageName": "CLI20190908",
            "ImageArn": "arn:aws:appstream:eu-central-1:123456789012:image/CLI20190908",
            ...
        }
    ]
}
# フリートのイメージを「CLI20191001」に変更
$ aws appstream update-fleet \
  --name CLI \
  --image-name CLI20191001
{
    "Fleet": {
        "Arn": "arn:aws:appstream:eu-central-1:123456789012:fleet/CLI",
        "Name": "CLI",
        "DisplayName": "CLI",
        "Description": "LI Fleeta",
        "ImageName": "CLI20191001",
        "ImageArn": "arn:aws:appstream:eu-central-1:123456789012:image/CLI20191001",
        ...

6.アプリケーションの動作確認

ストリームにアクセスすると、追加したアプリケーション PuTTY が利用可能になっています。

改善ポイント

今回はイメージを作成するミニマムな手順のみをお伝えしたため、いくつかの改善ポイントを紹介します。

設定をカスタマイズ

イメージ作成時に、アプリケーションや Windows の設定を行ったり、アプリケーションの起動パフォーマンスを最適化することも可能です。 詳細は、次のドキュメントを参照ください。

デフォルトのアプリケーションおよび Windows 設定とアプリケーション起動パフォーマンス - Amazon AppStream 2.0

リモートサーバーからイメージ作成

今回はイメージ作成作業をイメージビルダー内から行いました。

イメージビルダーをリモートから管理し、リモートからコマンドを実行することも可能です。 詳細は、次のドキュメントを参照ください。

Creating an image programmatically with AppStream 2.0 Image Assistant CLI operations | Desktop and Application Streaming

最後に

Image Assistant CLI を利用して、コマンドラインから AppStream 2.0 のイメージを作成する方法を紹介しました。

イメージ作成手順をスクリプト化すると、再現性の確保や情報の共有が容易になるほか、アプリケーションの更新作業のように、同じ操作を定期的に繰り返すケースで有効活用できます。

今後、SSM 経由で外部からイメージビルダーにコマンドを投入できたり、イメージ作成完了時にイベント通知されるようになると、イメージ作成パイプラインをより構築しやすくなると思います。

参考