😊

【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サービスを含めることができます。

主要コンポーネント

  1. ユーザーの種類
    カタログ管理者: プロダクトのカタログを管理し、ポートフォリオに整理してエンドユーザーにアクセス権を付与
    エンドユーザー: AWS Management Consoleを使用してアクセス権を付与されたプロダクトを起動
  2. プロダクト(Products)
    AWSでデプロイメント可能にしたいITサービス。EC2インスタンス、ストレージボリューム、データベース、監視設定、ネットワークコンポーネントなどの1つ以上のAWSリソースで構成
  3. ポートフォリオ(Portfolios)
    設定情報を含むプロダクトのコレクション。特定のプロダクトを誰が使用できるか、どのように使用できるかを管理するのに役立つ
  4. プロビジョニングされたプロダクト
    エンドユーザーがプロダクトを起動した際にService Catalogによってプロビジョニングされるプロダクトのインスタンス(CloudFormationスタック)
  5. 制約(Constraints)
    特定のポートフォリオ内のプロダクトにエンドユーザーが起動時に適用されるルールを制御。制約が作成されると即座に有効になり、まだ起動されていないプロダクトの全ての現在のバージョンに適用

構成

  • Lambda、API Gatewayなどのリソースは東京リージョン
  • ClaudeなどのLLM基盤はバージニア北部リージョン
  • Service Catalogでは、modelRegionmodelIdsragEnabledを変更できるようにする

GenUのリソースをダウンロード

下記からリソースをダウンロードしてください。
https://github.com/aws-samples/generative-ai-use-cases?tab=readme-ov-file

buildspec.yamlの作成

CodeBuildで使用するbuildspec.yamlを下記のように作成します。
modelRegionmodelIdsragEnabledを編集してビルド時にcdk.jsonを書き換えるようにしています。
このファイルをGenUのルートディレクトリ(package.jsonがあるディレクトリ)に置きます。
その後、その階層をzip化します。

buildspec.yml
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テンプレート

ポリシーなどはフルアクセスにしていますので、適宜調整してください。

genu-cdk-parameter.yml
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のファイル名を指定してください。

入力し終えたら製品を起動をクリックして開始してみましょう。

うまく起動できていれば、CodePipelineCodeBuildCloudFormationでデプロイが確認できるので、エラー時などは確認してみましょう。

デプロイが完了したら、以下のスタックでGenUのURLが表示されるので、アクセスすることができます。

おわりに

以上でGenUのデプロイ&オプション設定をService Catalog経由で行う方法を確認できました。
今回紹介したmodelRegion、modelIds、ragEnabledといった基本的なオプションだけでなく、
CloudFormationテンプレートを拡張することで、利用者ごとに必要な構成やポリシーを柔軟に組み込むことが可能です。

これにより、エンジニアでなくても クリック操作だけで統一された環境をデプロイでき、SaaS的な提供や複数環境への展開も効率化できます。

GitHubで編集を提案

Discussion