彷徨うITエンジニアの雑記

ITインフラ関連の雑記とか

AWS AppStream2.0を使った踏み台構築手順

AWS AppStream2.0 は Citrix XenApp や Microsoft RemoteApp みたいなソリューションのマネージドサービス。Windows Server上のアプリケーション画面やデスクトップを配信できる。

クライアント ➡ AppStream(ログインポータル・コネクションブローカー・リバプロ) ➡ 公開サーバ

このサービスでRDPクライアントやTeraterm等を公開すれば、パブリック・サブネットが無いシステムに対しても簡単に作業用の踏み台サーバを構築できる。
今まではAWS System ManagerやRDゲートウェイを構築していたので、導入や維持が面倒だった。
リッチクライアントも用意されているが、HTML5対応しているのも使い勝手がいい。

1. Image Builderで公開サーバのデプロイ元となるインスタンスを構成する

イメージビルダーで公開サーバのカスタマイズを行い、インスタンスのスナップショットを作成する。
実際にユーザがアクセスする先のインスタンス群は「フリート」と呼ばれ、このスナップショットからデプロイされる。

AWS Console: AppStream2.0 ➡ Images ➡ Image Builder ➡ Launch Image Builder

  • Choose Image

用途に従いベースイメージを選択する。
今回は Instance Family = General Purpose を選択して標準的なWindows Server 2019イメージを選択した。

Choose Image AppStream-Graphics-Design-WinServer2019-12-28-2020
  • Configure Image Builder
Name fumidai_win2019-001
Instance Type 2vCPU, 7.5GB RAM を選択
Endpoint Internet
クライアントから公開サーバへの接続をDirectConnect、VPNでクローズしたい場合のみエンドポイントを指定。VPC内のPrivateLink経由でAppStreamサービスにアクセスするネットワークフローになる。
IAM Role 設定しない*1

イメージのカスタマイズ作業をどのサブネットで実行するのか設定する。
この環境では、パブリック・サブネットとNATインスタンスがデプロイ済の為、イメージはプライベート・サブネットにデプロイすることにした。

Default Internet Access Off
イメージにPublicIPをセットする。NATが無いパブリック・サブネットにデプロイする場合はOnにする。
VPC デプロイ先のVPCを指定
Subnet プライベート・サブネットを指定
Security Group プライベート・サブネットに配置するので In/Out:Any Permit とした
  • Launch をクリックするとベースイメージがデプロイされる

2. イメージをカスタマイズする

AWS Console: AppStream2.0 ➡ Images ➡ Image Builder

15分程度でイメージのステータスが Peding ➡ Running に遷移する。

イメージを選択し [Connect] ボタンをクリックするとログオン画面が表示される。
Local Administrator でWindowsにログオンし、OSの設定変更やアプリのインストールを実行する。
この例では以下のカスタマイズを実施した。

  • Windows Server 2019の日本語化
    • Start -> Settings -> Time and language -> Language から日本語の言語パックをインストール
    • Powershellを管理者権限で実行し、以下のコマンドを実行
# タイムゾーン変更
Set-Timezone -Name "Tokyo Standard Time"
# リージョン
Set-WinHomeLocation -GeoId 122
# システムロケール
Set-WinSystemLocale -SystemLocale ja-JP
# 言語リストの優先順位
Set-WinUserLanguageList -LanguageList ja-JP,en-US -Force
# レガシーな言語バーを表示
Set-WinLanguageBarOption -UseLegacySwitchMode -UseLegacyLanguageBa
# OSのUI言語
Set-WinUILanguageOverride ja-JP
# デフォルト入力メソッド
Set-WinDefaultInputMethodOverride -InputTip "0411:00000411"

# ログオフ
logoff

3. Image Assistant からFleet用のスナップショットを作成する

デスクトップの Image Assistant を起動し、ウィザードに従って設定を進める。

  • ADD APPS
    • 公開するアプリケーションのパス、起動パラメータを設定する
Remote Desktop Client C:\Windows\System32\mstsc.exe
Teraterm C:\Program Files (x86)\teraterm\ttermpro.exe
Chrome C:\Program Files\Google\Chrome\Application\chrome.exe
  • CONFIGURE APPS
    • Template User にスイッチしてアプリケーションのデフォルト設定を実施する
    • 今回は何も実行しない
  • TEST
    • Test User でサインインし、インストールしたアプリが正常起動することを確認する
  • OPTIMIZE
    • [Launch]ボタンをクリックすると登録したアプリが自動起動し最適化が実行される
  • CONFIGURE IMAGE
    • ここで設定した Name がフリート設定時にイメージの選択肢として表示される
Name fumidai_win2019-20210124-001
Always use latest agent version On

[Disconnect and Create Image] ボタンをクリックするとデスクトップから切断され、スナップショットの作成が実行される。

AWS Console: AppStream2.0 ➡ Images ➡ Image Builder

