0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GenU のバックエンド (CDK) 詳細解説  ⑩GenerativeAiUseCasesStack > Database, Api スタックの確認

Last updated at Posted at 2025-03-24

はじめに

皆さん、こんにちは。

私は業務でデータ利活用基盤を取り扱っていること、2024 AWS Japan Top Engineer に選出されたということから、AWS GenU およびそれに必要なデータ基盤の探求 (Snowflake, dbt, Iceberg, etc) に取り組む必要があると考えています。

本投稿では、GenU のバックエンドである CDK コードを詳細に解説します。
自身そして閲覧して頂いた皆様の GenU への理解が少しでも深まり、生成 AI の民主化につながっていければと考えています。

前回までのおさらい

前回までで、以下が完了しました。

GenU の CDK は最大で以下の 6 つの子スタックを作成します。

  • CloudFrontWafStack
  • RagKnowledgeBaseStack
  • AgentStack
  • GuardrailStack
  • GenerativeAiUseCasesStack ※メインスタック
  • DashboardStack

第 9 回から GenU 内の本丸である GenerativeAiUseCasesStack スタックを解説しています。

GenerativeAiUseCasesStack スタック

GenerativeAiUseCasesStack スタックでは、以下のリソースを作成しています。

image.png

  • Auth
  • Database
  • Api
  • CommonWebAcl
  • Web
  • Rag
  • RagKnowledgeBase
  • UseCaseBuilder
  • Transcribe

今回は Database, Api リソースを解説していきます。

GenerativeAiUseCasesStack > Database リソース

Database リソースは、アーキテクチャ図でいうと以下の赤枠の部分にあたります。

image.png

Database リソースの実体は packages/cdk/lib/construct/database.ts にあります。
以下のソースコードが Database の定義です。

packages/cdk/lib/generative-ai-use-cases-stack.ts (抜粋)
    // Database
    const database = new Database(this, 'Database');
packages/cdk/lib/construct/database.ts
import { Construct } from 'constructs';
import * as ddb from 'aws-cdk-lib/aws-dynamodb';

export class Database extends Construct {
  public readonly table: ddb.Table;
  public readonly feedbackIndexName: string;
  constructor(scope: Construct, id: string) {
    super(scope, id);

    const feedbackIndexName = 'FeedbackIndex';
    const table = new ddb.Table(this, 'Table', {
      partitionKey: {
        name: 'id',
        type: ddb.AttributeType.STRING,
      },
      sortKey: {
        name: 'createdDate',
        type: ddb.AttributeType.STRING,
      },
      billingMode: ddb.BillingMode.PAY_PER_REQUEST,
    });

    table.addGlobalSecondaryIndex({
      indexName: feedbackIndexName,
      partitionKey: {
        name: 'feedback',
        type: ddb.AttributeType.STRING,
      },
    });

    this.table = table;
    this.feedbackIndexName = feedbackIndexName;
  }
}

この中では、DynamoDB テーブルを生成しています。

  • 名前は Table
  • パーティションキーに文字列型の id を指定
  • ソートキーに文字列型の createdDate を指定
  • 請求モードにPAY_PER_REQUEST:オンデマンドキャパシティモード を指定
  • GSI (グローバルセカンダリインデックス) に FeedbackIndex を指定
    • GSI のパーティションキーに文字列型の feedback を指定

GenerativeAiUseCasesStack > Api リソース

Api リソースは、アーキテクチャ図でいうと以下の赤枠の部分にあたります。

image.png

Api リソースの実体は packages/cdk/lib/construct/api.ts にあります。
以下のソースコードが Api の定義です。

packages/cdk/lib/generative-ai-use-cases-stack.ts (抜粋)
    // API
    const api = new Api(this, 'API', {
      modelRegion: params.modelRegion,
      modelIds: params.modelIds,
      imageGenerationModelIds: params.imageGenerationModelIds,
      endpointNames: params.endpointNames,
      customAgents: params.agents,
      queryDecompositionEnabled: params.queryDecompositionEnabled,
      rerankingModelId: params.rerankingModelId,
      crossAccountBedrockRoleArn: params.crossAccountBedrockRoleArn,

      userPool: auth.userPool,
      idPool: auth.idPool,
      userPoolClient: auth.client,
      table: database.table,
      knowledgeBaseId: params.ragKnowledgeBaseId || props.knowledgeBaseId,
      agents: props.agents,
      guardrailIdentify: props.guardrailIdentifier,
      guardrailVersion: props.guardrailVersion,
    });

