初心者向けAWS AppStream 2.0入門


AWS上にはデスクトップ環境を提供するフルマネージドサービスが2つあります。

「[AppStream 2.0](https://aws.amazon.com/jp/appstream2/)」と「[WorkSpaces](https://aws.amazon.com/jp/workspaces/)」です。

特にAppStream 2.0については、世間からの認識度が低いように思います。
今回の記事は「AppStream 2.0」について概要を理解する為の手助けになる事を目的に記載してみました。
「AppStream 2.0とは何？良く解らないんだけど…」という方はご一読頂ければと思います。

なお、いつものお約束ごとですが、本投稿内容は、わたし個人の意見や経験談であり、所属する企業や団体を代表するものではございません。何卒、よろしくお願いいたします。

#■AppStream 2.0とWorkSpacesの違い

公式サイトの記載は以下の通りです。

##[Amazon WorkSpaces](https://aws.amazon.com/jp/workspaces/)
>Amazon WorkSpaces はサポートされているあらゆるデバイスからリソースにアクセスできる Windows および Linux 向けのフルマネージドデスクトップ仮想化サービスです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/24bf8586-c76f-5bd9-fe80-c3d065518dd2.png)

概要を確認したい人は「[【AWS Black Belt Online Seminar】Amazon WorkSpacesサービスカットシリーズ]
(https://d1.awsstatic.com/webinars/jp/pdf/services/20190226_AWS-BlackBelt_Amazon_WorkSpaces.pdf)」を参照することをおすすめします。

##[Amazon AppStream 2.0](https://aws.amazon.com/jp/appstream2/)
>Amazon AppStream 2.0 は、フルマネージドで非永続的なデスクトップおよびアプリケーションサービスであり、リモートで業務にアクセスすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/2a01cf61-d1c1-ed75-d9b5-7fed4bdf918d.png)

