Closed16

Amazon AppStream 2.0 を使ってみた

kazokmrkazokmr

Webアプリケーションの特別なコンテンツへのリクエストを特定のIPアドレスからに制限したかったので AWS の WorkSpaces と AppStream の利用を検討している。
WorkSpacesは以前試したことがあったのと 今回はリモートデスクトップというよりも Webブラウザだけに限定できた方が都合が良かったので AppStream2.0を試してみることにした

https://aws.amazon.com/appstream2/?nc=sn&loc=0

kazokmrkazokmr

まずはサンプルアプリケーションで試してみる
https://aws.amazon.com/appstream2/try-sample-applications/

実際には Chromeを使うことにはなりそうだがサンプルアプリには無いようなので Firefox で試してみる。
Firefoxを選択するとAWSコンソールのAppStream2.0に移動する
Terms & Conditions(利用条件)が表示されるので、Agree and Continue をクリック

ここでApplication選択が出るのでFIrefoxを選択する。(コンソールに入る前はどれ選択しても一緒だったかも)
するとFireFoxが自分のブラウザ内ブラウザのような形で表示される

最上段のメニューアイコンが AppStream2.0のメニューになっている。
初期状態だと日本語入力などができなかったので、Preferences をクリックする

Regional settings タブの内容を設定すれば良さそう

こんな感じに変更してSaveしてみる

日本語で入力できるようになった

Firefox自体は英語のままなのでこれはFirefox自体の設定で 言語を変更すれば良いのだが、ここでインターネットがつながっていないことがわかった。

kazokmrkazokmr

ひょっとしたらアプリだけ公開された状態でVPCとかInternetGWとかが設定されていないのかも

kazokmrkazokmr

AppStream内のWebブラウザが外部インターネットにアクセスするためだから、NAT-Gateway と EIP も必要か

kazokmrkazokmr

次のページの「Get started with Amazon AppStream 2.0」から始めてみる
https://aws.amazon.com/appstream2/getting-started/

AWSコンソールの AppStream2.0 のページに入るので 右上の Get Started を押す。
選択肢が3つ出るので一番上の「Set up an AppStream2.0 stack to stream applications」を選ぶ

Stackの作成画面に遷移する。ここで必須項目は Name のみで 今回は ExampleStack とセットされているので何も変えずに 「Next」へ

次はImageの選択。ここでは SampleImage が 2023年作成と2024年作成の2つから選べる。 どちらもPlatformは Windows Server 2019 Base。 今回は作成日が新しい方法選択して「Next」