packages/cdk/lib/construct/api.ts (長いためリンク先のソースを参照)

相当長いです。これまで最長かもしれません。
この中では、以下の AWS リソースを生成するコンストラクトを定義しています。

  • Bucket
  • NodejsFunction ※ predict.ts
  • NodejsFunction ※ predictStream.ts
  • NodejsFunction ※ invokeFlow.ts
  • NodejsFunction ※ predictTitle.ts
  • NodejsFunction ※ generateImage.ts
  • NodejsFunction ※ optimizePrompt.ts
  • PolicyStatement ※ SageMaker Endpoint
  • PolicyStatement ※ Bedrock
  • PolicyStatement ※ crossAccountBedrockRoleArn の場合
  • NodejsFunction ※ createChat.ts
  • NodejsFunction ※ deleteChat.ts
  • NodejsFunction ※ createMessages.ts
  • NodejsFunction ※ updateTitle.ts
  • NodejsFunction ※ listChats.ts
  • NodejsFunction ※ findChatById.ts
  • NodejsFunction ※ listMessages.ts
  • NodejsFunction ※ updateFeedback.ts
  • NodejsFunction ※ getWebText.ts
  • NodejsFunction ※ createShareId.ts
  • NodejsFunction ※ getSharedChat.ts
  • NodejsFunction ※ findShareId.ts
  • NodejsFunction ※ deleteShareId.ts
  • NodejsFunction ※ listSystemContexts.ts
  • NodejsFunction ※ createSystemContext.ts
  • NodejsFunction ※ updateSystemContextTitle.ts
  • NodejsFunction ※ deleteSystemContext.ts
  • NodejsFunction ※ getFileUploadSignedUrl.ts
  • NodejsFunction ※ getFileDownloadSignedUrl.ts
  • NodejsFunction ※ deleteFile.ts
  • CognitoUserPoolsAuthorizer
  • RestApi
  • 【CDK 用関数】allowDownloadFile

1 つのバケットと、26 の Lambda 関数 (API の実体)、1 つの認証付き RestAPI を作成しています。

ここでは、BucketRestApi に分けて解説していきます。

GenerativeAiUseCasesStack > Api > Bucket リソース

Bucket はファイル参照用の S3 バケットのリソースです。

以下のソースコードが Bucket の定義です。

packages/cdk/lib/construct/api.ts (抜粋)
    // S3 (File Bucket)
    const fileBucket = new Bucket(this, 'FileBucket', {
      encryption: BucketEncryption.S3_MANAGED,
      removalPolicy: RemovalPolicy.DESTROY,
      autoDeleteObjects: true,
      enforceSSL: true,
      blockPublicAccess: BlockPublicAccess.BLOCK_ALL,
    });
    fileBucket.addCorsRule({
      allowedOrigins: ['*'],
      allowedMethods: [HttpMethods.GET, HttpMethods.POST, HttpMethods.PUT],
      allowedHeaders: ['*'],
      exposedHeaders: [],
      maxAge: 3000,
    });
  • 名前は FileBucket
  • S3 マネージドキーでの暗号化
  • スタック削除時はバケットを削除 (中に含まれるオブジェクトも削除)
  • SSL 接続を強制する
  • ブロックパブリックアクセスはブロック
  • CORS 設定を許可する
    • すべてのオリジン
    • GET/POST/PUT リクエストを許可
    • すべての Access-Control-Request-Headers を許可
    • アクセスできるヘッダ情報はなし
    • ブラウザのキャッシュ時間は 50 分(3000 秒)
GenerativeAiUseCasesStack > Api > RestApi リソース

RestApi は API GW の REST API リソースです。
また、Cognito ユーザプールをオーソライザーとして使用しています。

以下のソースコードが RestApi の定義です。

packages/cdk/lib/construct/api.ts (抜粋)
    // API Gateway
    const authorizer = new CognitoUserPoolsAuthorizer(this, 'Authorizer', {
      cognitoUserPools: [userPool],
    });

    const commonAuthorizerProps = {
      authorizationType: AuthorizationType.COGNITO,
      authorizer,
    };

    const api = new RestApi(this, 'Api', {
      deployOptions: {
        stageName: 'api',
      },
      defaultCorsPreflightOptions: {
        allowOrigins: Cors.ALL_ORIGINS,
        allowMethods: Cors.ALL_METHODS,
      },
      cloudWatchRole: true,
    });

    api.addGatewayResponse('Api4XX', {
      type: ResponseType.DEFAULT_4XX,
      responseHeaders: {
        'Access-Control-Allow-Origin': "'*'",
      },
    });

    api.addGatewayResponse('Api5XX', {
      type: ResponseType.DEFAULT_5XX,
      responseHeaders: {
        'Access-Control-Allow-Origin': "'*'",
      },
    });
  • CognitoUserPoolsAuthorizer
    • 名前は Authorizer
    • Cognito ユーザプールに Auth スタックで作成したユーザプールを指定
  • RestApi
    • 名前は Api
    • ステージ名は api
    • CORS 設定は「すべてのオリジンからすべてのメソッドのリクエストを許可」
    • CloudWatch ロールを自動的に作成