概要を確認したい人は「[【AWS Black Belt Online Seminar】Amazon AppStream 2.0サービスカットシリーズ](https://d1.awsstatic.com/webinars/jp/pdf/services/20191126_AWS-BlackBelt_AmazonAppStream2.0.pdf)」を参照することをおすすめします。

そして、この2つの機能が比較されているのが「[【AWS Black Belt Online Seminar】Amazon AppStream 2.0サービスカットシリーズ](https://d1.awsstatic.com/webinars/jp/pdf/services/20191126_AWS-BlackBelt_AmazonAppStream2.0.pdf)」の「[代表的な機能差異](https://d1.awsstatic.com/webinars/jp/pdf/services/20191126_AWS-BlackBelt_AmazonAppStream2.0.pdf#page=9)」となります。以下にその比較表を転記します。

|区分|AppStream 2.0|WorkSpaces|
|:------|:------|:------|
|サービス概要|クラウド上のアプリケーションをクライアントデバイスに配信するフルマネージドサービス|クラウド上のデスクトップ環境へのアクセスを提供するフルマネージドサービス|
|インスタンスの永続性|非永続的なストリーミングインスタンス|永続的なデスクトップインスタンス|
|インスタンスのOS|・Windows Server 2012 R2<br>・Windows Server 2016<br>・WindowsServer 2019<br>※ライセンスインクルードのみ|・Amazon Linux 2 LTS<br>Windows7<br>(Windows Server 2008 R2 デスクトップエクスペリエンス)<br>・Windows10<br>(Windows Server 2016 デスクトップエクスペリエンス)<br>・Windows7(BYOL)<br>・Windows10（BYOL)|
|プロトコル|NICE DCV<br>高解像の画面を軽量に配信|PCoIP<br>画面の要素を自動識別し最適化して転送|
|用途|・特定のアプリケーションのみをユーザーに提供したい。<br>・高解像度の3Dアプリケーションを利用したい。<br>・ユーザープールを使って迅速にアプリケーションを配信開始したい。|・ユーザーが自由に使えるデスクトップ環境を提供したい。<br>・ユーザごとに永続インスタンスを割り当てたい<br>・Linuxの利用や、Windowsライセンスの持ち込みを行いたい|


#■実際にAppStream 2.0の環境を構築する
ドキュメントを読むとなんとなく概要は理解できます。ただ、本質的なところは一度手を動かして構築してみる事が大切です。その手助けになるのが「[管理ガイド](https://docs.aws.amazon.com/ja_jp/appstream2/latest/developerguide/what-is-appstream.html)」です。ただし、このガイドを読んで構築しようと思っても、なかなか初心者には難しいかと思います。

更に実際に構築する「AppStream2.0」のマネージドコンソールは英語版しかありません。初心者には理解しにくい管理ガイドと英語の画面で心が折れてしまう人もいるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/b15f95f0-9999-2de8-37e5-dd6e1f937b59.png)

そこで活用してほしいのが「[エンドユーザーコンピューティングワークショップ](https://workshops.aws/categories/End%20User%20Compute)」に準備されている「[Amazon AppStream2.0入門](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/)」です。これはAWSが準備している教材で、標準的な構築手順が整理されています。こちらも英語の資料になりますが、Webブラウザの日本語変換機能を使えば、英語が苦手な人でも問題なく利用することが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/9c33c61b-bb2d-d22f-300f-5ddaf41916b0.png)

「[Amazon AppStream2.0入門](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/)」ラボの内容は以下の通りです。

>このラボでは、Appstream 2.0環境を作成し、エンドユーザーにアプリケーションをストリーミングする方法を学習します。
>
>・GoogleChromeとNotepad ++がインストールされたカスタムAppStream2.0イメージを作成します。
>・その画像を使用して、Appstream2.0フリートを作成します
>・そのフリートをAppstream2.0スタックに関連付けます。
>・エンドユーザーと同じように、Appstream2.0環境からストリーミングされたアプリケーションにアクセスします。
>
>このラボでは、独自のカスタムAppStream2.0リソースを作成するための基本的な知識を習得します。このラボの完了には約4時間かかりますが、より小さな部分で行うこともできます。

そして、前提条件は以下の通りです。

>・MicrosoftWindowsまたはMacOSXを実行しているインターネットアクセスを備えたコンピューター。
>・ChromeやFirefoxの最新バージョンのようなインターネットブラウザ（HTML 5対応）。
>・AWSインフラストラクチャをプロビジョニングするためのAWSアカウント、またはラボファシリテーターによってプロビジョニングされたAWS EventEngineへのアクセス。
>・スキルレベル：デスクトップコンピューティングの基本的な理解は役に立ちますが、必須ではありません。
>・AWSの経験：ベースAWSインフラストラクチャ（VPC、EC2、S3）の予備知識は役立ちますが、この演習を完了するために必須ではありません。

基本的に「[Amazon AppStream2.0入門](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/)」の手順通りに進めていけば環境を構築できると思いますが、この資料だけだと、まだイメージしにくい方もおられると思いますので、今回は各手順の補足説明を記載させて頂こうと思います。実際に環境を構築する際に参考にして頂ければと思います。

まず、最終的な構成をイメージできた方が良いと思うので、構成図を掲載します。最終的な構成図は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/f4862f40-2576-a0dd-40e1-c059dc823f9f.png)

処理の流れは「[全体図](https://d1.awsstatic.com/webinars/jp/pdf/services/20191126_AWS-BlackBelt_AmazonAppStream2.0.pdf#page=36)」を確認頂けると分かりやすいと思います。

##[（１）ラボを開始する](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/startlab)
最初は「自分のAWSアカウントを使用する」と「イベントエンジンアカウントの使用」のどちらかの手順を選択して実施します。基本的にこの記事を見て実施される方はイベント等で環境が準備されている訳ではないため、「自分のAWSアカウントを使用する」の手順になると思います。アカウントを既に利用されている方は、スキップして良い手順です。

##[（２）VPCとサブネット](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/aws-nw)
「VPC」と「サブネット」を作成します。同時に「NAT Gateway」及びS3と接続するための「VPC endpoint」も作成しています。

以下の構成となります。作業範囲は赤枠の部分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/e08c005c-6cc4-3024-6739-1cece9f6c366.png)

もし既に対象リージョンで環境構築済みの場合は、素直に他のリージョンで実施した方が良いと思います。リージョンの変更で影響を受けることが無いためです。AppStream2.0が利用できるリージョンは限られますので、その点は注意が必要です。

手順の「VPCとサブネットを作成する」で「パブリックとプライベート サブネットを持つ VPC」を選択していますが、この際の設定で「Nat Gateway」とS3接続用の「VPC endpoint」が作成されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/98e4d575-11a8-59e9-4098-0589dec24115.png)

>この設定は、パブリックサブネットに加えて、インスタンスにインターネットからアドレスを指定できないプライベートサブネットを追加します。プライベートサブネットのインスタンスでは、ネットワークアドレス変換(NAT) を使用してパブリックサブネットを介してインターネットへのアウトバウンド接続を確立できます。

「Nat Gateway」や「VPC endpoint」を普段使っていない方は戸惑う方もおられると思いますので、ご注意ください。

##[（３）AppStream2.0イメージビルダー](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/imagebuilder)
イメージビルダーを利用して、配信利用したいアプリケーションをインストールする作業です。

>Image Builderは、基本的に、ストリーミングするアプリケーションを含むカスタムイメージを作成するために使用するAmazonEC2インスタンスです。

以下の構成となります。作業範囲は赤枠の部分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/99d7d760-a357-9e77-da5b-54d7936f1d34.png)

