こんにちは!😁
山が好きな山本です
好きな山は仙ノ倉山(せんのくらやま)と瑞牆山(みずがきやま)です
最近は仙ノ倉山の紅葉を見てきました

この記事に書くこと
AWS Single Sign-On サービスを体験してみるために
以下の仕組みを作ってみることにしました
- 目的はVPC内にプライベートIPアドレスを使って公開している管理用サイトをインターネットから閲覧すること
- 閲覧には AppStream (の提供する WEBブラウザ) を利用する
- WEBブラウザは日本語入力ができること
- 一旦 FireFox とする
- AppStream へのログインユーザーは AWS Single Sign-On のユーザーとなる
- AWS Single Sign-Onにてログインユーザーを管理する
- AWS Single Sign-On の ログイン認証には ユーザーID/パスワードおよび多要素認証(トークン)を利用する
- AppStream のユーザープールには多要素認証機能が無いため AWS Single Sign-On を利用して補う
- 閲覧には AppStream (の提供する WEBブラウザ) を利用する
構成図は以下になります

補足
構成図においてはAWS Single Sign-On (以下 AWS SSO) と AppStream の AWS アカウントは異なります
しかし1つのAWS アカウントに作成しても構いません
同じようなことをする人が世の中にいるかもしれないため
手順を画像付きで残していきます
長くなります😁
ご容赦ください
目次
- AppStream の日本語版イメージ(提供アプリ=FireFox)を作成
- AppStream の Fleet を作成
- AppStream の Stack を作成
- AWS SSO にて 多要素認証を必須化
- AWS SSO にグループを作成しユーザーを追加
- AWS SSO と AppStream を連携
- AWS SSO にログインし 管理用サイトに接続可能なことを確認
1. AppStream の日本語版イメージ(提供アプリ=FireFox)を作成
ネットワーク周り
こちらのみ画像は割愛します
- VPC を 1つ作成してください
- 既存のVPCを使用する場合は作成しなくて大丈夫です
- プライベートサブネットを1つ作成してください
- マルチAZ にする場合は AZ を変えて2つ作成してください
- 管理サイトをホストするEC2 のセキュリティグループにおいて 作成したサブネットのCidrからの http/https 接続を許可してください
- 管理サイトをホストするEC2が別のVPCにある場合はルーティング追加もお願いします
- 上の構成図は同じVPC内の別サブネットに管理サイトをホストするEC2を配置している想定です
Image Builderの作成
AppStream のある AWSアカウントに権限のあるユーザーにログインください (権限については省略 時間あったら追記します)
AppStream のサービス画面から Launch Image Builder を押します

Step 1: Choose Image
管理サイトを閲覧する用途のため General Purpose の
Windows Server 2019 を選択
- AppStream-WinServer2019-10-08-2021

Step 2: Configure Image Builder
- Name, Display Name に任意の値を入力
- Instance Type は 以下を選択
- stream.standard.small
- 他はそのまま

Step 3: Configure Network
作成した VPC , Subnet を選択
セキュリティグループは Outbound 通信をすべて許可するルールがあるものを選択してください (defaultも可)

Step 4: Review
特に変更なし

15-20 分くらいで Running 状態になります

日本語化
作成したイメージビルダーを選択して[connect]を押します

Administrator にログインします

Settings から言語設定を変えていきます
[Time & Language]を押します

真ん中にある[Add a language] ("+"マーク) を押します

[日本語]を選択して[Next]を押します

[Install]を押します ※ You're currently offline ...というエラーはあるものの気にしないで大丈夫です

[Windows Display Language] (表示言語)を 日本語にします
また [Preferred languages] の一番上が日本語になるようにします

[Administrative language settings] を確認します

[Change system locale]を押します

Japanese(Japan) を選択し[OK]を押します

[Restart now] を押します ※ 実際に再起動はかかりません

[Copy settings...]を押します

2つチェックを入れ[OK]を押します

[Restart now] を押します ※ 実際に再起動はかかりません

[Date, time, & regional formatting]を押します

[Country or region] を Japan に設定します

言語設定を反映させるため再起動します
再起動するためには最初にセッションを切ります

マネジメントコンソールから Stop します

Stopping から Stopped になったら Start します

日本時間設定
再起動したイメージビルダーに [connect]し
Administrator にログインします

Powershell を起動します

