AppStream 2.0 から S3 のバケットを使う方法

AppStream 2.0 フリートインスタンスに IAM ロールを適用して CLI で S3 にアクセスしたぞ
2019.10.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

AppStream 2.0 から S3 のバケットを使う方法を検証してみました。複数ユーザーの共有置き場のイメージです。

AppStream 2.0 の基本的な使い方については Amazon AppStream2.0を使ってみた の記事が参考になります。先に目を通していただくと本記事の理解が早いかと思います。

検証の背景

AppStream 2.0 で動かしたインスタンス内で認証情報を確認すると、自分の AWS アカウントではない情報になっています。 下記はフリートインスタンス内での実行例です。

PS C:\Windows\system32> aws sts get-caller-identity
{
    "UserId": "xxxxxxxxx:i-yyyyyyyyy",
    "Account": "zzzzzzzzzz",
    "Arn": "arn:aws:sts::zzzzzzzzzz:assumed-role/PhotonInstance/i-yyyyyyyyy"
}

このインスタンス内から自分の AWS アカウント上に用意した S3 バケットにアクセスしたい場合、同じく自分の AWS アカウントで用意した IAM の認証情報を使う必要があります。IAM ユーザーのアクセスキーとシークレットアクセスキーを用意して設定する方法でもアクセスできますが、この方法にはたえずキーの漏洩の心配がつきまといます。

そこで IAM ロールが使えるといいのだが・・・と思っていたら、とっくに使えるようになっていました。 (2019年9月9日リリース)

使用方法と注意事項は下記のドキュメントに記載があります。併せてお読みください。

Amazon AppStream 2.0 において Image Builder とフリートに対する AWS Identity and Access Management ロールのサポートが有効に

IAM ロールを使用して、AppStream 2.0 ストリーミングインスタンスで実行されるアプリケーションとスクリプトにアクセス許可を付与する

環境準備

ざっくりこんな流れです。

[準備手順1] 共有用の S3 バケットを作る

バケットを用意します。 ここではバケット名を mytest-appstream-share-s3 としました。(本記事公開時点では削除済みです)

[準備手順2] S3 アクセス用のロールを作る

ロールを用意します。 ここではロール名を test_appstream_role とし、以下のポリシーを設定しました。 お試しのため [準備手順1] のバケットに対してフルアクセス可能としましたが、必要に応じて権限を絞るとよいと思います。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutAccountPublicAccessBlock",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAllMyBuckets",
                "s3:ListJobs",
                "s3:CreateJob",
                "s3:HeadBucket"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::mytest-appstream-share-s3",
                "arn:aws:s3:::mytest-appstream-share-s3/*"
            ]
        }
    ]
}

また、信頼関係は下図のようにし、 appstream.amazonaws.com について AssumeRole を可能にしておきます。

[準備手順3] イメージを作成する

イメージを用意します。

ベースとなるイメージを選んでインスタンスを起動し、ブラウザで接続するとインスタンス内の操作ができます。

OS のベースは以下の 3 種類となります。(2019 年10 月現在)

  • Microsoft Windows Server 2012 R2
  • Microsoft Windows Server 2016 Base
  • Microsoft Windows Server 2019 Base

今回は AppStream-WinServer2019-09-18-2019 のイメージを使用しました。 Running になったら Administrator で接続します。(必要に応じて追加アプリケーションをブラウザでインストールします)

アプリケーションの準備が終わったら、デスクトップにある Image Assistant を起動し、公開するアプリケーションのパスを追加していきます。

ここでは PowerShell を指定しています。(後でフリートインスタンスで CLI を実行するため)

注: Cyberduck のアイコンがあるのは、途中まで試してみたもののうまくいかず断念したせいです。 Cyberduck 自体は STS に対応 (credential にプロファイルを記述) していますので、気になる方は CyberduckがAWS STSとAWS認証情報ファイルに対応/IAM RoleでS3の利用が可能になりました の記事を参考になさってみてください。

ウィザードに従い "6. REVIEW" のタブまで進み、[Disconnect and Create Image] ボタンを押して終了です。 今回の場合、イメージ作成には 20 分ほどかかりました。

[準備手順4] フリートを作成する

フリートを用意します。

パラメータは以下のようにしました。

  • イメージ → [準備手順3] で作成したイメージ
  • Fleet タイプ → On-Demand
  • インスタンスタイプ → General Purposestream.standard.medium
  • Minimum capacity, Maximum capacity → 2 (今回は 2 ユーザから同時に接続できるよう)
  • IAM ロール → [準備手順2] で作成したロール test_appstream_role

フリートが起動完了して Running になるまでに 10 分ほどかかります。

[準備手順5] スタックを作成する

スタックを用意します。

[準備手順4] で作成したフリートを指定すれば OK です。

[準備手順6] ユーザーを作成する (hoge, fuga)

ユーザーを用意します。

メールアドレスと氏名を入れてユーザーを作成し、[準備手順5] で作成したスタックを指定すれば OK です。

別途、ユーザー宛に届いたメールに記載されているログインリンクをブラウザで開きます。

メールアドレスと仮パスワードでログインし、パスワード変更をするとアプリケーションにアクセスできるようになります。

フリートに接続して S3 にアクセスする (CLI)

下図は、ユーザー hoge と fuga でそれぞれログインし、PowerShell でそれぞれ aws sts get-caller-identity してみた結果です。

先述の通り、自分のものでない AWS アカウント (AppStream 2.0 用の AWS 側のなにか) と、ユーザーごとに異なるインスタンス ID が表示されます。

[準備手順1] で作成したバケット mytest-appstream-share-s3 に、[準備手順2] で作成したロール test_appstream_role の権限で CLI アクセスするには、オプション --profile appstream_machine_role を使用します。このプロファイルはフリート作成時に自動で作られています。

PS C:\Windows\system32> type C:\Users\PhotonUser\.aws\config

[profile appstream_machine_role]
credential_process = "C:\Program Files\Amazon\Photon\PhotonRoleCredentialProvider\PhotonRoleCredentialProvider.exe" --role=Machine

このプロファイルを指定して aws s3 ls s3://mytest-appstream-share-s3 --profile appstream_machine_role を実行したところ、正常にバケットアクセスできました。あらかじめバケット mytest-appstream-share-s3 下にひっそり作成しておいた s3_share_test/ というキー名が参照できています。

おわりに

今回は S3 で試しましたが、ロールで許可すれば S3 だけでなく各種リソースにアクセスできるようになります (CLI にはなりますが) ので、機会があればお試しください。