処理の流れは「[アプリケーションのインストール](https://d1.awsstatic.com/webinars/jp/pdf/services/20191126_AWS-BlackBelt_AmazonAppStream2.0.pdf#page=37)」を確認頂けると分かりやすいと思います。

###[①イメージビルダーを作成する](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/imagebuilder/createimagebuilder)
ここからやっとAppStream2.0の設定に入ります。
今回は以下のインスタンスを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/189ee236-413b-39f0-ec4a-cd5e633a80b2.png)

この作業で「DemoCo_Image1_mmddyyyy」という名前のImageBuilderインスタンスを起動させます。作成した直後は「pending」状態になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/907024f5-3564-a716-0bdd-731c84d83b90.png)
15分程度経過して、状態が「Running」になれば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/91e315b1-88cc-6a0e-97f3-56f507ef28cd.png)

###[②ImageBuilderに接続します](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/imagebuilder/launchib)
ここでは「Administrator」を選択して接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/2ed355ad-6aba-5cb3-972a-22094844ef2e.png)

完全な管理者権限を持つローカルユーザーでImageBuilderインスタンスに接続します。そうすると以下の様な画面が表示されます。この環境に必要なアプリをインストールする流れとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/68da3a7d-8626-b081-7375-9f7f60c72fd6.png)

###[③アプリケーションのインストール](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/imagebuilder/apps-install)
今回の配信対象である「Google Chrome」と「Notepad ++」の最新バージョンをインストールします。ここでは、普通にインストールするだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/bbc4f484-53ec-b8ff-0210-634f7345c33d.png)

そして、アプリケーションごとに必要な設定を実施します。

>パッチまたはアップデートの適用
自動更新機能の管理
起動コマンドまたは実行/実行コマンドの確認と最適化
アプリケーションに固有のパフォーマンスチューニング構成
アプリケーションの起動プロンプト（EULAプロンプト、初回実行エクスペリエンスなど）を無効にする
ファイルの関連付けを検証/構成する
ログファイルまたはイベントログのクリアまたはリセット

##[（４）イメージアシスタント](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/imageassistant)
ここでは、先ほど作成したImageBuilderインスタンスから、マスターイメージを作成します。

>この時点で、個々のアプリケーションがインストールおよび構成されたImageBuilderインスタンスが作成されています。次に、ストリーミング用のアプリケーションを完成させ、Image Assistantにストリーミングパフォーマンス用にアプリケーションを最適化させ、ユーザーが接続するインスタンスを作成するためのマスターイメージを作成する必要があります。

以下の構成となります。作業範囲は赤枠の部分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/17e96250-fc59-d558-5e1c-bba4bf5ff7ba.png)

処理の流れは「[イメージの作成と公開](https://d1.awsstatic.com/webinars/jp/pdf/services/20191126_AWS-BlackBelt_AmazonAppStream2.0.pdf#page=38)」を確認頂けると分かりやすいと思います。

###[①ストリーミングアプリケーションを追加する](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/imageassistant/streamapps)
「Image Assistant」を起動してアプリケーションの追加を実施します。ここで追加したものが配信対象となるため、「Google Chrome」と「Notepad ++」と追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/49d3e62e-f907-700e-b829-87c5019d86e2.png)

###[②アプリケーションを検証する](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/imageassistant/validateapps)
テストユーザで動作検証を実施します。

###[③パフォーマンスの最適化](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/imageassistant/optimizeperf)
起動パフォーマンスの最適化設定を実施します。

###[④イメージの構成](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/imageassistant/configimage)
イメージの構成の設定を実施します。

###[⑤レビューと作成](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/imageassistant/review)
カスタムイメージ「Lab_Image_Chrome_Notepad_v1」の作成が開始されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/47a67012-fb95-cc3a-b18b-993a20312047.png)
まず最初にImageBuilderインスタンス「DemoCo_Image1_mmddyyyy」が「Snapshotting」の状態になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/f94cb427-dfd3-7b5b-d2f5-64ca30e7d66e.png)
15分程度経過すると「Stopped」に状態が変わります。この段階でカスタムイメージ「Lab_Image_Chrome_Notepad_v1」が完成しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/5ddf4379-9623-7523-25db-7533fadd72f5.png)

##[（５）フリートをプロビジョニングする](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/fleetprov)
次はフリートの設定を実施します。

>AppStream 2.0フリートは、アプリケーションストリーミングインフラストラクチャのハードウェアおよびスケーリング構成です。フリートをプロビジョニングすると、使用するインスタンスのタイプ、エンドユーザーにサービスを提供するためにコミットするインスタンスの数、およびスケールアップ（およびスケールダウン！）のポリシーを構成できます。

