ankuro.dev
← ブログ一覧に戻る
GenUを閉域ネットワークでデプロイしてみた
2026-03-16#AWS#GenU#CDK#Bedrock#閉域#VPC

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を作成する

  1. AWSコンソール → Amazon BedrockKnowledge bases → 「Create knowledge base」
  2. Data source:手順1で作成したS3バケット(ドキュメント用)を選択
  3. Vector store:S3 Vectors を選択 → 手順2で作成したバケットを指定
  4. Embeddingモデル:Amazon Titan Embeddings V2 など
  5. 作成完了後、Knowledge Base ID(例:BV8IZDJGKL)をメモ

S3 VectorsはOpenSearch Serverlessと違い固定費なし。ベクトルデータの保存量に応じた従量課金のみ。


cdk.json の設定

packages/cdk/cdk.jsoncontext にある以下の項目を変更する。デフォルトでは falsenull になっているため、値を書き換える。

{
  "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ユーザープールID
  • UserPoolClientId:CognitoアプリクライアントID

EC2からGenUにアクセスする

  1. WindowsRdpGetSSMKeyCommand のコマンドを実行してKey Pairをコピー
  2. マネジメントコンソール → EC2 → ClosedNetworkStack のインスタンスを選択 → 「Connect」
  3. 「RDP client」タブ → 「Fleet Manager Remote Desktop」→ Key Pairを貼り付けて接続
  4. 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 メタデータフィルタリング