[Amazon Web Services]Amazon AppStream 2.0の教科書

（言い訳）最近は土日も忙しく、しばらく知識の棚卸をすることができておりません。その罪悪感というかなんとやらの解消を兼ね、Amazon AppStream 2.0の入門紀をここに残します。

## Amazon AppStream 2.0 とは
Amazon AppStream 2.0 をご存じでしょうか。
一言でいうと以下のようなサービスになります。

> Amazon AppStream 2.0 は、デスクトップアプリケーションに即座にアクセスできるようにする、完全マネージド型のアプリケーションストリーミングサービスです。
AppStream 2.0 は、アプリケーションのホストと実行に必要な AWS リソースを管理し、自動的にスケーリングし、オンデマンドでユーザーにアクセスを提供します。
https://docs.aws.amazon.com/ja_jp/appstream2/latest/developerguide/what-is-appstream.html

「デスクトップ型のアプリケーション配信サービス？」、知識の浅い自分だと少し分かりづらかったですが、具体的なユースケースは以下です。

ユースケース
- Appstream 2.0 により、ユーザはローカルコンピュータにダウンロードやインストールせずに、ブラウザ経由でアプリケーションのトライアル版を数秒で開始することができるようになる
例) WindowsOSしか対応していないソフトウェアであっても、
ユーザは任意のデバイスからブラウザ経由でアプリケーションを使用することが可能になる。

- ユーザはアップデート作業をする必要がなく、いつでも最新版のアプリケーションを使用することができる

- アプリケーションとデータはユーザーのコンピュータに保存されず、AWSネットワーク内で保護される

企業の導入事例など、詳細は下記に記載があるためご一読することをおすすめします。
https://aws.amazon.com/jp/appstream2/

## AppStream 2.0 の主要コンポーネント
上記の概要を踏まえ、実利用で理解しておくべき主要コンポーネントについて解説したいと思います。抑えておくべきは以下5点です。

・スタック
スタックは、ユーザーがアプリケーションをストリーミングで利用できるようにするための「まとまり」です。スタックには、どのフリート（アプリケーションを動かすサーバー群）を使うか、ユーザーの利用ルール（アクセスポリシー）、ストレージの設定などが含まれています。スタックを作成してユーザーに割り当てることで、ユーザーは指定されたアプリケーションにアクセスできるようになります。

・フリート
フリートは、実際にアプリケーションやデスクトップが動作するサーバー（インスタンス）の集まりです。ユーザーがアプリケーションを使うときは、このフリート内のインスタンスが割り当てられます。フリートを作成するときは、どのイメージを使うかや、インスタンスの台数、タイプなどを設定します。特別なネットワーク設定（プロキシなど）がなければ、パブリックサブネットに配置し、インターネットアクセスを有効にするのが一般的です。

・AppStream 2.0 Image
Imageは、ユーザーに提供するアプリケーションや、その初期設定（システムやアプリの設定）をまとめたものです。EC2でいうAMIのようなもので、これを元にフリートのインスタンスが起動します。イメージには、ユーザーがすぐに使い始められるよう、必要なアプリケーションや設定を入れ込みます。

・AppStream　2.0 Image Builder
Image Builderは、イメージを作成・編集するための仮想マシン/EC2です。AppStream 2.0 のコンソールからImage Builderを起動し、リモート接続してアプリケーションのインストールや設定、動作確認ができます。作業が終わったら、その内容をイメージとして保存できます。また、作成済みのプライベートイメージから新しいImage Builderを起動することも可能です。

・ユーザープール
ユーザープールは、AppStream 2.0でユーザーと、そのユーザーに割り当てるスタック（利用できるアプリケーションのセット）を管理する仕組みです。ユーザープールにユーザーを登録し、スタックを割り当てることで、ユーザーは自分専用のURLとログイン情報でアプリケーションにアクセスできるようになります

文字だけだと分かりづらいですが、図にすると以下のような構成になっており、各構成要素がそれぞれ紐づいてきます。翻訳がすこし気になりますが、艦隊＝フリートです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/51efd32d-cee1-46a6-b76f-4cf78718a45b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/0bb65749-735c-4bf5-992c-9662a231b70f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/68bc961d-3231-418a-bcac-c1b99471e09c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/9e998b34-992f-4e1f-8338-3d29fc4fee73.png)

