Amazon Appstream2.0のLinuxインスタンスを設定してみた。

### Amazon AppStream2.0とは
Amazon AppStream2.0は、サーバー上で動かすアプリケーションの画面をインターネットを通じてユーザーのブラウザーに動画配信するサービスです。デスクトップ仮想化のように利用することができます。アプリケーションの実行はAWS内（AppStreamサーバー上）で実行されるため、データそのものはインターネットの外には出ていかずセキュアに利用できます。また使用した分だけ課金される仕組みです。

### 料金
公式サイトで確認できます。

https://aws.amazon.com/jp/appstream2/pricing/

AppStreamのフリートインスタンスの種類とOS、月間の利用時間により料金が決まります。
Windowsサーバーの場合、1回でも接続するとRDPライセンス（4.19USD/month、シングルセッションの場合）が必要となりますので、ちょっと自宅でためそうにも少しハードルが高いです。

ここではLinuxインスタンス（RDPライセンス料がかかりません）を使用して動作を確認しようと思います。

### アーキテクチャ図
今回予定している構成図です。以前作成したPrivateSubnet1と2にAppStream Fleetを配置します。
IAM Identity Centerをうっすらと表示させている理由は、Amazon Linux 2のストリーミングができたら、接続を試す予定があるためです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/e5701966-c2f4-ba6b-bdaf-4d441b7ae8ff.png)

### ImageBuilderでイメージを作成
まずはイメージを作成していきます。

マネジメントコンソール > AppStream2.0 > Images と開き、「Image Builder」タブを開きます。
まだ何も作成されていません。「Launch Image Builder」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/6454b4da-f191-294d-3403-fc6946439397.png)

「Choose an Image」で、AmazonLinux2ベースのイメージを選択します。
投稿時点では2023.11.13のものが最新のようでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/6ecb6150-35a7-7cb7-a6ac-985fcc3c1ba2.png)

「Configure Image Builder」で、ImageBuilderの名前設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/9badfd0b-2b8d-8161-7fd1-fe09b173e960.png)

インスタンスタイプを選択します。一番コストが安い stream.standard.small(1vCPU、2GiB RAM)のTypeを選択しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/e20be328-7e58-2c6d-6ef2-a6690701c0e8.png)

IAM Roleは、ImageBuilderからS3などの他のサービスを利用する場合に設定します。今回利用予定はないため、設定しません。

VPC Endpointsは、VPC内のリソースと通信させる場合に設定します。こちらも利用予定はないため、設定しません。

次に、ネットワークの設定をします。予定していたPrivateSubnet1に配置します。
セキュリティグループも設定します。通信要件がないため、インバウンドは何も許可せず、アウトバンドのみALL許可にしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/e9b63b43-1a33-229d-157d-2eecca21c3a7.png)

「Review and Create」で作成内容をレビューして問題なければ、「Launch Image Builder」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/fc4f5d2e-6ac7-ed07-b945-cbdcb2fab000.png)

ImageBuilderの作成が開始されました。ステータスがRunningにかわるまで、5分ほど待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/e06a084e-d09a-958a-e094-e919fea23616.png)

ステータスがRunnningに変わりました。作成したImage Builderが選択された状態で、「Connect」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/9c754359-59aa-183f-9532-d451ad98ec8b.png)

Image Builderに接続されました。ここからアプリを登録していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/660a53f4-59bf-caf0-92b2-5dad88aec5e7.png)

左上「Applicatons」 > 左の９面すごろくみたいなマークから、「Image Assistant」を起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/328cb581-bf94-d8e3-4ffa-466734722826.png)

Image Assistantが起動します。「＋　Add App」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/dfea3764-d37a-cfeb-179b-b0c538293506.png)

適当にアプリを選択します。テキストエディターがあったので、それを選択してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/4c772228-c2fc-c1bc-c05d-2fb233c6e11c.png)

アプリが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/a95b4e6c-2db2-64e8-017f-1baf164731f5.png)

２個ほど登録して、「Next」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/d481e136-5513-5df2-d909-f0a86966066e.png)

そのまま「Next」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/71bd78a2-0858-51d4-e81e-cfe28f759c12.png)

こちらもそのまま「Next」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/bad408bf-1906-37d8-a909-c72c19b15972.png)

「Launch」をクリックします。アプリ起動を最適化してくれるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/5f67daef-2578-6f1d-3a7d-1b5459631be0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/0a4b23f7-4a77-508d-e969-e298d26a51e0.png)

アプリが起動したことを確認して、「Continue」をクリックします。
登録したアプリの数だけ繰り返します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/edb51af3-de7b-b533-a561-51e2f1789e5b.png)

作成するフリートイメージの名前を入力して、「Next」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/1d6e00b7-7212-4833-42a6-510e3e907d26.png)

「Disconnect and Create Image」をクリックして、イメージ作成を開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/1532f29b-eca1-f76c-949f-0ccefc1bc104.png)

Image Builderへのコネクションが失われます。タブは閉じてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/dbc013db-5ca7-40f8-69e6-61d14677ec9b.png)

「Image Builder」タブに戻ると、ステータスが「Snapshotting」となっています。
10分〜20分はかかる場合があります。気長に待ちましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/915b65f6-9c1e-7808-ceee-20ca293467fb.png)

ステータスが「Stopped」に変わったので、「Image Registory」タブを表示します。
イメージが作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/0a7f898d-83e3-88b4-a99a-cf1013790a0d.png)

詳細ページで「Applications」を確認すると、登録したアプリが一覧に表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/75570198-ff0f-61d8-fb49-7a8759d12154.png)