この API に対し、Lambda 関数を紐づけていきます。

RestApi リソース、メソッドと Lambda 関数のひも付き

RestApi リソースによって作成される API GW は、23 個の Lambda 関数と紐づいています。
なお、全てのメソッドに前述のオーソライザが指定されています。

API GW と Lambda 関数の紐づきは以下の通りです。

API GW から呼び出される Lambda 関数

API GW から呼び出される Lambda 関数は以下の通りです。
ランタイムは全て NodeJS の最新版、タイムアウトは 15 分で定義されています。
メモリサイズは指定がなければデフォルト値です。

createChatFunction
  • /chats (POST)
  • 名前は CreateChat
  • ソースコードは packages/cdk/lambda/createChat.ts
  • 環境変数
    • TABLE_NAME: Database リソースで作成した DynamoDB テーブル
  • 処理概要
    • Cognito ユーザ ID を取得
    • packages/cdk/lambda/repository.tsの createChat 関数を呼び出して DynamoDB テーブルにデータを登録
      • id: user# + Cognito ユーザ ID
      • chatId: chat# + ランダム UUID
listChatsFunction
  • /chats (GET)
  • 名前は ListChats
  • ソースコードは packages/cdk/lambda/listChats.ts
  • 環境変数
    • TABLE_NAME: Database リソースで作成した DynamoDB テーブル
  • 処理概要
    • Cognito ユーザ ID を取得
    • packages/cdk/lambda/repository.tsの listChats 関数を呼び出して DynamoDB テーブルからデータを取得
      • id: user# + Cognito ユーザ ID
      • 取得件数 Limit: 100 件
      • ExclusiveStartKey: event.queryStringParameters があればそのキーから取得する
findChatbyIdFunction
  • /chats/{chatId} (GET)
  • 名前は FindChatbyId
  • ソースコードは packages/cdk/lambda/findChatById.ts
  • 環境変数
    • TABLE_NAME: Database リソースで作成した DynamoDB テーブル
  • 処理概要
    • Cognito ユーザ ID を取得
    • packages/cdk/lambda/repository.tsの findChatById 関数を呼び出して DynamoDB テーブルからデータを取得
      • id: user# + Cognito ユーザ ID
      • chatId: chat# + パスパラメータの chatId
deleteChatFunction
  • /chats/{chatId} (DELETE)
  • 名前は DeleteChat
  • ソースコードは packages/cdk/lambda/deleteChat.ts
  • 環境変数
    • TABLE_NAME: Database リソースで作成した DynamoDB テーブル
  • 処理概要
    • Cognito ユーザ ID を取得
    • packages/cdk/lambda/repository.tsの deleteChat 関数を呼び出して DynamoDB テーブルからデータを削除
      • id: user# + Cognito ユーザ ID
      • chatId: chat# + パスパラメータの chatId
    • 同 findShareId 関数を呼び出して DynamoDB テーブルから共有 ID を取得
      • id: user# + Cognito ユーザ ID + _ + chat# + パスパラメータの chatId
    • 共有 ID があれば、同 deleteShareId 関数を呼び出して DynamoDB テーブルからデータを削除
updateChatTitleFunction
  • /chats/{chatId}/title (PUT)
  • 名前は UpdateChatTitle
  • ソースコードは packages/cdk/lambda/updateTitle.ts
  • 環境変数
    • TABLE_NAME: Database リソースで作成した DynamoDB テーブル
  • 処理概要
    • Cognito ユーザ ID を取得
    • packages/cdk/lambda/repository.tsの findChatById 関数を呼び出して DynamoDB テーブルからデータを取得
      • id: user# + Cognito ユーザ ID
      • chatId: chat# + パスパラメータの chatId
    • 同 setChatTitle 関数を呼び出して DynamoDB テーブルのデータを更新
      • id: 取得した id
      • createdDate: 取得した createDate
      • title: event.body.title
