
GenUを閉域ネットワークでデプロイしてみた
背景
インターネット接続が制限された環境に生成AIを導入する場合、GenUを閉域ネットワーク内で動かす必要がある。
GenUには closedNetworkMode という設定があり、有効にするだけで構成が自動的に閉域向けに切り替わる仕組み。
- 通常モード:CloudFront → S3(静的ホスティング)
- 閉域モード:ALB → ECS Fargate(VPC内部でホスティング)
この記事では閉域モードでのデプロイ手順と、実際にハマったポイントをまとめる。
構築環境
- OS: Windows 11
- Node.js: v18以上
- Docker Desktop: 起動済みであること(要注意)
- AWS CLI: 設定済み
- IAMユーザー: AdministratorAccess権限
事前準備:S3 Vectors × Knowledge Baseを手動作成する
GenUのCDKはRAGを有効化するとOpenSearch Serverlessをベクトルストアとして自動作成しようとする。OpenSearch Serverlessは最低2OCUで約$700/月の固定費が発生するため、検証用途には不向き。
代わりにS3 Vectorsをベクトルストアとして使うKnowledge Baseを手動作成し、そのIDをcdk.jsonに指定することでOpenSearch Serverlessの自動作成を回避できる。
1. ドキュメント用S3バケットを作成する
Knowledge Baseに取り込むドキュメント(PDF・TXTなど)を置くS3バケットを作成。
aws s3api create-bucket \
--bucket genu-kb-docs-<アカウントID> \
--region ap-northeast-1 \
--create-bucket-configuration LocationConstraint=ap-northeast-1
作成後、ドキュメントをアップロードしておく。メタデータフィルタリングを使う場合は同名の .metadata.json ファイルも一緒に配置(詳細は次の記事)。
2. S3 Vectorsバケットを作成する
ベクトルデータを保存するS3 Vectorsバケットを作成。通常のS3バケットとは別物で、ベクトル専用の特殊なバケット。
aws s3api create-bucket \
--bucket genu-kb-vectors-<アカウントID> \
--region ap-northeast-1 \
--create-bucket-configuration LocationConstraint=ap-northeast-1
通常のS3バケット(ドキュメント置き場)とS3 Vectorsバケット(ベクトル置き場)は別々に作成が必要。
3. Knowledge Baseを作成する
- AWSコンソール → Amazon Bedrock → Knowledge bases → 「Create knowledge base」
- Data source:手順1で作成したS3バケット(ドキュメント用)を選択
- Vector store:S3 Vectors を選択 → 手順2で作成したバケットを指定
- Embeddingモデル:
Amazon Titan Embeddings V2など - 作成完了後、Knowledge Base ID(例:
BV8IZDJGKL)をメモ
S3 VectorsはOpenSearch Serverlessと違い固定費なし。ベクトルデータの保存量に応じた従量課金のみ。
cdk.json の設定
packages/cdk/cdk.json の context にある以下の項目を変更する。デフォルトでは false や null になっているため、値を書き換える。
{
"context": {
"closedNetworkMode": true,
"createGenericAgentCoreRuntime": true,
"closedNetworkCreateTestEnvironment": true,
"closedNetworkCreateResolverEndpoint": true,
"ragKnowledgeBaseEnabled": true,
"ragKnowledgeBaseId": "<作成済みのKnowledge Base ID>"
}
}
各パラメータの意味:
| パラメータ | 説明 |
|---|---|
closedNetworkMode |
閉域モード有効化(CloudFront→ALB+ECS Fargate切り替え) |
createGenericAgentCoreRuntime |
AgentCore Runtimeを自動作成 |
closedNetworkCreateTestEnvironment |
Windows EC2を自動作成(VPC内からのアクセス確認用) |
closedNetworkCreateResolverEndpoint |
Route53 Resolver Endpointを自動作成 |
ragKnowledgeBaseEnabled |
RAGを有効化 |
ragKnowledgeBaseId |
事前に作成したKnowledge BaseのIDを指定 |
closedNetworkCreateTestEnvironment: true にしておくとVPC内にWindows EC2が自動作成されるため、手動でEC2を用意する手間が不要。
VPCエンドポイントについて
閉域モードではBedrockやECRなどのAWSサービスへの通信をVPCエンドポイント経由にする必要がある。GenUのCDKが自動で作成してくれるが、作成されるエンドポイント数に注意が必要。
今回のデプロイでは22個のエンドポイントが作成された。Gatewayタイプ(S3・DynamoDB)は無料だが、Interfaceタイプは1AZ・1個あたり約$0.014/時間の課金。
| タイプ | 数 | 料金 |
|---|---|---|
| Gateway(S3・DynamoDB) | 2個 | 無料 |
| Interface | 20個 | 約$0.28/時間(約$6.7/日) |
不要なサービスのエンドポイントを減らしたい場合は cdk.json で以下を設定:
{
"kendraEnabled": false,
"transcribeEnabled": false,
"speechToSpeechEnabled": false
}
検証後はVPCエンドポイントを必ず削除すること。放置すると課金が続く。
デプロイ手順
1. リポジトリをクローン
git clone https://github.com/aws-samples/generative-ai-use-cases
cd generative-ai-use-cases
npm install
npm install はルートディレクトリで実行。packages/cdk 配下で実行してもmonorepoの依存関係が解決されないため注意。
2. CDKブートストラップ(初回のみ)
cd packages/cdk
npx cdk bootstrap
3. デプロイ
npx cdk deploy --all --output C:/cdk-out
--output C:/cdk-out はOneDriveフォルダ内でDockerビルドするとEPERMエラーになるための回避策(後述)。30〜60分かかる。
4. デプロイ完了後にメモする値
ClosedNetworkStack のOutputsから:
WebUrl:GenUのURL(ALBのDNS名)WindowsRdpGetSSMKeyCommand:EC2へのRDP接続キー取得コマンド
GenerativeAiUseCasesStack のOutputsから:
UserPoolId:CognitoユーザープールIDUserPoolClientId:CognitoアプリクライアントID
EC2からGenUにアクセスする
WindowsRdpGetSSMKeyCommandのコマンドを実行してKey Pairをコピー- マネジメントコンソール → EC2 →
ClosedNetworkStackのインスタンスを選択 → 「Connect」 - 「RDP client」タブ → 「Fleet Manager Remote Desktop」→ Key Pairを貼り付けて接続
- EC2内のブラウザで
WebUrlを開く
GenUのログイン画面が表示されればデプロイ成功。
ハマりポイント
OneDriveフォルダでDockerビルドがEPERMエラー
CDKがDockerでLambdaのビルドをするとき、OneDriveの同期フォルダ内だとEPERMエラーが発生。
Error: EPERM: operation not permitted
--output オプションでOneDriveの外に出力先を変更することで回避可能。
npx cdk deploy --all --output C:/cdk-out
Docker Desktopが起動していない
CDKのデプロイ中にDockerを使う処理があるため、事前にDocker Desktopの起動が必要。起動し忘れると途中でエラーになる。
VPCエンドポイントが計画より多く作成された
計画では11個と見積もっていたが、実際には22個が作成された。Kendra・Polly・Transcribeのエンドポイントも含まれていたため。不要なサービスは cdk.json で明示的に無効化しておくことを推奨。
npm installはルートで実行する
packages/cdk 配下での npm install ではmonorepoの依存関係が解決されないため、ルートディレクトリでの実行が必要。
まとめ
GenUの閉域デプロイは closedNetworkMode: true を設定してCDKを流すだけで完結する構成。ただしVPCエンドポイントのコストが想定より増えやすいため、不要なサービスの無効化設定を事前に確認しておくことを推奨。
次の記事では、この閉域GenUにメタデータフィルタリングを追加して部署別アクセス制御を実装する。
GenUのRAGに部署別アクセス制御を追加した——Bedrock Knowledge Base メタデータフィルタリング