https://us-east-1.console.aws.amazon.com/appstream2/home?region=us-east-1#/tutorial-wizard

## チュートリアル: AppStream 2.0 コンソールを使用してカスタム AppStream 2.0 イメージを作成する
なんとなくAWS上で設定すべき要素が分かったところで、下記ドキュメントをもとに実際にハンズオンしてみたので、その際の ~~やらかし~~ 注意点とともに設定の流れを記載します。
https://docs.aws.amazon.com/ja_jp/appstream2/latest/developerguide/tutorial-image-builder.html

Linux 環境（Amazon Linux 2）を例にしていますが、Windows や他の Linux ディストリビューションでも基本的な流れは同じです。

###### 0. Image Builder の起動
Image Builder を初めて起動する場合は、 AWSによってリリースされた最新のベースイメージのいずれかを使用できます。

:::note alert
後続の手順にて、インターネットよりchromium.x86_64をイントールするため、Image Builderはパブリックサブネット配置/デフォルトインターネット設定を有効で設定すること
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/a51f3243-2947-420e-9f2b-c265df65c102.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/5d1187e5-337f-4a9f-a826-5ee878993711.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/4967d281-6c09-44b3-ba5f-b79778aab5ad.png)

###### 1. Image Builder にログイン
AppStream 2.0 コンソールから Image Builder インスタンスを起動し、「Connect」ボタンでリモート接続します。ログイン時のユーザーは OS によって異なります。

Windows/Red Hat Enterprise Linux/Rocky Linux の場合

「Administrator」：アプリケーションのインストールやイメージ作成など管理者権限が必要な作業を行います。

「テンプレートユーザー（Windowsのみ）」：デフォルトのアプリ設定をカスタマイズしたい場合に使用します。

Amazon Linux 2 の場合

「ImageBuilderAdmin」ユーザーで自動ログインされます（管理者権限あり）。


ImageBuilderへログインすると以下のような画面になります。

:::note info
Amazon AppStream 2.0でAmazon Linux 2がGUIで表示されるのは、AppStream 2.0がAmazon Linux 2ベースのイメージにデスクトップ環境（たとえばGNOME 3）をあらかじめ組み込んで提供しているためです
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/c3f97213-3eab-4285-9e8e-8480ca5c66e2.png)

###### 2. Chromium のインストール

Image Builder内のTerminalを起動し、試しにChromium（アプリケーション） のインストールを実施します。

```
sudo yum update
sudo yum install chromium.x86_64
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/b1f6a09b-aca1-4dda-a945-ab0542ed0e2b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/cce22046-b579-483f-ba59-e9ed5671a0df.png)


###### 3. アプリケーション最適化用のマニフェストファイルの作成
マニフェストファイルとは、ソフトウェアやシステムの動作に必要な設定やリソース情報を記述したファイルのことです。このファイルには、プログラムが参照するコンポーネントやライブラリ、実行時に必要な外部ファイル、各種設定値などが記載されます。最適化マニフェストは、アプリケーションごとに 1 つある行区切りのテキストファイルです。

作成すると、新しいフリートインスタンスでの初回起動時におけるアプリケーションの起動がより迅速になります。ただし、ユーザーがフリートインスタンスを利用できるようになるまでの時間は長くなるため注意です。

Amazon AppStream 2.0でカスタムイメージを作成・管理するための専用ツールとして、AppStream Image Assistantがあります。GUIでカスタムイメージを作成する場合、自動でアプリケーション最適化が行われるようですが、今回はCLI で手動作成したいと思います。

Chromium をバックグラウンドで起動

```
/usr/bin/chromium-browser &
プロセスID（PID）を控える
```

getfilestool.sh スクリプトを作成し、実行権限を付与

``` getfilestool.sh
#!/bin/bash
## usage getfilestool.sh $pid
lsof -p $(pstree -p $1 | grep -o '([0-9]\+)' | grep -o '[0-9]\+' | tr '\012' ,)|grep REG | sed -n '1!p' | awk '{print $9}'|awk 'NF'
```
```
chmod 755 ~/getfilestool.sh
sudo ~/getfilestool.sh [PID] > /tmp/chromium-manifest.txt
※lsofのエラーは無視してOK
```
:::note info
本節の詳細については、合わせて下記をご参照ください
https://docs.aws.amazon.com/ja_jp/appstream2/latest/developerguide/tutorial-create-linux-image.html#tutorial-linux-image-manifest
:::


###### 4. AppStream 2.0 アプリケーションカタログへの登録
```
AppStreamImageAssistant list-applications

