【AWS Service Catalog】GenUのオプションをマネコンから設定・デプロイしてみた
はじめに
GenU(Generative AI Use Cases JP)
では、デフォルトではRAGやKendraを使用した構成はfalse
になっています。
それらのオプションを使用するにはcdk.json
を変更してデプロイする必要があります。エンジニアであれば、いいですが、コードになじみがない方やSaaS化して、複数のアプリケーションをデプロイする場合などは毎回編集するのは、非効率です。
そこで、マネコン上でService Catalog
を使用して、製品化し、簡単にデプロイ&オプション変更ができるようにすれば、だれでも同じ設定で使用することが可能です。
その方法を検証してみました。
Service Catalogとは
AWS Service Catalogは、組織がAWS上で承認されたITサービスのカタログを作成・管理できるサービスです。
仮想マシンイメージ、サーバー、ソフトウェア、データベースから完全な多層アプリケーションアーキテクチャまで、あらゆるITサービスを含めることができます。
主要コンポーネント
-
ユーザーの種類
カタログ管理者: プロダクトのカタログを管理し、ポートフォリオに整理してエンドユーザーにアクセス権を付与
エンドユーザー: AWS Management Consoleを使用してアクセス権を付与されたプロダクトを起動 -
プロダクト(Products)
AWSでデプロイメント可能にしたいITサービス。EC2インスタンス、ストレージボリューム、データベース、監視設定、ネットワークコンポーネントなどの1つ以上のAWSリソースで構成 -
ポートフォリオ(Portfolios)
設定情報を含むプロダクトのコレクション。特定のプロダクトを誰が使用できるか、どのように使用できるかを管理するのに役立つ -
プロビジョニングされたプロダクト
エンドユーザーがプロダクトを起動した際にService Catalogによってプロビジョニングされるプロダクトのインスタンス(CloudFormationスタック) -
制約(Constraints)
特定のポートフォリオ内のプロダクトにエンドユーザーが起動時に適用されるルールを制御。制約が作成されると即座に有効になり、まだ起動されていないプロダクトの全ての現在のバージョンに適用
構成
- Lambda、API Gatewayなどのリソースは東京リージョン
- ClaudeなどのLLM基盤はバージニア北部リージョン
-
Service Catalog
では、modelRegion、modelIds、ragEnabledを変更できるようにする
GenUのリソースをダウンロード
下記からリソースをダウンロードしてください。
buildspec.yamlの作成
CodeBuild
で使用するbuildspec.yaml
を下記のように作成します。
modelRegion、modelIds、ragEnabledを編集してビルド時にcdk.json
を書き換えるようにしています。
このファイルをGenUのルートディレクトリ(package.jsonがあるディレクトリ)に置きます。
その後、その階層をzip化します。
version: 0.2
phases:
install:
runtime-versions:
nodejs: 20
build:
commands:
- echo "Updating cdk.json with Service Catalog parameters..."
- CDK_JSON_PATH="packages/cdk/cdk.json"
# ModelRegion はそのまま書き換え
- jq '.context.modelRegion = env.MODEL_REGION' $CDK_JSON_PATH > tmp.json && mv tmp.json $CDK_JSON_PATH
# MODEL_IDS を JSON 配列文字列に変換して書き込む
- |
MODEL_JSON=$(echo $MODEL_IDS | awk -F, '{for(i=1;i<=NF;i++){split($i,a,":"); printf "%s{\"modelId\":\"%s:%s\",\"region\":\"%s\"}", (i>1?",":""), a[1], a[2], a[3]}}')
jq ".context.modelIds=[$MODEL_JSON]" $CDK_JSON_PATH > tmp.json && mv tmp.json $CDK_JSON_PATH
# RAG_ENABLED をブール値として書き換え
- jq --argjson rag_enabled $(echo $RAG_ENABLED | tr '[:upper:]' '[:lower:]') '.context.ragEnabled = $rag_enabled' $CDK_JSON_PATH > tmp.json && mv tmp.json $CDK_JSON_PATH
- cat $CDK_JSON_PATH
- npm ci
- npx -w packages/cdk cdk bootstrap
- npm run cdk:deploy:quicks
S3の作成
buildspec.ymlを含み、zip化したリソースをS3のバケットに保存します。
Service Catalogで製品作成
製品作成
製品リストで製品を作成していきます。
ここでGenUをデプロイするためのリソース(CodePipelineやCodeBuild)やパラメーターの指定をするCloudFormationテンプレート
を作成・指定します。
以下のコードを参考に作成してください。
CloudFormationテンプレート
ポリシーなどはフルアクセスにしていますので、適宜調整してください。
AWSTemplateFormatVersion: '2010-09-09'
Description: Service Catalog product to deploy GenU pipeline with CodePipeline and CodeBuild
Parameters:
PipelineName:
Type: String
Default: "genu-pipeline"
Description: Name of the CodePipeline
S3BucketName:
Type: String
Description: S3 bucket containing the source artifact
S3ObjectKey:
Type: String
Description: S3 object key for the source zip file
CodeBuildProjectName:
Type: String
Default: "genu-build"
Description: Name of the CodeBuild project
# 追加パラメータ
ModelRegion:
Type: String
Default: "ap-northeast-1"
Description: Region to deploy AI models
ModelIds:
Type: CommaDelimitedList
Default: >
us.anthropic.claude-sonnet-4-20250514-v1:0:us-east-1,
us.anthropic.claude-opus-4-20250514-v1:0:us-east-1,
us.anthropic.claude-3-7-sonnet-20250219-v1:0:us-east-1,
us.anthropic.claude-3-5-haiku-20241022-v1:0:us-east-1,
us.amazon.nova-premier-v1:0:us-east-1,
us.amazon.nova-pro-v1:0:us-east-1,
us.amazon.nova-lite-v1:0:us-east-1,
us.amazon.nova-micro-v1:0:us-east-1,
us.deepseek.r1-v1:0:us-east-1
Description: Comma-separated list of model IDs with optional region
RagEnabled:
Type: String
Default: "false"
AllowedValues:
- "true"
- "false"
Description: Enable or disable RAG (Retrieval-Augmented Generation) functionality
Resources:
# CodeBuild Role
CodeBuildRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub "${CodeBuildProjectName}-Role"
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- codebuild.amazonaws.com
Action:
- sts:AssumeRole
Policies:
- PolicyName: CodeBuildFullAccessPolicy
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action: cloudformation:*
Resource: "*"
- Effect: Allow
Action: s3:*
Resource: "*"
- Effect: Allow
Action: ecr:*
Resource: "*"
- Effect: Allow
Action: iam:*
Resource: "*"
- Effect: Allow
Action: ssm:*
Resource: "*"
- Effect: Allow
Action: sts:AssumeRole
Resource: "*"
- Effect: Allow
Action: iam:PassRole
Resource: "*"
- Effect: Allow
Resource:
- !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/codebuild/${CodeBuildProjectName}"
- !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/codebuild/${CodeBuildProjectName}:*"
Action:
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
- Effect: Allow
Resource:
- !Sub "arn:aws:s3:::codepipeline-${AWS::Region}-*"
Action:
- s3:PutObject
- s3:GetObject
- s3:GetObjectVersion
- s3:GetBucketAcl
- s3:GetBucketLocation
- Effect: Allow
Resource:
- !Sub "arn:aws:codebuild:${AWS::Region}:${AWS::AccountId}:report-group/${CodeBuildProjectName}-*"
Action:
- codebuild:CreateReportGroup
- codebuild:CreateReport
- codebuild:UpdateReport
- codebuild:BatchPutTestCases
- codebuild:BatchPutCodeCoverages
# CodeBuild Project
CodeBuildProject:
Type: AWS::CodeBuild::Project
Properties:
Name: !Ref CodeBuildProjectName
ServiceRole: !GetAtt CodeBuildRole.Arn
Artifacts:
Type: CODEPIPELINE
Environment:
ComputeType: BUILD_GENERAL1_SMALL
Image: aws/codebuild/standard:7.0
Type: LINUX_CONTAINER
PrivilegedMode: true
EnvironmentVariables:
- Name: MODEL_REGION
Value: !Ref ModelRegion
- Name: MODEL_IDS
Value: !Join [",", !Ref ModelIds]
- Name: RAG_ENABLED
Value: !Ref RagEnabled
Source:
Type: CODEPIPELINE
# CodePipeline Role
CodePipelineRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub "${PipelineName}-Role"
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- codepipeline.amazonaws.com
Action:
- sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AWSCodeBuildAdminAccess
- arn:aws:iam::aws:policy/AmazonS3FullAccess
- arn:aws:iam::aws:policy/IAMReadOnlyAccess
# CodePipeline
GenUPipeline:
Type: AWS::CodePipeline::Pipeline
Properties:
Name: !Ref PipelineName
RoleArn: !GetAtt CodePipelineRole.Arn
ArtifactStore:
Type: S3
Location: !Ref S3BucketName
Stages:
- Name: Source
Actions:
- Name: Source
ActionTypeId:
Category: Source
Owner: AWS
Version: '1'
Provider: S3
OutputArtifacts:
- Name: SourceOutput
Configuration:
S3Bucket: !Ref S3BucketName
S3ObjectKey: !Ref S3ObjectKey
PollForSourceChanges: false
RunOrder: 1
- Name: Build
Actions:
- Name: Build
ActionTypeId:
Category: Build
Owner: AWS
Version: '1'
Provider: CodeBuild
InputArtifacts:
- Name: SourceOutput
OutputArtifacts:
- Name: BuildOutput
Configuration:
ProjectName: !Ref CodeBuildProjectName
RunOrder: 1
Outputs:
PipelineName:
Description: Name of the deployed CodePipeline
Value: !Ref PipelineName
CodeBuildProjectName:
Description: Name of the CodeBuild project
Value: !Ref CodeBuildProjectName
ModelRegion:
Description: Region used for models
Value: !Ref ModelRegion
ModelIds:
Description: List of model IDs
Value: !Join [",", !Ref ModelIds]
RagEnabled:
Description: RAG functionality enabled status
Value: !Ref RagEnabled
ポートフォリオ作成
次に、ポートフォリオ
を作成していきます。
ポートフォリオ名と所有者は入力必須です。
次にこのポートフォリオにアクセスできる権限を付与していきます。
今回は、作成した自らのアカウントでアクセスしたいので、使用しているロール名を指定しました。
次にこのポートフォリオに先ほど作成した製品を追加します。
これで完了です。
サイドバーの「プロビジョニング>製品」で作成した製品が表示されていればそのアカウントで使用することが可能です。
製品の起動
製品を起動し、デプロイしていきましょう。
製品起動の中で、パラメータ
という項目があります。
ここで先ほどのCloudFormationテンプレート
で指定した項目を表示することができます。
S3BucketName
では、GenUリソースが保存されているバケット名。
S3ObjectKey
では、zipのファイル名を指定してください。
入力し終えたら製品を起動
をクリックして開始してみましょう。
うまく起動できていれば、CodePipeline
やCodeBuild
、CloudFormation
でデプロイが確認できるので、エラー時などは確認してみましょう。
デプロイが完了したら、以下のスタックでGenUのURLが表示されるので、アクセスすることができます。
おわりに
以上でGenUのデプロイ&オプション設定をService Catalog経由で行う方法を確認できました。
今回紹介したmodelRegion、modelIds、ragEnabledといった基本的なオプションだけでなく、
CloudFormationテンプレートを拡張することで、利用者ごとに必要な構成やポリシーを柔軟に組み込むことが可能です。
これにより、エンジニアでなくても クリック操作だけで統一された環境をデプロイでき、SaaS的な提供や複数環境への展開も効率化できます。
Discussion