Fleetの設定画面に進む。設定内容は次の通り

  • インスタンスタイプの選択
    • まずインスタンスファミリーとして「General Purpose」「Compute Optimized」「Memory Optimized」の3つを選択でき、それぞれに VCPUs と Memory の組み合わせで最適な インスタンスタイプが選択できる
    • 今回の用途はブラウザ操作なのでデフォルトの GeneralPurpose - stream.standard.medium を選択する
  • フリートタイプ
    • Always-On と On-Demand が選べる
    • 他に Elasticというタイプがあるらしいが今回は表示されなかった
    • Always-Onは AppStreamを利用していない状態もフリートは常時起動状態となり、On-Demandは必要な時のみ起動する。前者は利用していないときもコストが掛かる。後者は起動までに1〜2分掛かる
    • 今回はお試しなので On-Demand にする
  • ユーザーセッション
    • Maximum session duraiton in minutes は、そのインスタンスがアクティブでいられる最大時間。この時間を過ぎるとインスタンスは強制的に終了・切り替えが行われるので 事前にセッションデータの保存を要求するそう
    • Disconnect timeout in minutes
      • 切断後、セッションを維持する時間を設定。この時間内であれば再接続すると前のセッションを再利用することができる
    • Idle Disconnect Timeout in minutes
      • 非アクティブな状態でセッションを維持しる時間。無操作のままこの時間を過ぎるとセッションが切断される
  • フリートキャパシティ
    • フリートインスタンスに対する最大利用数を制限する
    • Multiple user sessions
      • 1つのインスタンスで 複数のユーザーによるセッションを管理するかを選択する
      • 複数ユーザーで利用する場合にはさらに次の詳細が選べる
        • インスタンスごとの最大セッション数
        • 最小ユーザーセッション数(通常は1のはず
        • 最大ユーザーセッション数 (インスタンスごとの最大セッション数 * インスタンス数になる?
    • 1インスタンス・1ユーザーの場合に選択できること
      • 最小フリートインスタンス数
      • 最大フリートインスタンス数
    • いずれも同時利用数を制限することで 必要以上にフリートインスタンスが起動されることを防ぐことができる
  • ストリームビュー
    • AppStream2.0 のビューを選択する
    • Application
      • 選択したアプリケーションのみをウィンドウに表示する。通常はこちら
    • Desktop
      • OSが提供する表示数デスクトップが表示される

あとで調べるが Fleetが恐らく AppStreamで提供するアプリを実行するインスタンス群のことを指していると思う
https://docs.aws.amazon.com/ja_jp/appstream2/latest/developerguide/set-up-stacks-fleets.html
選択したら Next

次は Network設定
利用するVPCやSubnet、Security group を指定することができる
ここで Enable default internet access というのが選べる。
これを選択すると publicサブネットのInternetGWを使用したインターネット接続ができるらしい。またパブリックIPアドレスも割り当てられる

ただしこれを有効にするには 同時アクセスユーザーが100以下である必要がある。100を超える場合や そもそも外部からのインターネットアクセスをさせない場合は、プライベートサブネット + NATゲートウェイを使う。
この場合、通常のネットワークと同じで NAT-GWは パブリックサブネットに用意し、 このNetwork設定では1つ以上のプライベートサブネットを指定してプライベートサブネット内にフリートインスタンスが配置さえるようにする。(NAT-GWを配置したパブリックサブネットは指定しないこと。)

とりあえず最初はデフォルトのVPCを使い、デフォルトのインターネットアクセスを有効にしてみる
https://docs.aws.amazon.com/ja_jp/appstream2/latest/developerguide/internet-access.html
https://docs.aws.amazon.com/ja_jp/appstream2/latest/developerguide/managing-network-internet-NAT-gateway.html

またSecurity Groupは最大5つまで指定できる。 例えばここでブラウザからアクセスできるWebサイトを限定できるような気がする
設定したら Next

次にストレージの設定
AppStreamでアクセスしたアプリケーションからのファイル保存を設定する。 保存先にはS3バケットが指定できる。他にはGoogleDriveやOneDriveも選べるそうだが今回は選択できなかった。

例えば アプリによってはファイルの保存が必要だったりすると思う。今回は 有効にしないようにして Next

次はユーザー設定
Fleetのコピペやファイルのアップロード・ダウンロードの可否が指定できる
今回はデフォルトのコピペもアップロード・ダウンロードもOKでNext

ここまで設定したら Create すると、Stack と Fleet が作成される

kazokmrkazokmr

作成したStackの公開は通常、ユーザーと紐づけて利用させる。 が、一時的なURLを提供して利用させることもできる。

  1. Stacks から 公開したい Stack -> Action -> create streaming URL を選択する
  2. 任意のUserIDを入力し、有効期間(最小30分、最大1週間)を指定して URLを生成する
  3. 次の画面で 一時URLが提供される。このURLはユーザー制限などがかからないので、URLを知っている人は誰でもブラウザからアクセスできるので注意すること
kazokmrkazokmr

これでアクセスするとネットワークにもつながり日本語で表示された。
ただ今度は Preferences から Regional Setting タブが表示されず、日本語入力などに切り替えることができなかった。Imageの問題かもしれない

kazokmrkazokmr

作成したStackをユーザーが利用できるようにする。
ユーザーは ユーザープールでの管理SAML2.0による統合による管理 で許可することができる

とりあえず、ユーザープール管理で進める
AppStream2.0 の User Pool から Create User をクリックすると、Eメールとユーザー名を入力する画面に入るので招待するユーザーを指定して Create User をクリックすると、Eメールアドレス宛に招待メールが届く

招待メールに ログインURLと初期パスワードが提供されるので初回サインアップを行い パスワードを変更する。この状態でログインしてもまだ利用できるアプリを指定していないので何も利用できない

アプリを利用させるには以下の通りに設定する

  1. User Pool より 利用させるユーザーを選択して、Action -> Assign stack を選ぶ
  2. 利用させるStackを選び Assign stack をクリックしてアサインする

これで 利用ユーザーは AppStream2.0 のログインからStackとStackに含まれているAppを選択できるようになる

kazokmrkazokmr

ここも一時的なURLと同じで、Regional Settingが選べなかった

kazokmrkazokmr

Image Builders を使って Imageを作る

AppStream 2.0で使わせたい Chromeをセットアップした イメージを作成してみる

Image builder を立ち上げる

https://docs.aws.amazon.com/appstream2/latest/developerguide/tutorial-image-builder-create.html

AppStream 2.0 > Images から Image builder タブに切り替え Launch Image builder をクリックする

Base Image を選択する

Instance family (Instance type) と Platform (OS) の 組み合わせで ベースとなるイメージを選択する。
EC2インスタンスを作成する際の インスタンスタイプとOSを指定するのと同じように考えれば良さそう。
AppStream 2.0 を使う目的が 「IPを固定化したWindows環境でChromeを利用してインターネットアクセスする」なので、Instance family は General purpoose、Platforms は Microsoft Windows Server 2022 Base にする

Image Builder の 設定

Image Builder の 名称やTag、選択したインスタンスタイプの vCPUsとMemoryの選択、Image Builder を選択できるRoleなどを指定することができる
名称とインスタンスタイプの選択だけが必須なので今回はこれだけを指定する。
インスタンスタイプは stream.standard.medium (vCPUs: 2, Memory: 4GiB) を選択

ネットワークの設定

Image Builder が利用するネットワーク (VPC, Subnet, Security Group) を指定する。 Image Builder から作成したImageのネットワークとは異なる認識。
今回は専用の設定は用意せずにDefaultのVPC等を利用する。また Chromeのダウンロードも考慮して Enable default internet access にチェックを入れておく。 private subnet を使う場合は ここをチェックしてもインターネットアクセスはできないので あらかじめ NATゲートウェイかNATインスタンスを用意してインターネットにアクセスできるようにしておく必要がある

ここまで設定を行ったら最終確認し Launch Image builder をクリックして Image Builder を起動する。
コンソールの Image builder 画面に戻るので、起動したImage Builder の Status を確認し、 Pending から Running になるまで待つ。

カスタムイメージを作成する

今回はこのチュートリアルに従って進めていく
https://docs.aws.amazon.com/appstream2/latest/developerguide/tutorial-image-builder.html

Image Builder に接続する

コンソールから Image Builder を選択して Connect をクリックする

接続すると AppStream 2.0 コンソールが起動する。最初にユーザー選択で Administratorを選択する

Windows画面が表示されるのでここで実際にアプリをインストールしていくのだと思う

OSの設定を行ってみる

まず先にサンプルではできなかった、ローカル設定を行っておく。
ドキュメントは 「コントロールパネル」とあるが 実際は 「設定」から行う。
また OSのログオフを行いたい場合は Powershellで shutdown.exe -llogoff、再起動したい場合は Restart-Computer を実行すると良い

https://docs.aws.amazon.com/ja_jp/appstream2/latest/developerguide/configure-default-regional-settings.html

  • タイムゾーン
    • AWSのドキュメントとちょっと違うのでここに書いておく
    • Powershellを 「管理者で実行」で起動する
    • `Set-TimeZon -Id "Tokyo Standard Time" コマンドを実行
    • これで JSTに切り替わる
  • 表示言語
    • 先に Template User に スイッチして設定を行う
    • この時パスワードを聞かれるが 「いいえ」を選択しても言語設定は行える
    • 手順にあるイメージの作成は保留。全て完了してから行ってみる
  • システムロケール
    • 言語を日本語にして再起動した時点で 地域も日本に更新済みになっていた
    • なので変わっていない場合だけ日本に変える
  • ユーザーロケール
    • 基本はシステムロケールと同じ日本にするので変更不要
  • 入力方法
    • ここも表示言語やシステムロケールを変更したときに日本語になっているっぽい

これで日本語設定で利用できるが、一応 ユーザーが自分でリージョンが選べるようにしておこうと思ったら Powershellを起動して $PSVersionTable コマンドでバージョンを確認したら すでに 5.1になっていたので特に何もしない

https://docs.aws.amazon.com/ja_jp/appstream2/latest/developerguide/regional-settings.html

Chromeをインストールする

デフォルトでインストールされているEdgeを使って Chromeのインストラーをダウンロードしインストールを実行する。
OSのロケールを日本語に変更しているので Chromeの初期言語も日本語になっている。
また試しにブックマークを一つ追加しておく

これでImageを作るための準備はできた

kazokmrkazokmr

AppStream 2.0 の アプリケーションカタログを作成する

AppStream2.0 コンソールに 管理者でログインし、デスクトップにある Image Assistant をクリック

  1. Add Apps でアプリケーションを追加する
    • Chromeの exeファイルを検索してクリック
    • 表示名や起動パラメータなどが指定できるの任意の値を設定してSave
    • Edge も追加しておく
  2. Configure Apps で アプリのデフォルト設定を保存する
    • Template User にスイッチし、Image Assistant を開くと 1で選択したアプリの初期設定を行う
    • 例えばChrome の初期設定やお気に入り追加はこのタイミングで行えば良さそう
    • 再度 Administrator にスイッチして 設定を保存する
  3. Test で 設定が反映されているかを確認する
    • Test User に スイッチし、Image Assistant を開くと アプリが選択できる
    • Chromeを選んで Template User で設定した内容が反映されているかを確認
    • 今回だと お気に入りは反映されていたが、OSのブラウザのデフォルトアプリは反映されなかった。これは仕方がなさそうなので各自で利用するときに設定してもらうことにする
    • 問題なければ Administrator に スイッチして次に進む
  4. Optimize で、起動時間を最適化する
    • Launch を押すと アプリケーションが起動するので ロードが完了したら Continue を押す
    • 次のアプリケーションが起動するので以後同じように繰り返す
  5. Configure Image で Imageの名前やTagを追加する
    *
  6. Review で 最終確認を行なってイメージを作成する
    • 設定した内容を確認して Disconnec and Create Image をクリックする
    • 「Lost connectivity」ポップアップが表示されるので Retryは押さずに AppStream 2.0 タブを閉じる
    • AWSコンソールで Image builder をみると Status が Snapshotting になっていて、Imageが作成中であることがわかる
    • Image registry タブを見ると 指定したImageがあり、Statusが Pending となっている。これが Available になるとImageが利用できるようになる。( availableになるまで10分以上は掛かった)
  7. Imageを作成したら 対象の Image Builder をStopする
    • 起動したままだと費用が掛かるため
    • 今回はImage作成後、自動的に Stopped となっていた
kazokmrkazokmr

カスタムイメージで AppStream 2.0 を使ってみる

今度は SampleAppsじゃないので、 AppStream 2.0 > Fleets > Create fleet から初めてみる

  1. Fleet type は On-Demand
  2. Configure fleet は 任意で
  3. Image は 先ほど作成したカスタムイメージを選択
  4. Networkも Default Internet Accessを有効にする

その後、Stackも作成してFleetを紐づけるのと、UserPoolのユーザーにStackを割り当てる

これで ブックマークも共有された Chromeを AppStream 2.0 で利用することができた。
ただし ユーザー単位でのLocale設定は引き続きできなかったので Image作成時に何かが足らなかったかもしれない。とはいえ 日本語にはなっているので実使用としては問題なさそう

このスクラップは3ヶ月前にクローズされました