createMessagesFunction
  • /chats/{chatId}/messages (POST)
  • 名前は CreateMessages
  • ソースコードは packages/cdk/lambda/createMessages.ts
  • 環境変数
    • TABLE_NAME: Database リソースで作成した DynamoDB テーブル
  • 処理概要
    • Cognito ユーザ ID を取得
    • packages/cdk/lambda/repository.tsの batchCreateMessages 関数を呼び出して DynamoDB テーブルにデータを登録
      • messages: 登録対象のメッセージ配列
        • id: chat# + パスパラメータの chatId
        • createdDate: event.body.messages.createDate もしくは現在日時
        • messageId: event.body.messages.messageId
        • role: event.body.messages.role
        • content: event.body.messages.content
        • trace: event.body.messages.trace
        • extraData: event.body.messages.extraData
        • userId: user# + Cognito ユーザ ID
        • feedback: 固定値 'none'
        • usecase: event.body.messages.usecase
        • llmType: event.body.messages.llmType もしくは空
listMessagesFunction
  • /chats/{chatId}/messages (GET)
  • 名前は ListMessages
  • ソースコードは packages/cdk/lambda/listMessages.ts
  • 環境変数
    • TABLE_NAME: Database リソースで作成した DynamoDB テーブル
  • 処理概要
    • Cognito ユーザ ID を取得
    • packages/cdk/lambda/repository.tsの findChatById 関数を呼び出して DynamoDB テーブルのデータを取得
      • id: user# + Cognito ユーザ ID
      • chatId: chat# + パスパラメータの chatId
    • 同 listMessages 関数を呼び出して DynamoDB テーブルのデータを取得
      • id: chat# + パスパラメータの chatId
updateFeedbackFunction
  • /chats/{chatId}/feedbacks (POST)
  • 名前は UpdateFeedback
  • ソースコードは packages/cdk/lambda/updateFeedback.ts
  • 環境変数
    • TABLE_NAME: Database リソースで作成した DynamoDB テーブル
  • 処理概要
    • packages/cdk/lambda/repository.tsの updateFeedback 関数を呼び出して DynamoDB テーブルのデータを更新
      • chatId: chat# + パスパラメータの chatId
      • createdDate: event.body.createdDate
      • feedback: event.body.feedback
      • reasons: event.body.reasons
      • detailedFeedback: event.body.detailedFeedback
    • 戻り値に更新後の全属性を設定して終了
getSignedUrlFunction
getFileDownloadSignedUrlFunction
  • /file/url (GET)
  • 名前は GetFileDownloadSignedUrlFunction
  • ソースコードは packages/cdk/lambda/getFileDownloadSignedUrl.ts
  • 処理概要
    • オブジェクトダウンロード用の署名付き URL を取得
      • region: クエリパラメータ文字列の region
      • Bucket: クエリパラメータ文字列の bucketName
      • Key: クエリパラメータ文字列の filePrefix
      • ResponseContentType: クエリパラメータ文字列の contentType
      • 有効期限は 1 分 (60 秒)
    • 戻り値にオブジェクトダウンロード用の署名付き URL を設定して終了
deleteFileFunction
  • /file/{fileName} (DELETE)
  • 名前は DeleteFileFunction
  • ソースコードは packages/cdk/lambda/deleteFile.ts
  • 環境変数
    • BUCKET_NAME: Bucket リソースで作成したファイル参照用の S3 バケット
  • 処理概要
    • オブジェクトを削除
      • Bucket: 環境変数の BUCKET_NAME
      • Key: クエリパラメータ文字列の fileName
generateImageFunction
  • /image/generate (POST)
  • 名前は GenerateImage
  • ソースコードは packages/cdk/lambda/generateImage.ts
  • 環境変数
    • MODEL_REGION: スタック作成時のパラメータ modelRegion (デフォルト値は us-east-1)
    • MODEL_IDS: スタック作成時のパラメータ modelIds (デフォルト値は以下)
      • us.anthropic.claude-3-5-sonnet-20241022-v2:0
      • us.anthropic.claude-3-5-haiku-20241022-v1:0
      • us.amazon.nova-pro-v1:0
      • us.amazon.nova-lite-v1:0
      • us.amazon.nova-micro-v1:0
    • IMAGE_GENERATION_MODEL_IDS: スタック作成時のパラメータ imageGenerationModelIds (デフォルト値は以下)
      • amazon.nova-canvas-v1:0
    • CROSS_ACCOUNT_BEDROCK_ROLE_ARN: スタック作成時のパラメータ crossAccountBedrockRoleArn (デフォルト値は null)
  • 追加インストールモジュール
  • 処理概要
