ガバメント AI 源内の AI インターフェース(genai-web)は、ユーザー認証に Cognito を使っており、デフォルトではメールアドレスを使ったパスワード認証をするようになっています。
genai-web は SAML で外部 IdP からシングルサインオンできるオプションがあるので、Entra ID を使った genai-web へのシングルサインオンを設定してみました。
また、genai-web のフロントは CloudFront となっており、デフォルトでは CloudFront のディストリビューションドメイン名にアクセスするよう設定されています。これを独自のカスタムドメイン名でアクセスするようにしてみます。
genai-web に Entra ID でシングルサインオンを設定
手順の概要
genai-web に Entra ID でシングルサインオンを設定する手順の概要は次のとおりです。
- 一旦デフォルトの手順で genai-web を CDK でデプロイ
- デプロイされた Cognito ユーザープールに Cognito ドメインを作成し、SAML で使う識別子と応答 URL を確認
- Entra ID でエンタープライズアプリを作成し、SAML によるシングルサインオンを設定
- Cognito ユーザープールに SAML ID プロバイダーとして Entra ID を追加
- genai-web のパラメーター設定を SAML に対応するよう変更して再度 CDK でデプロイ
それでは早速実際の手順を見ていきます。
genai-web のデプロイ(暫定)
genai-web のドキュメントの事前準備 は完了してることとします。
まずは デプロイ手順 に沿って、一旦普通に genai-web をデプロイします。
genai-web のデプロイに最低限必要な手順
packages/cdk/env-parameters にあるファイルに genai-web の設定に必要なパラメーターが定義されています。
テンプレートファイルをデプロイしたい環境(production, staging, develop など)に合わせたファイル名でコピーします。ここではコピーしたファイルを self-hosting-dev.ts としました。
$ cd packages/cdk/env-parameters
$ cp self-hosting-template.ts self-hosting-dev.ts
コピーしたファイルを編集し、他のファイルへ参照させる定数名を環境に合わせて変更し、appEnv に環境名を定義します。
- export const selfHostingTemplateParams: Partial<StackInput> = {
+ export const selfHostingDevParams: Partial<StackInput> = {
- appEnv: 'your-environment-name',
+ appEnv: 'dev',
packages/cdk/parameter.ts に上記のファイルの定数をインポートし、環境ごとのパラメーターを定義します。
+ import { selfHostingDevParams } from "./env-parameters/self-hosting-dev";
// デプロイ先環境ごとのパラメータを定義する
const deploy_envs: Record<string, Partial<StackInput>> = {
+ "-selfHostingDev": selfHostingDevParams,
// 他の環境も追加可能
};
ファイルの編集が終わったら CDK Deploy を実行します。
$ npm -w packages/cdk run cdk -- deploy --all --require-approval never -c env=-selfHostingDev
なお、デプロイ先は東京リージョンとしました。
genai-web は us-east-1 にもリソースが作られるので注意
genai-web をデプロイする時に気を付けるポイントは、デプロイ先のリージョンを例えば東京リージョンにするとしても、us-east-1 リージョンにも CDK Bootstrap が必要になることです。
これは、genai-web が CloudFront を使うためで、地方自治体のガバメントクラウド利用のように、Organizations のサービスコントロールポリシーで使用するリージョンを国内などに限定しているケースでは、事前に管理者へサービスコントロールポリシーを確認しましょう。
Cognito ドメインの作成
genai-web のデプロイができたら、デプロイされた Cognito ユーザープールに Cognito ドメインを作成します。
次にユーザープールの概要からユーザープール ID を確認します。
SAML 設定に使用する次の値をメモしておきます。
| 項目 | 値 |
|---|---|
| 識別子 | urn:amazon:cognito:sp:確認したユーザープールID
|
| 応答 URL | https://設定した Cognito ドメイン名.auth.ap-northeast-1.amazoncognito.com/saml2/idpresponse |
Entra ID のエンタープライズアプリの作成
Entra 管理センターから Entra ID の「エンタープライズアプリ」で「独自のアプリケーションの作成」に進み、任意の名前でエンタープライズアプリケーションを作成します。
作成したエンタープライズアプリケーションの「シングル サインオン」から「SAML」を選択します。
「基本的な SAML 構成」から「識別子(エンティティ ID)」と「応答 URL(Assertion Consumer Service URL)」にそれぞれ Cognito で設定した値を設定します。
設定できたら、Cognito へ連携する属性として「emailaddress」を使うこととし、「フェデレーション メタデータ XML」を後で Cognito へ連携するためにダウンロードします。
ユーザーの割当て
エンタープライズアプリケーションに、genai-web へシングルサインオンさせたい Entra ID のユーザーを割り当てます。
ここまでで Entra ID 側の設定は完了です。
Cognito に SAML ID プロバイダーを追加
Cognito ユーザープールに戻り、「ソーシャルプロバイダーと外部プロバイダー」から SAML 2.0 アイデンティティプロバイダーを設定します。
「プロバイダー名」に任意の名前を設定します。
「メタデータドキュメント」には Entra ID で SAML を作成した時にダウンロードした XML ファイルをアップロードします。
「ユーザープール属性」を「email」、「SAML 属性」は Entra ID の SAML に設定した「emailaddress」を設定します。
genai-web の env-parameters を修正
genai-web の packages/cdk/env-parameters に作成した環境設定ファイル(self-hosting-dev.ts など)の以下の値を修正します。
| 値 | 項目 | 備考 |
|---|---|---|
| samlAuthEnabled | true | |
| samlCognitoDomainName |
設定した Cognito ドメイン名.auth.ap-northeast-1.amazoncognito.com |
|
| samlCognitoFederatedIdentityPrimaryProviderName | SAML ID プロバイダーに設定したプロバイダー名 |
設定ファイルが samlCognitoFederatedIdentityProviderName と誤った項目名になっている |
- samlAuthEnabled: false,
+ samlAuthEnabled: true,
- // samlCognitoDomainName: 'your-app.auth.ap-northeast-1.amazoncognito.com',
+ samlCognitoDomainName: 'test01-dev-genai-web.auth.ap-northeast-1.amazoncognito.com',
- // samlCognitoFederatedIdentityProviderName: 'EntraID',
+ samlCognitoFederatedIdentityPrimaryProviderName: 'test01-dev-genai-web',
再度 CDK Deploy を実行
設定が終わったら、再度 CDK Deploy を実行します。(以下は環境設定を selfHostingDev としたときのコマンド例)
$ npm -w packages/cdk run cdk -- deploy --all --require-approval never -c env=-selfHostingDev
デプロイに成功したら CloudFront の URL が出力されているので、これに Web ブラウザーからアクセスしてみます。
SAML のシングルサインオン設定が成功していたら、Entra ID の認証画面に遷移します。
Entra ID で作成したエンタープライズアプリケーションに割り当てたユーザーで認証すると、genai-web の画面に戻り、ログインに成功します。
genai-web のグループ設定
genai-web は Cognito ユーザープールのグループで、グループに所属するユーザーの権限を設定しています。シングルサインオンしたユーザーのグループ分けは自動で行われないため、Cognito ユーザープールの管理画面からシングルサインオンユーザーを適宜グループに追加します。
なお、グループの権限は genai-web の チーム管理権限表 に詳細が書かれています。
ここまでの手順で CloudFront のディストリビューションドメイン名にアクセスすれば genai-web を使えるようになりました。
本番運用を考えると、genai-web へ独自ドメインでアクセスしたいと思うので、続けてカスタムドメインの設定をしていきます。
genai-web のカスタムドメインの設定
手順の概要
genai-web のカスタムドメインの設定の手順の概要は次のとおりです。
- AWS Certificate Manager でパブリック証明書を発行
- CloudFront のディストリビューションドメイン名を自身が管理するドメインの CNAME に設定
- パラメーターを修正して再度 CDK Deploy を実行
詳細手順を見ていきます。
AWS Certificate Manager でパブリック証明書を作成
AWS Certificate Manager(ACM)で HTTPS に使うパブリック証明書を作成します。ここで注意なのは、パブリック証明書は CloudFront で使うことになるので、us-east-1 リージョン に作る必要があります。
ACM のパブリック証明書を作成するには自身が管理しているドメインの設定が必要です。
ドメインは、Route 53 で新規取得するか既存のドメインのサブドメインを委譲してホストゾーンで管理する方法と、AWS 外のサービスで管理する既存のドメインを使う方法がありますが、ここでは AWS 外のサービスで管理している既存のドメインを使うことにしました。
まずは ACM で「パブリック証明書のリクエスト」に進みます。
ドメインを管理するサービスでパブリック証明書の DNS 検証を行うため、「CNAME 名」と「CNAME 値」を確認します。
カスタムドメインをドメイン管理サービスで設定
ドメインを管理するサービスにて CNAME 名をホスト名として CNAME 値を返すように設定します。
また、併せて CloudFront のディストリビューションドメイン名の CNAME を設定し、カスタムドメイン名で CloudFront へアクセスできるように設定しておきます。
以下はさくらのドメインで、ホスト名を genai-web に、カスタムドメインとしてサブドメイン app.morori.jp を設定した例です。
ACM で証明書のステータスが成功となっていればパブリック証明書の発行が完了です。後で必要になるのでパブリック証明書の ARN を控えておきます。
パラメーターをカスタムドメインに合わせて修正
packages/cdk/env-parameters のファイルに定義されているパラメーターをカスタムドメインに合わせて修正します。
| 項目 | 値 |
|---|---|
| hostName | 設定したホスト名 |
| domainName | 設定したサブドメイン名 |
| certificateArn | 発行したパブリック証明書の ARN |
- // hostName: 'genai',
+ hostName: 'genai-web',
- // domainName: 'example.com',
+ domainName: 'app.morori.jp',
- // certificateArn: 'arn:aws:acm:us-east-1:123456789012:certificate/your-certificate-id',
+ certificateArn: '`発行したパブリック証明書の ARN`',
再度 CDK Deploy を実行
パラメーターの修正が終わったら、再度 CDK Deploy を実行します。
CloudFront の「代替ドメイン名」と「カスタム SSL 証明書」にこれまで設定したドメインやパブリック証明書が設定されていることが分かります。
これでカスタムドメイン名にて genai-web へアクセスすることができました。
genai-web のシングルサインオンとカスタムドメインの設定まとめ
ガバメント AI 源内の AI インターフェースである genai-web は、Entra ID など外部 IdP でシングルサインオンが可能です。また、独自ドメインを設定できるので、エンタープライズ環境で使う時にはありがたい機能です。
ガバメントクラウドで地方自治体が genai-web を使う場合の留意点
最初にも触れましたが、genai-web をデプロイする場合、us-east-1 リージョンで一部の API の実行が必要です。そのため、地方自治体が現状でガバメントクラウド環境へそのままデプロイできるかは、デジタル庁が管理する Organizations のサービスコントロールポリシーなどで制限がないか事前に確認する必要があると思われます。
今回検証した結果、genai-web のデプロイには us-east-1 リージョンで以下の API が許可されている必要がありました。
- acm-pca:ListCertificateAuthorities
- cloudformation:CreateChangeSet
- cloudformation:DeleteChangeSet
- cloudformation:DeleteStack
- cloudformation:DescribeChangeSet
- cloudformation:DescribeStackEvents
- cloudformation:DescribeStacks
- cloudformation:ExecuteChangeSet
- cloudformation:GetTemplate
- cloudformation:ListStackResources
- cloudformation:ListStacks
- ecr:CreateRepository
- ecr:DeleteRepository
- ecr:DescribeRepositories
- ecr:PutLifecyclePolicy
- ecr:SetRepositoryPolicy
- ecr:TagResource
- s3:AbortMultipartUpload
- s3:CreateBucket
- s3:DeleteBucketPolicy
- s3:DeleteObject
- s3:PutObject
- s3:GetBucketLocation
- s3:GetBucketPolicy
- s3:GetObject
- s3:PutBucketPolicy
- s3:PutBucketPublicAccessBlock
- s3:PutBucketVersioning
- s3:PutEncryptionConfiguration
- s3:PutLifecycleConfiguration
- ssm:DeleteParameter
- ssm:DescribeParameters
- ssm:GetParameter
- ssm:GetParameters
- ssm:PutParameter
















