はじめに
業務でGenU(Generative AI Use Cases)の閉域モードを触ることが多いので、記事にしてみました!
閉域モードを利用することで、インターネットを経由せずにGenUを利用することができます。
※オンプレ側とAWSが閉域でつなげる部分については記載していません。(DirectConnectやSite-to-Site等)
参考
AWS公式の資料です。一部文章を引用させていただいてます。
https://github.com/aws-samples/generative-ai-use-cases
https://aws-samples.github.io/generative-ai-use-cases/ja/CLOSED_NETWORK.html
閉域モードのアーキテクチャ
閉域モードを有効にするとフロントがCloudFrontからALB+Fargateに代わり、VPC内にデプロイされます。
各種AWSサービスにはVPCエンドポイントを経由して接続する構成です。
現状の制約(公式抜粋)
- GenU自体は閉域ですが、デプロイはインターネットにつながる環境で行う必要があります。また、動作検証環境にはマネコンからアクセスするため、その場合もインターネット疎通が必要になります。
- デプロイにはIAM権限の付与とNode.js,aws-cdk,dockerのインストールが必要です。
- GenU がデプロイされるリージョンとモデルのリージョンは同一である必要があります。GenU を ap-northeast-1 にデプロイし、us-east-1 のモデルを利用するといったことは現状できません。
- 様々なリソースを作成するため、既存の VPC をインポートする場合は可能な限り clean な環境を利用することを推奨します。
- SAML 連携は利用できません。
- Voice Chat のユースケースは現状利用できません。
クローン
下記のGithubURLにてプロジェクトフォルダにクローンを行います。
https://github.com/aws-samples/generative-ai-use-cases.git
閉域モード用のオプション
オプションは/generative-ai-use-cases/packages/cdk/cdk.jsonを編集して構築時のオプションを変更します。
閉域関連のオプションは次の部分です。(記載はデフォルト値)
closedNetworkModeをtrueにすることで閉域モードに変更できます。
"closedNetworkMode": false,
"closedNetworkVpcIpv4Cidr": "10.0.0.0/16",
"closedNetworkVpcId": null,
"closedNetworkSubnetIds": null,
"closedNetworkCertificateArn": null,
"closedNetworkDomainName": null,
"closedNetworkCreateTestEnvironment": true,
"closedNetworkCreateResolverEndpoint": true,
各オプションの詳細
| パラメータ | 説明 |
|---|---|
| closedNetworkMode | 閉域モードにするかどうか。true だと閉域モード。デフォルトは false。 |
| closedNetworkVpcIpv4Cidr | VPC を新規作成する場合に指定する IPv4 の CIDR。デフォルトでは 10.0.0.0/16。 |
| closedNetworkVpcId | VPC をインポートする場合の VPC ID。こちらを指定しないと VPC は新規作成になる。 |
| closedNetworkSubnetIds | GenU 関連のリソースをデプロイする Subnet の ID を複数指定。ALB、Fargate タスク、VPC Endpoint、Resolver Endpoint が作成される。こちらは指定しないと Isolated な Subnet が選択される。2 つ以上の Subnet ID を配列で指定する。 |
| closedNetworkCertificateArn | GenU にドメインを付与する場合に指定する ACM の ARN。ACM は手動で生成する。指定しない場合、GenU は Application Load Balancer のデフォルトのエンドポイントで公開される。 |
| closedNetworkDomainName | GenU のドメイン名。Private Hosted Zone は CDK が生成するため、手動作成不要。closedNetworkCertificateArn と closedNetworkDomainName は両方指定するか、両方指定しないかのどちらかである必要あり。 |
| closedNetworkCreateTestEnvironment | 検証環境を作成するかどうか。デフォルトで作成する。必要ない場合は false を指定する。検証環境は EC2 の Windows インスタンスとして作成し、Fleet Manager 経由でアクセスする。 |
| closedNetworkCreateResolverEndpoint | Route53 の Resolver Endpoint を生成するかどうか。デフォルトで true。 |
デプロイ
デプロイは通常と同様の手順で行います。
cd generative-ai-use-cases
npm ci
npx -w packages/cdk cdk bootstrap
npm run cdk:deploy
# 確認事項をスキップして高速デプロイ
npm run cdk:deploy:quick
DNSサーバの調整
閉域モードではオンプレNWのDNS調整が必要です。
フォワーダーを利用する場合
次の2つが前提条件になります。
- オンプレから AWS に接続するルートはすでに確立している。(ClosedNetworkStack で作成した or にインポートした VPC の IP アドレスを指定すれば、その先のリソースにたどり着ける状態のことです。)
- Route53 の Resolver Endpoint は作成済み。(Resolver Endpoint は closedNetworkCreateResolverEndpoint を true にしてデプロイすることで作成されます。このパラメータはデフォルトで true です。)
クライアントから名前解決が必要なエンドポイントは以下の通りです。<> で囲まれた箇所は実際の値に置き換えが必要です。
| サービス名 | 役割 | エンドポイント | エンドポイントの確認方法 |
|---|---|---|---|
| Application Load Balancer | Web 静的ファイルのサーバー | 独自ドメイン or internal-<aaa>.<region>.elb.amazonaws.com | ClosedNetworkStack の出力の WebUrl で確認 |
| API Gateway | メインの API | <xxx>.execute-api.<region>.amazonaws.com | GenerativeAiUseCasesStack の出力の ApiEndpoint で確認 |
| Cognito User Pool | 認証 | cognito-idp.<region>.amazonaws.com | エンドポイントは固定 |
| Cognito Identity Pool | 一時認証情報の取得 | cognito-identity.<region>.amazonaws.com | エンドポイントは固定 |
| Amazon S3 | 署名付き URL | s3.<region>.amazonaws.com | エンドポイントは固定 |
| AWS Lambda | ストリーミング出力 | lambda.<region>.amazonaws.com | エンドポイントは固定 |
| Amazon Transcribe | 文字起こし | transcribe.<region>.amazonaws.com | エンドポイントは固定 |
| Amazon Transcribe Streaming | リアルタイム文字起こし | transcribestreaming.<region>.amazonaws.com | エンドポイントは固定 |
| Amazon Polly | 文字の読み上げ | polly.<region>.amazonaws.com | エンドポイントは固定 |
| Bedrock AgentCore Runtime | AgentCore Runtime の実行 | bedrock-agentcore.<region>.amazonaws.com | エンドポイントは固定 |
■公式記載の注意
上の表のすべてのエンドポイントのリゾルバー (フォワーダー) として Resolver Endpoint の IP アドレスを指定するように DNS サーバーの設定を変更してください。
Resolver Endpoint の IP アドレスは、Route53 を開き、Inbound endpoints を選択して、作成したエンドポイントをクリックすることで確認できます。
なお、「Application Load Balancer に独自のドメインを設定している場合」を除き、すべてのエンドポイントは amazonaws.com ドメインです。
そのため、amazonaws.com のリゾルバーとして Resolver Endpoint の IP アドレスを指定する方法が最も簡略的な設定です。ただし、この設定は対象範囲が広く、副作用が大きいため、各エンドポイントの FQDN で設定をいれることを強く推奨いたします。
hostsファイルを設定して動作検証する場合
端末のhostsファイルに設定する場合はそれぞれのVPCエンドポイントのIPとFQDNを記載する必要があります。
IPが変更される可能性がある+冗長性もないのであくまで動作検証向きになります。
| サービス名 | 役割 | エンドポイント | IP アドレスの確認方法 |
|---|---|---|---|
| Application Load Balancer | Web 静的ファイルのサーバー | 独自ドメイン or internal-<aaa>.<region>.elb.amazonaws.com | 方法1 |
| API Gateway | メインの API | <xxx>.execute-api.<region>.amazonaws.com | 方法2 |
| Cognito User Pool | 認証 | cognito-idp.<region>.amazonaws.com | 方法2 |
| Cognito Identity Pool | 一時認証情報の取得 | cognito-identity.<region>.amazonaws.com | 方法2 |
| Amazon S3 | 署名付き URL | <S3 バケット名>.s3.<region>.amazonaws.com | 方法2 |
| AWS Lambda | ストリーミング出力 | lambda.<region>.amazonaws.com | 方法2 |
| Amazon Transcribe | 文字起こし | transcribe.<region>.amazonaws.com | 方法2 |
| Amazon Transcribe Streaming | リアルタイム文字起こし | transcribestreaming.<region>.amazonaws.com | 方法2 |
| Amazon Polly | 文字の読み上げ | polly.<region>.amazonaws.com | 方法2 |
| Bedrock AgentCore Runtime | AgentCore Runtime の実行 | bedrock-agentcore.<region>.amazonaws.com | 方法2 |
注意点
APIやS3などは利用されるS3毎にhostsを記載する必要があります。
例(自分が引っかかった所):
テキストファイルと音声ファイルではアップロード先のS3バケットが違うのでそれぞれでhostsを記載する必要あり
| ファイルの種類 | バケット名 |
|---|---|
| テキストファイル等 | generativeaiusecasesstack-apifilebucketxxxxxxxxx.s3.<region>.amazonaws.com |
| 音声ファイル | generativeaiusecasesstack-transcribeaudiobucketxxxxxxxxxxx.s3.<region>.amazonaws.com |
終わりに
閉域モードのGenUデプロイについて紹介してみました!
現状色々と制限はありますが、インターネットに出ないので医療分野や自治体にマッチしやすいと感じています。(自治体向けAIサービス「源内」もGenUが元ですし!)
興味があればぜひ触ってみてください!