predictFunction
  • /predict (POST)
  • 名前は Predict
  • ソースコードは packages/cdk/lambda/predict.ts
  • 環境変数
    • MODEL_REGION: スタック作成時のパラメータ modelRegion (デフォルト値は us-east-1)
    • MODEL_IDS: スタック作成時のパラメータ modelIds (デフォルト値は以下)
      • us.anthropic.claude-3-5-sonnet-20241022-v2:0
      • us.anthropic.claude-3-5-haiku-20241022-v1:0
      • us.amazon.nova-pro-v1:0
      • us.amazon.nova-lite-v1:0
      • us.amazon.nova-micro-v1:0
    • IMAGE_GENERATION_MODEL_IDS: スタック作成時のパラメータ imageGenerationModelIds (デフォルト値は以下)
      • amazon.nova-canvas-v1:0
    • CROSS_ACCOUNT_BEDROCK_ROLE_ARN: スタック作成時のパラメータ crossAccountBedrockRoleArn (デフォルト値は null)
    • GUARDRAIL_IDENTIFIER: GuardrailStack スタックを生成している場合、その guardrailIdentifier を設定
    • GUARDRAIL_VERSION: GuardrailStack スタックを生成している場合、固定値 'DRAFT' を設定
  • 追加インストールモジュール
  • 処理概要
predictTitleFunction
  • /predict/title (POST)
  • 名前は PredictTitle
  • ソースコードは packages/cdk/lambda/predictTitle.ts
  • 環境変数
    • TABLE_NAME: Database リソースで作成した DynamoDB テーブル
    • MODEL_REGION: スタック作成時のパラメータ modelRegion (デフォルト値は us-east-1)
    • MODEL_IDS: スタック作成時のパラメータ modelIds (デフォルト値は以下)
      • us.anthropic.claude-3-5-sonnet-20241022-v2:0
      • us.anthropic.claude-3-5-haiku-20241022-v1:0
      • us.amazon.nova-pro-v1:0
      • us.amazon.nova-lite-v1:0
      • us.amazon.nova-micro-v1:0
    • IMAGE_GENERATION_MODEL_IDS: スタック作成時のパラメータ imageGenerationModelIds (デフォルト値は以下)
      • amazon.nova-canvas-v1:0
    • CROSS_ACCOUNT_BEDROCK_ROLE_ARN: スタック作成時のパラメータ crossAccountBedrockRoleArn (デフォルト値は null)
    • GUARDRAIL_IDENTIFIER: GuardrailStack スタックを生成している場合、その guardrailIdentifier を設定
    • GUARDRAIL_VERSION: GuardrailStack スタックを生成している場合、固定値 'DRAFT' を設定
  • 追加インストールモジュール
  • 処理概要
    • パラメータから使用するモデル情報 (event.body.model) を取得する
      • デフォルト値は packages/cdk/lambda/utils/models.ts で設定
      • type: 'bedrock' | 'bedrockAgent' | 'bedrockKb' | 'sagemaker' (デフォルト値は 'bedrock')
      • modelId: デフォルト値は環境変数の IMAGE_GENERATION_MODEL_IDS の 1 件目
      • modelParameters: 任意で設定
      • sessionId: 任意で設定
    • 入力チェックを実施する (以下のいずれかが設定されていない場合、エラー)
      • event.body.id
      • event.body.prompt
      • event.body.chat.id
      • event.body.chat.createdDate
    • 環境変数の MODEL_IDS から軽量モデルを取得し、存在すれば優先的に使用する
    • packages/cdk/lambda/utils/api.tsの invoke 関数を呼び出してタイトルを生成
    • packages/cdk/lambda/repository.tsの setChatTitle 関数を呼び出して DynamoDB テーブルのデータを更新
      • TableName: 環境変数の TABLE_NAME
      • id: event.body.chat.id
      • createdDate: event.body.chat.createdDate
      • title: 生成したタイトル
    • 戻り値に生成したタイトルを設定して終了
createShareId
  • /shares/chat/{chatId} (POST)
  • 名前は CreateShareId
  • ソースコードは packages/cdk/lambda/createShareId.ts
  • 環境変数
    • TABLE_NAME: Database リソースで作成した DynamoDB テーブル
  • 処理概要
    • Cognito ユーザ ID を取得
    • packages/cdk/lambda/repository.tsの createShareId 関数を呼び出して DynamoDB テーブルのデータを登録
      • itemShareId データ
        • id: user# + Cognito ユーザ ID + _ + chat# + パスパラメータの chatId
        • createdDate: 現在日時
        • shareId: share#+ ランダム ID 文字列
      • itemUserIdAndChatId データ
        • id: share#+ ランダム ID 文字列 ※上記同様
        • createdDate: 現在日時
        • userId: user# + Cognito ユーザ ID
        • chatId: chat# + パスパラメータの chatId
    • 戻り値に更新データを設定して終了