30分程度でイメージのステータスが Snapshotting ➡ Stopped に遷移する。
今後アプリや設定のアップデートの際はこのイメージを更新し、都度 Image Assistant でスナップショットを追加していく。

4. Fleetを作成する

フリートは同じスナップショットからデプロイされた公開サーバ群のこと。
Citrix XenAppでいうマシンカタログに相当する。

AWS Console: AppStream2.0 ➡ Fleets ➡ Create Fleet

  • Fleet Details
Name fumidai_win2019_fleet
  • Choose imaga
    • Private でフィルタして、自身が作成したイメージのスナップショットを選択する
Image fumidai_win2019-20210124-001
  • Configure fleet
    • デプロイする公開サーバのスペック、フリートタイプ(課金タイプ)、セッション設定、キャパシティを設定する
    • 課金タイプが On-Demand の場合、Suspend状態の公開サーバにログオンする際120秒待ち時間が発生する
    • キャパシティ設定 = Auto Scaling設定 で、ユーザ接続数に応じてインスタンスをスケールする
Instance Family General Purpose
Choose instance type 2vCPU, 4GB RAM
Fleet Type details On-demand
Maximum session duration in minutes 960min
Disconnect timeout in minutes 15min
Idle disconnect timeout in minutes 15min
Minimum capacity 1
1以上にすること。0の場合インスタンスが全く起動しなかった。
Maximum capacity 5
Stream view application
デスクトップを公開する場合は Desktop を選択
Scaling Details default
IAM Role 設定しない
  • Configure Network
    • フリートをデプロイするサブネット、アタッチするセキュリティグループを設定する
    • イメージのカスタマイズ時と同様、既存のプライベート・サブネットを指定した
Default Internet Access Off
Subnet 既存のプライベート・サブネット
Security Group default

[Create] ボタンをクリックするとフリートのデプロイが開始される。

AWS Console: AppStream2.0 ➡ Fleets

30分程度でフリートのステータスが Starting ➡ Running に遷移する。

  • フリートタイプ = On-Demand の課金について
    • FleetをStopすると、全インスタンスが削除される。
    • Stopの状態でサービスの利用は出来ない。
    • 次回利用時はマニュアルでStartしてから、利用可能になるまで30分程度かかる。
    • Suspend中のインスタンスにも僅かに課金されるため、長期間使用しないならStopしておいた方がいい。

5. Stackの設定を作成する

公開するフリートとログインポータル設定、ユーザレベル設定のセットをStackと呼ぶ。
Citrix XenAppでいうデリバリーグループに相当。

AWS Console: AppStream2.0 ➡ Stacks ➡ Create Stack

  • Stack Details
    • ログインポータルに表示される名前、先の手順でデプロイしたフリート、アクセス経路を指定する
Name fumidai_for_myvpc
Display name Fumidai for MyVPC
ログインポータルに表示される名前
Fleets fumidai_win2019_fleet
Endpoint Internet
Embed Appstream2.0 何も設定しない
自前のWebサイトにAppStreamの画面を埋め込む時に使うらしい
  • Enable Storage
    • ユーザのログイン時、フリート内の公開サーバはランダム選出される(Floating)
    • Citrix XenApp等ではNASホームフォルダを用意するが、AppStream2.0の場合はS3を使用可能
    • S3バケットは自動的に作成される
    • Google Drive、MS OneDriveの指定も可能
    • ログアウト後もユーザ個別のアプリ設定を保持したい場合は、後述の User Settings で Enable application settings persistence をOnにする
Enable home folders On
  • Use Settings
Clipboard Copy and paste
Copyのみ、Pasteのみ、両方無効が選択可能
File transfer Upload and Download
Uploadのみ、Downloadのみ、両方無効が選択可能
Print to Local device Disabled
Password sign in for Active Directory Enabled
Smart card sign in for Active Directory Disaled
Enable application settings persistence On
Settings group fumidai_for_myvpc
複数のStackで設定置き場を共有したい場合にこのグループ名を指定する

6. ローカルユーザを作成してStackにアサインする

公開サーバログオン時のユーザ認証は、AppStreamのローカルユーザ、自身の所有しているActive DirectorySAMLのいずれかを構成出来る。
クライアントの接続元IPでアクセス制限を実行したい場合は、SAMLのIDプロバイダ側で制御する必要がある。例えばAzure ADの条件付きアクセス。

AppStreamのローカルユーザを使用する。

AWS Console: AppStream2.0 ➡ User Pool ➡ Create User

Emailは実在のメールアドレスを指定すること。
ユーザを作成したら、前のステップで作成したStackにアサインする。

AWS Console: AppStream2.0 ➡ User Pool ➡ ユーザを選択 ➡ Action ➡ Assign stack

アサインしたStack用のログインポータルのURLがユーザのEmailに送信される。
初回ログイン時はパスワードの初期化を要求される。ログイン後、公開アプリケーションのアイコンが表示されていれば成功!