以下の構成となります。作業範囲は赤枠の部分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/8ae6672d-6fbd-8984-5ce3-feb912fceb0d.png)

処理の流れは「[フリートの定義](https://d1.awsstatic.com/webinars/jp/pdf/services/20191126_AWS-BlackBelt_AmazonAppStream2.0.pdf#page=39)」を確認頂けると分かりやすいと思います。

###[①フリートの詳細を提供する](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/fleetprov/fleetdetails)
最初に「Select fleet type」の画面が表示されます。
ここは料金に大きく影響する大事なポイントになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/8c4ae880-704a-b422-2aac-cc35afdc4b36.png)

それぞれのタイプの説明は以下の通りです。
ここでは「On-Demand」を選択します。

|タイプ|説明|
|:------|:------|
|Always-On|アプリケーションをストリーミングしているユーザーがいない場合でも、インスタンスは常に実行されます。このオプションを選択すると、次のユーザーがすぐに接続できるインスタンスがすぐに利用可能になります。|
|On-Demand|インスタンスは、ユーザーがアプリケーションをストリーミングしているときにのみ実行されます。ストリーミングに使用できるアイドル状態のインスタンスは停止状態です。このオプションを選択した場合、ユーザーはインスタンスが起動するまで1〜2分待つ必要があります。|
|Elastic|Elastic フリートのストリーミングインスタンスは 1 秒単位で課金され、最低 15 分間、ストリーミングセッションの間課金されます。料金は 1 時間あたりのインスタンス単位です。インスタンス料金には、コンピューティング、ストレージ、ストリーミングプロトコルによって使用されるあらゆるネットワークトラフィックが含まれます。|

また、先ほど作成したカスタムイメージ「Lab_Image_Chrome_Notepad_v1」をここで選択します。

###[②フリートを構成する](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/fleetprov/fleetconfig)
フリートの構成を設定します。

###[③ネットワークの構成とフリートの作成](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/fleetprov/createfleet)
フリート「Lab_Fleet_mmddyyy」の作成が開始し、状態が「starting」となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/91d935a6-d8f6-0129-4210-56d2a496aa23.png)

15分ほど経過すると「Running」になるので、作業完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/5636b139-8b03-b986-75b6-7db4fda0affc.png)


##[（６）スタックを定義し、ストリーミングURLを作成します](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/streamingurl)
スタックを定義します。

>AppStream 2.0スタックは、フリート、ユーザーアクセスポリシー、およびストレージ構成で構成されます。スタックを作成して、ユーザーへのアプリケーションのストリーミングを開始します。このセクションでは、次のことを行います。
>
>・スタックの詳細を提供し、スタックをフリートに関連付けます。
・スタックの永続ストレージを有効にします。
・ストリーミングURLを作成します。

以下の構成となります。作業範囲は赤枠の部分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/6fb80182-10cb-2a27-1d68-3072bbff0fb1.png)

処理の流れは「[スタックの定義](https://d1.awsstatic.com/webinars/jp/pdf/services/20191126_AWS-BlackBelt_AmazonAppStream2.0.pdf#page=40)」を確認頂けると分かりやすいと思います。

###[①スタックを定義する](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/streamingurl/definestack)
新しくスタック「Lab_Stack_v1」を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/3989073c-e79f-9a81-1036-0f51c343a21e.png)

###[②ストリーミングURLを作成する](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/streamingurl/createurl)
ストリーミングのURLを作成すると、そのURLからAppStream2.0のサービスが利用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/bb2571d7-f1a6-b413-ab6a-c395b85bb583.png)

例えば「Google Chrome」のアイコンをクリックすると以下の様な読み込みが実施されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/9ae50082-73c6-a73d-e468-2dffd90f61ba.png)

読む込みが完了すると、以下の通りアプリケーションの画面が起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/06d98189-4d3f-b47e-1406-541d39c90718.png)

この状態の接続は以下の図との通りです。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/cbf687ce-f4db-bffb-c8e3-7a697902f009.png)


##[（７）AppStream2.0ユーザープール](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/userpool)
ユーザプール設定は、ユーザのメールアドレスを含んだユーザ情報を登録し、それによってログインできるようになります。複数あるログイン認証方法の一つです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/501c0178-1473-afe7-82e3-532d9a996bfe.png)

#■さいごに
今回は「[Amazon AppStream2.0入門](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/e324c13e-2ded-4da2-ad9c-f685305156ac/en-US/)」を元に構築手順を確認してみました。この様な資料をベースに実際に環境を触ってみる事がサービスを理解する近道となるかと思います。ドキュメント上だけでは判断しにくいことが実際に手を動かすと直ぐに理解できる訳です。

AWSのように誰もが触って検証できる環境のメリットを生かすことが重要であると思います。
みなさんも時間のある時に、ゆっくり触ってみてください。