findShareId
  • /shares/chat/{chatId} (GET)
  • 名前は FindShareId
  • ソースコードは packages/cdk/lambda/findShareId.ts
  • 環境変数
    • TABLE_NAME: Database リソースで作成した DynamoDB テーブル
  • 処理概要
    • Cognito ユーザ ID を取得
    • packages/cdk/lambda/repository.tsの findShareId 関数を呼び出して DynamoDB テーブルのデータを検索
      • id: user# + Cognito ユーザ ID + _ + chat# + パスパラメータの chatId
    • 戻り値に取得データを設定して終了
getSharedChat
  • /shares/share/{shareId} (GET)
  • 名前は GetSharedChat
  • ソースコードは packages/cdk/lambda/getSharedChat.ts
  • 環境変数
    • TABLE_NAME: Database リソースで作成した DynamoDB テーブル
  • 処理概要
    • packages/cdk/lambda/repository.tsの findUserIdAndChatId 関数を呼び出して DynamoDB テーブルのデータを検索
      • id: share# + パスパラメータの shareId
    • 同 findChatById 関数を呼び出して DynamoDB テーブルのデータを検索
      • userId: 取得した userID
      • chatId: 取得した chatID
    • 同 listMessages 関数を呼び出して DynamoDB テーブルのデータを検索
      • chatId: 取得した chatID
    • 戻り値に取得データを設定して終了
deleteShareId
  • /shares/share/{shareId} (DELETE)
  • 名前は DeleteShareId
  • ソースコードは packages/cdk/lambda/deleteShareId.ts
  • 環境変数
    • TABLE_NAME: Database リソースで作成した DynamoDB テーブル
  • 処理概要
    • packages/cdk/lambda/repository.tsの deleteShareId 関数を呼び出して DynamoDB テーブルのデータを削除
      • 同 findUserIdAndChatId 関数を呼び出して DynamoDB テーブルからユーザ、チャットデータを取得
        • id: share# + パスパラメータの shareId
      • 同 findShareId 関数を呼び出して DynamoDB テーブルから共有データを取得
        • id: 取得データの userId + _ + 取得データの chatId
      • DynamoDB テーブルから共有データを削除
        • id: 共有データの id
        • createdDate: 共有データの createdDate
      • DynamoDB テーブルから共有データを削除
        • id: ユーザ、チャットデータの id
        • createdDate: ユーザ、チャットデータの createdDate
createSystemContextFunction
  • /systemcontexts (POST)
  • 名前は CreateSystemContexts
  • ソースコードは packages/cdk/lambda/createSystemContext.ts
  • 環境変数
    • TABLE_NAME: Database リソースで作成した DynamoDB テーブル
  • 処理概要
    • Cognito ユーザ ID を取得
    • packages/cdk/lambda/repository.tsの createSystemContext 関数を呼び出して DynamoDB テーブルのデータを登録
      • id: systemContext# + Cognito ユーザ ID
      • createdDate: 現在日時
      • systemContextId: systemContext# + ランダム UUID
      • systemContext: event.body.systemContext
      • systemContextTitle: event.body.title
    • 戻り値に登録データを設定して終了
listSystemContextsFunction
  • /systemcontexts (GET)
  • 名前は ListSystemContexts
  • ソースコードは packages/cdk/lambda/listSystemContexts.ts
  • 環境変数
    • TABLE_NAME: Database リソースで作成した DynamoDB テーブル
  • 処理概要
    • Cognito ユーザ ID を取得
    • packages/cdk/lambda/repository.tsの listSystemContexts 関数を呼び出して DynamoDB テーブルのデータを登録
      • id: systemContext# + Cognito ユーザ ID
    • 戻り値に取得データを設定して終了