以下のコマンドレットを打ちます
Set-TimeZone -Id "Tokyo Standard Time"

時刻が JST に変わります (Template User, Test User も変わります)
アプリケーション追加
Administrator にログインします

デスクトップの Image Assistant を起動します

[Add App]を押し WEBブラウザ(FireFox)を選択します ※ C:\Program Files (x86)\Mozilla Firefox\ 配下に存在

[Launch Parameters] に 管理サイトの URL を配置し[Save]を押します

[Next]を押します

[Switch User] を押し Template User にスイッチします


Image Assistant を起動し FireFox を起動します

テスト用管理サイトが出てくることを確認し「x」で閉じます

[Switch User] を押し Administrator に戻ります


[Save Settings] を押したあとに[Next]を押します

[Switch User] を押し Test User にスイッチします


Image Assistant を起動し FireFox を起動します (1クリック)

管理サイトが立ち上がり日本語も入力可能になっていることを確認します
「x」で閉じます

[Switch User] を押し Administrator に戻ります


[Next]を押します

右上の[Launch]を押します

ポップアップの[Continue]を押します

最適化のためにアプリケーションが起動してきます
「x」で閉じます

イメージに任意の名前をつけます

[Disconnect & Create Image]を押します

コネクションが切れます

AWSマネジメントコンソール上でイメージビルダーの Status が Snapshotting になります ※ 30分くらい待ちます
作成が終わると Stopped 状態になります

AWSマネジメントコンソールの[Image Registry]タブで[Private and shared with others]の中に作成したイメージができます


ようやく日本語のイメージ(FireFox)が出来ました \(^o^)/にっこり
2. AppStream の Fleet を作成
AppStream のサービス画面から[Fleets]枠内の[Create Fleet]を押します

任意の名前を付けて [Next]を押します (イメージと同じ名前にしました)
- kanri-site-20211027

作成したイメージを選択して[Next]を押します
- kanri-site-20211027

- Fleet type
- On-Demand
- instance type
- stream.standard.small
を選択して[Next]を押します

VPC ,サブネット, セキュリティグループを選択して [Next]を押します
マルチAZ にする場合は サブネットを 2つ選んでください

設定内容を確認して[Create]を押します

料金がかかるという警告が出るため同意して [Create]を押します
10分くらいかかるため
その間に Stack を作ることも可能です

作成完了すると Running 状態になります

3. AppStream の Stack を作成
AppStream のサービス画面から[Stacks]枠内の[Create Stack]を押します

Name, Display Name, Descriptionに任意の値を入力します
イメージ名、フリート名と同じ名前にしました (kanri-site-20211027)
Fleet は先程作成したものを選択します
[Next]を押します

ストレージは使用しないのでチェックを全て外し[Next]を押します

セキュリティ要件に応じて以下を設定します
- クリップボード連携の有無(Clipboard)
- ファイル連携の有無(File transfer)
- プリンタ連携の有無(Print to local device)
SSO と連携するため以下は Enabled にします
- Password sign in for Active Directory
以下は disabled にします
- Smart card sign in for Active Directory
他 はそのまま[Next]を押します

内容を確認し [Create]を押します

すぐに Active 状態になります

Stack で使用する Fleet が Runnning 状態になっていたら日本語のWEBブラウザ(FireFox)が使用可能になります \(^o^)/にっこり

4. AWS SSO にて 多要素認証を必須化
AWS SSO を有効化している AWS アカウントにログインします
AWS SSO のサービス画面を開きます
Settings の [Multi-factor authentication] 内の [configure] を押します

以下の 2箇所にチェックし[Save changes]を押します
- Every time they sign in (always-on)
- Require them to register an MFA device at sign in

5. AWS SSO にグループを作成しユーザーを追加
[Groups]枠内の [Create Group]を押します

任意のグループ名を入力し グループを作成します
イメージ名、フリート名、スタック名と同じ名前にしました (kanri-site-20211027)

[Users]枠内の [Add User]を押します

ユーザー名とメールアドレスを入力し
右下の[Next: Groups]を押します

作成したグループにチェックを入れ右下の [Add User]を押します

グループにユーザーが入りました

ユーザー登録したメールアドレスにメールが届いています
[Accept Invitation]をクリックします

新しいパスワードを登録します

メールに記載のユーザー名と変更後のパスワードを入力します


多要素認証アプリの設定をしログインします