これでイメージの準備はできました。


### フリート起動
次に作成したイメージを使って、フリートを起動します。
AppStream2.0 > Fleetsへ移動します。
「Create Fleet」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/3fb587e5-b7a0-846b-1a53-cf0eb7e3c8f9.png)

一番コストのかからない「On-Demand」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/50332553-6ccd-1618-dd9a-6fb39f0763a1.png)

「Configure Fleet」の画面で、フリートの名前を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/5efd93af-7a40-835c-cc76-b946d3d96e87.png)

インスタンスタイプは、Image Builder同様に一番安いタイプにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/44054ee4-5675-d60c-b27c-087ebec48b16.png)

ユーザーセッションの詳細はデフォルトのままにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/eb23a869-0205-8dd4-f3c4-f727fae3af94.png)

フリートキャパシティについては、兎に角コストがかかるといやなので、Maximam capacityを1にしました。これで2以上のセッションが接続されることはなくなります。（実際の運用でこんな設定をすることはないと思います。。。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/696aa80f-29e9-ec2c-9786-217a7e2c18fc.png)

その他、デフォルトのままにして、「Next」をクリックします。
※今回フリートから他のAWSサービスの利用はないので、IAM rolesも設定しません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/3db0cfd9-b535-2089-2cb0-8bf4c3a450b0.png)

作成したイメージを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/97688402-6c04-69e3-fd6e-72f213f53560.png)

ネットワークを設定します。フリートはサブネットを２つ設定する必要があります。予定していたPrivateSubnet1と2を設定します。通信要件もないため、インバウンドを許可していないセキュリティグループを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/bbbe32e9-942a-ff29-dcb4-04fd3cffa75c.png)

レビュー画面で問題なければ、「Create fleet」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/10d21584-4754-0607-a068-6148f65f2190.png)

コストがかかる旨の表示がでます。私は〜を了承したのチェックを入れて、「Create」をクリックします。
※本当にコストがかかるので、確認終わったらすぐに停止、削除するつもりです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/fc3e1bd7-1ee9-f226-760f-244995db4b82.png)

フリートの起動が開始されました。起動するまで10分〜20分くらいかかる場合がありますので、気長にまちましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/7fee582d-d3f5-3f69-8427-d07a7df33367.png)

フリートのステータスがRunningに変わりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/9c9d76be-108b-2560-0f0b-06992af77c85.png)

### ユーザーを追加
今回はAppStream2.0自身のユーザープールを使用します。AppStream2.0 > userpoolへ移動します。
「Create User」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/564943e3-585c-4346-337b-8768bd4e1573.png)

Emailなど必要な情報を入力して、「Create User」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/ed1cadaf-b683-6ed2-2a92-43735d6c6179.png)

ユーザープールに追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/6969e637-0e5e-a331-2300-9df12dcd66cd.png)

ユーザーにはこのような招待メールが届きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/0532a57c-4ff7-73d1-ee54-0b2f3603388f.png)


ちなみに追加したユーザーの削除はGUIではできないため、AWS CLIを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/991c821d-a1c6-969d-e88c-1557643744a1.png)

### スタックの作成と、ユーザーとフリートの関連づけ
AppStream2.0 > Stacksへ移動します。
「Create Stack」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/e94c2a96-369b-5600-210d-c5c4b580c28a.png)

スタックの詳細画面で、スタック名とフリートを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/d7b83f0b-8961-527f-efc6-acbe5decf049.png)

その他はデフォルトのまま「Next」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/b05b6e1f-e703-b756-1c36-05758bb8c0ea.png)

ストレージは使用しませんので、チェックは外して「Next」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/a1cb41b5-6512-8316-71b2-69bb0a0529ad.png)

何にも利用しませんので、チェック外しやDisable選択を怠りません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/1d732612-8c3b-ae23-e5f3-5673dca088cc.png)

レビュー画面で、余分な設定をしていないことを確認したら、「Create Stack」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/e46a0346-2de4-eb47-9f30-de4e89b13e28.png)

スタックが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/385374fe-a29e-1e60-2826-cf6ccd4fbca2.png)

次にユーザーを割当ます。
User poolの画面で、ユーザー選択 「Action」> 「Assign Stack」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/4fa074f8-b137-0572-14aa-59278baf61c7.png)

内容を確認して、「Assign Stack」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/16a017a8-62a9-9625-9599-11d98e5d9e72.png)

ユーザーに新しいアプリが利用できるようになった旨のメールが届きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/9e95d9c7-ad23-2d2e-4184-7504fad6edc8.png)

### AppStreamへアクセス
いよいよストリーミングの準備ができました。
ユーザーのメールにあったログインページのURLへアクセスします。

登録したメールアドレス、パスワードを入力して、「Log in」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/1a3405cf-da79-3ba0-d5ca-2be42a6a85ee.png)

このような画面になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/5cdf2ab5-0561-e5c3-6dcc-76f3a07b8151.png)

アプリを選択するとストリーミングセッションの開始が始まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/a5b698d9-82b6-31ff-aabd-e29fd33971b5.png)

ブラウザ上でアプリケーションがストリーミングされるようになりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/e7c71b35-6838-a6b5-fe3d-1e7237fad67b.png)

ここまで確認できたので、ログアウトします。

フリートやイメージビルダーは停止してもコストが若干かかるため、完全に削除します。

### まとめ
今回は最低限必要な手順を確認しました。Windowsインスタンスを使用することのほうが多いと思いますが、Linuxでもアプリケーションのストリーミングができることを確認できました。