deleteSystemContextFunction
  • /systemcontexts/{systemContextId} (DELETE)
  • 名前は DeleteSystemContexts
  • ソースコードは packages/cdk/lambda/deleteSystemContext.ts
  • 環境変数
    • TABLE_NAME: Database リソースで作成した DynamoDB テーブル
  • 処理概要
    • Cognito ユーザ ID を取得
    • packages/cdk/lambda/repository.tsの deleteSystemContext 関数を呼び出して DynamoDB テーブルのデータを削除
      • 同 findSystemContextById 関数を呼び出して System Context データの取得
        • id: systemContext# + Cognito ユーザ ID
        • systemContextId: systemContext# + パスパラメータの systemContextId
      • DynamoDB テーブルのデータを削除
        • id: System Context データの id
        • createdDate: System Context データの createdDate
updateSystemContextTitleFunction
  • /systemcontexts/{systemContextId}/title (PUT)
  • 名前は UpdateSystemContextTitle
  • ソースコードは packages/cdk/lambda/updateSystemContextTitle.ts
  • 環境変数
    • TABLE_NAME: Database リソースで作成した DynamoDB テーブル
  • 処理概要
    • Cognito ユーザ ID を取得
    • packages/cdk/lambda/repository.tsの updateSystemContextTitle 関数を呼び出して DynamoDB テーブルのデータを削除
      • 同 findSystemContextById 関数を呼び出して System Context データの取得
        • id: systemContext# + Cognito ユーザ ID
        • systemContextId: systemContext# + パスパラメータの systemContextId
      • DynamoDB テーブルのデータを削除
        • id: System Context データの id
        • createdDate: System Context データの createdDate
        • systemContextTitle: event.body.title
    • 戻り値に更新後のデータを設定して終了
getWebTextFunction
  • /web-text (GET)
  • 名前は GetWebText
  • ソースコードは packages/cdk/lambda/getWebText.ts
  • 環境変数
    • TABLE_NAME: Database リソースで作成した DynamoDB テーブル
  • 処理概要
    • クエリ文字列の url の情報を取得
    • 取得した HTML タグをサニタイズ
    • node-html-parserで HTML をパース
      • コメントを削除
      • script タグのテキストコンテンツを保持しない
      • noscript タグのテキストコンテンツを保持しない
      • style タグのテキストコンテンツを保持しない
      • pre タグのテキストコンテンツを保持しない
    • パースしたテキストの body タグを空白を除いて取り出し
    • 戻り値に取得したデータを設定して終了
その他の Lambda 関数

API GW から呼び出される Lambda 関数以外に、以下の Lambda 関数が定義されています。

