AppStream 2.0 から S3 のバケットを使う方法
はじめに
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 Purpose
のstream.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 にはなりますが) ので、機会があればお試しください。