AppStreamImageAssistant add-application \
  --name="Chromium" \
  --absolute-app-path="/usr/lib64/chromium-browser/chromium-browser" \
  --display-name="Chromium" \
  --absolute-icon-path="/usr/share/icons/hicolor/256x256/apps/chromium-browser.png" \
  --absolute-manifest-path="/tmp/chromium-manifest.txt"

AppStreamImageAssistant list-applications
```

アプリケーションを削除したい場合
```
AppStreamImageAssistant remove-application --name application_name
```

###### 5. デフォルトのアプリ設定
Chromium のカスタム設定（ホームページ・プロキシ・証明書など）を反映させるには、設定ディレクトリを /etc/skel 配下にコピーします。

```
bash
sudo mkdir -p /etc/skel/.config
sudo cp -R ~/.config/chromium /etc/skel/.config
```

.config のような「.（ドット）」で始まるディレクトリは、Linux で隠しディレクトリとして設定ファイルの保存によく使われます。

###### 6. イメージの作成
作業が完了したら、Image Assistant CLI でイメージを作成します。

```
bash
AppStreamImageAssistant create-image \
  --name Dev-AWS-Image-Chromium-20250517 \
  --description Dev-AWS-Image-Chromium-20250517 \
  --display-name Dev-AWS-Image-Chromium \
  --use-latest-agent-version
```
  
###### 7. Image Builder の停止
Image Builder インスタンスは「イメージ作成専用」の一時的なインスタンスです。利用料がかかってしまうため、作業が終わったら必ず停止しましょう

###### 8. イメージ - フリート - スタックの紐づけ
最後に各リソースの紐づけをしていきます。

イメージ - フリートの紐づけ
　AppStreamを実行する際、アプリケーション配信を担うフリートインスタンスを、どのAppStreamイメージで起動するかの設定
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/cb0037cd-c6e3-483b-9599-56900eeea90e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/fa3147ce-ee3c-46e3-99d8-384e0f1699c5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/de18c846-fd6a-4009-9218-1344d8f0e841.png)


フリート - スタックの紐づけ
　各種配信設定を管理するAppStreamスタックへ、配信したアプリケーションを登録したフリートインスタンスを紐づけます。
 
※スタックの設定項目は以下のようなものがあり、個人的にはアプリケーションロゴを変更できる点に感動しました。
[AppStreamスタック設定項目]
ユーザアクセス設定、ストレージ設定、通信プロトコル、VPCエンドポイントなど

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/9eb67eac-d968-4376-b153-38474fcd4d0c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/043a11cc-4363-442e-9011-c73c9ffbcf2b.png)

###### 9. 実行
AppStream実行の準備が整いました。あとは（ユーザプールで任意のユーザにスタック割り当て）　→　フリート実行　→　アプリケーションアクセスの手順でAppStreamを使用可能になります。実際にアクセスしたイメージは以下になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/25266a44-5670-47f9-a064-436094b6ecb8.png)
※ユーザプール設定をするとこんなメールが届きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/88df9897-ab8e-4ef8-b88a-d710f9929f1c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/07386217-e49e-4d64-8825-f0f88102e337.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822026/556251e3-a842-4ea3-b06a-5ef0a6e0740b.png)

## まとめ
本サービスはAWSの中だと結構マイナーなサービスなのかなと思っております。ただ、冒頭のユースケースで紹介していますが使い道は色々です。面倒な管理はせず、迅速・セキュアにアプリケーション配信したい際はご検討ください！

以上、AppStream2.0の入門紀でした。