predictStreamFunction
  • 名前は PredictStream
  • ソースコードは packages/cdk/lambda/predictStream.ts
  • メモリサイズは 256MB
  • 環境変数
    • USER_POOL_ID: Auth スタックを作成している場合、userPoolId を設定
    • USER_POOL_CLIENT_ID: Auth スタックを作成している場合、userPoolClientId を設定
    • MODEL_REGION: スタック作成時のパラメータ modelRegion (デフォルト値は us-east-1)
    • MODEL_IDS: スタック作成時のパラメータ modelIds (デフォルト値は以下)
      • us.anthropic.claude-3-5-sonnet-20241022-v2:0
      • us.anthropic.claude-3-5-haiku-20241022-v1:0
      • us.amazon.nova-pro-v1:0
      • us.amazon.nova-lite-v1:0
      • us.amazon.nova-micro-v1:0
    • IMAGE_GENERATION_MODEL_IDS: スタック作成時のパラメータ imageGenerationModelIds (デフォルト値は以下)
      • amazon.nova-canvas-v1:0
    • AGENT_MAP: Agent スタックを作成している場合、作成したエージェント (SearchAgent, CodeInterpreterAgent) を設定
    • CROSS_ACCOUNT_BEDROCK_ROLE_ARN: スタック作成時のパラメータ crossAccountBedrockRoleArn (デフォルト値は null)
    • BUCKET_NAME: Bucket リソースで作成したファイル参照用の S3 バケット
    • KNOWLEDGE_BASE_ID: 以下が設定されている場合、設定 (上が優先)
      • スタック作成時のパラメータ ragKnowledgeBaseId (デフォルト値は null)
      • RagKnowledgeBaseStack を作成している場合、その knowledgeBaseId を設定
    • GUARDRAIL_IDENTIFIER: GuardrailStack スタックを生成している場合、その guardrailIdentifier を設定
    • GUARDRAIL_VERSION: GuardrailStack スタックを生成している場合、固定値 'DRAFT' を設定
    • QUERY_DECOMPOSITION_ENABLED: スタック作成時のパラメータ queryDecompositionEnabled (デフォルト値は false)
    • RERANKING_MODEL_ID: スタック作成時のパラメータ rerankingModelId (デフォルト値は null)
  • 追加インストールモジュール
  • 処理概要
    • パラメータから使用するモデル情報 (event.body.model) を取得する
      • デフォルト値は packages/cdk/lambda/utils/models.ts で設定
      • type: 'bedrock' | 'bedrockAgent' | 'bedrockKb' | 'sagemaker' (デフォルト値は 'bedrock')
      • modelId: デフォルト値は環境変数の IMAGE_GENERATION_MODEL_IDS の 1 件目
      • sessionId: 任意で設定
    • packages/cdk/lambda/utils/api.ts の invokeStream 関数を呼び出してテキストを生成
      • typebedrock の場合 packages/cdk/lambda/utils/bedrockApi.ts
        • 環境変数の CROSS_ACCOUNT_BEDROCK_ROLE_ARN が指定されている場合、STS から認証情報を取得してクライアントを初期化
        • モデルに応じたパラメータをpackages/cdk/lambda/utils/models.tsで指定してテキスト生成
          • modelId: モデル情報の modelId
          • messages: event.body.messages
          • id: event.body.id
      • typebedrockAgent の場合 packages/cdk/lambda/utils/bedrockAgentApi.ts の invokeStream 関数を呼び出してテキストを生成
        • モデル情報の modelId と環境変数の AGENT_MAP から、agentId, agentAliasId を取得
        • agentId, agentAliasId からエージェントの情報を取得
        • エージェントを実行
          • event.messages[最後の要素].extraData からファイル情報を取得して設定
          • エージェント情報の codeInterpreterEnabled の値で useCase を設定
            • true の場合、CODE_INTERPRETER
            • false の場合、CHAT
          • agentId: 取得した agentId
          • agentAliasId: 取得した agentAliasId
          • sessionId: モデル情報の sessionId
          • enableTrace: 固定値 true
          • inputText: event.messages[最後の要素].content
        • 画像は S3 にアップロードし画像として設定
        • ファイルは S3 にアップロードしリファレンスを設定
        • 思考過程および Code Interpreter の実行コードを設定
        • ナレッジベース (RAG) があればソース URL を設定
      • typebedrockKb の場合 packages/cdk/lambda/utils/bedrockKbApi.ts の invokeStream 関数を呼び出してテキストを生成
        • event.body.idToken を検証
        • エージェントを実行
          • input: event.messages[最後の要素].content
          • sessionId: モデル情報の sessionId
          • retrieveAndGenerateConfiguration
            • type: 固定値 KNOWLEDGE_BASE
            • knowledgeBaseConfiguration
              • knowledgeBaseId: 環境変数の KNOWLEDGE_BASE_ID
              • modelArn: モデル情報の modelId
              • Filter, Implicit Filter, Rerank を設定
        • ナレッジベース (RAG) 上の参照 URL を設定
        • 末尾にリファレンスを設定
      • typesagemaker の場合 packages/cdk/lambda/utils/sagemakerApi.ts の invokeStream 関数を呼び出してテキストを生成
        • コマンドを生成
          • EndpointName: モデル情報の modelId
          • Body: モデル情報の modelIdevent.body.messages からテキストを取得
          • ContentType: 固定値 application/json
          • Accept: 固定値 application/json
        • コマンドを SageMakerRuntimeClient に送信
        • 取得したテキストをデコード
    • 戻り値に生成したテキストを設定して終了
invokeFlowFunction
optimizePromptFunction
【CDK 用関数】allowDownloadFile

最後に、Api リソースの中で allowDownloadFile 関数を定義しています。
この関数の引数に S3 バケット名を指定して呼び出すことで、対象の S3 バケット内のファイルに対し getFileDownloadSignedUrlFunction 関数で署名付き URL を作成することができるようになります。

packages/cdk/lib/construct/api.ts
  // Bucket 名を指定してダウンロード可能にする
  allowDownloadFile(bucketName: string) {
    this.getFileDownloadSignedUrlFunction.role?.addToPrincipalPolicy(
      new PolicyStatement({
        effect: Effect.ALLOW,
        resources: [
          `arn:aws:s3:::${bucketName}`,
          `arn:aws:s3:::${bucketName}/*`,
        ],
        actions: ['s3:GetBucket*', 's3:GetObject*', 's3:List*'],
      })
    );
  }

DatabaseApi でとんでもなく長くなってしまいました。
次回は GenU 内の GenerativeAiUseCasesStack スタックの CommonWebAcl リソースから解説したいと思います。

(参考) GenU のバックエンド (CDK) 詳細解説投稿一覧

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?