今はアプリケーションを割り当てていないため以下のような画面になります
一旦はここまで確認しておきます

メール認証すると AWSマネジメントコンソール で ユーザーの Status が Enabled になります

6. AWS SSO と AppStream を連携
AWS SSO を有効化している AWS アカウントにログインします
AWS SSO の [Application] 枠内にある[Add a new application]を押します

[Add a custom SAML 2.0 application]を押します

Display name と Description に任意の値を入力します
イメージ名、フリート名、スタック名と同じ名前にしました (kanri-site-20211027)
Relay state に以下を入力します
※「AWSアカウント番号12桁ハイフン無し」と「AppStreamのスタック名」は読み替えましょう
- https://appstream2.ap-northeast-1.aws.amazon.com/saml?accountId=AWSアカウント番号12桁ハイフン無し&stack=AppStreamのスタック名
[If you don't have a metadata file, you can manually type your metadata values.]を押します
Application ACS URL に以下を入力します
Application SAML audience に以下を入力します
- urn:amazon:webservices
[Save Changes]を押します

[AWS SSO SAML metadata] を [Download] を押してダウンロードします

AppStream の AWS アカウントにログインします
IAMのサービス画面にて IDプロバイダを作成します
命名規則に注視して作成してください
- プロバイダ名
- AWS_SSO_<AppStreamスタック名>
- 例:AWS_SSO_kanri-site-20211027
- AWS_SSO_<AppStreamスタック名>
また
AWS SSO のアプリケーション作成時にダウンロードしたメタデータファイルをアップロードしてください
その後に[プロバイダを追加]を押します

作成したら IDプロバイダ の ARN をメモしておきます
そのあと [ロールの割当て]を押します

[新しいロールを割当て]を選択します

以下を入力し[次のステップ...]を押します
- 属性:SAML:sub_type
- 値:persistent

ポリシーは何も付けません

タグも付けず
任意の名前でロールを作成します
ロールのARN をメモします

ロールにインラインポリシーを1つ付けます
名前は任意
※「AWSアカウント番号12桁ハイフン無し」と「AppStreamのスタック名」は読み替えましょう
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "appstream:Stream",
"Resource": "arn:aws:appstream:ap-northeast-1:AWSアカウント番号12桁ハイフン無し:stack/AppStreamのスタック名",
"Condition": {
"StringEquals": {
"appstream:userId": "${saml:sub}"
}
}
}
]
}

AWS SSO を有効化している AWS アカウントにログインします
AWS SSO のサービス画面を開きます
AWS SSO の [Application] 枠内にある作成したアプリケーションを選択し
[Attribute mappings]タブを開きます

以下の値を入力していきます
- 1行目
- Subject
- ${user:email}
- persistent
- 2行目
- https://aws.amazon.com/SAML/Attributes/RoleSessionName
- ${user:email}
- unspecified
- 3行目
- https://aws.amazon.com/SAML/Attributes/Role
- <ロールARN>,<IDプロバイダARN>
- unspecified
※メモしたロールのARNとID プロバイダのARN
[Save Changes]を押します

[Assigned Users]タブに移動します
[Assign Users]を押します
作成したグループをチェックし[Assign Users]を押します

7. AWS SSO にログインし 管理用サイトに接続可能なことを確認
AWS SSO の User portal URLにアクセスします

ユーザー名を入力します

パスワードを入力します

MFAコード(トークン)を入力します


アプリケーションを押します

AppStream 内の FireFox のアイコンを押します

On-Demand モードなので起動時間の2-3分待ちます
デフォルトでは 15分間までセッションを保持するため
15分以内の接続はこの起動待ちが無くなります
後から保持期間を長くすることも出来ます (その分料金に跳ねます)

ロードが始まります

管理用サイトを表示していることを確認します
「デフォルトのブラウザにしますか?」というポップアップはどうしても出てしまうようです ^^;

アドレスバーに検索文字列を入れてみます
→インターネットには出れません(VPC内通信のみ)

画面右上の[LOG OUT]ボタンを使い ログアウトします

ようやくできました\(^o^)/にっこり
あとはユーザーが増えたら AWS SSO のグループに追加していけば良さそうです
AppStream のスケールは必要に応じて実施という感じですね
なにかの参考になると幸いです!
参考情報
社内のAppStreamブログ
AWSのドキュメント aws.amazon.com