はじめに
皆さん、こんにちは。
私は業務でデータ利活用基盤を取り扱っていること、2024 AWS Japan Top Engineer に選出されたということから、AWS GenU およびそれに必要なデータ基盤の探求 (Snowflake, dbt, Iceberg, etc) に取り組む必要があると考えています。
本投稿では、GenU のバックエンドである CDK コードを詳細に解説します。
自身そして閲覧して頂いた皆様の GenU への理解が少しでも深まり、生成 AI の民主化につながっていければと考えています。
前回までのおさらい
前回までで、以下が完了しました。
- ①AWS CDK のセットアップ
- ②AWS CDK の動作確認
- ③GenU の概要
- ④GenU CDK スタックの概要
- ⑤CloudFrontWafStack スタックの解説
- ⑥RagKnowledgeBaseStack スタックの解説
- ⑦WebSearchAgentStack スタックの解説
- ⑧GuardrailStack スタックの解説
- ⑨GenerativeAiUseCasesStack > Auth スタックの解説
GenU の CDK は最大で以下の 6 つの子スタックを作成します。
CloudFrontWafStackRagKnowledgeBaseStackAgentStackGuardrailStack-
GenerativeAiUseCasesStack※メインスタック DashboardStack
第 9 回から GenU 内の本丸である GenerativeAiUseCasesStack スタックを解説しています。
GenerativeAiUseCasesStack スタック
GenerativeAiUseCasesStack スタックでは、以下のリソースを作成しています。
AuthDatabaseApiCommonWebAclWebRagRagKnowledgeBaseUseCaseBuilderTranscribe
今回は Database, Api リソースを解説していきます。
GenerativeAiUseCasesStack > Database リソース
Database リソースは、アーキテクチャ図でいうと以下の赤枠の部分にあたります。
Database リソースの実体は packages/cdk/lib/construct/database.ts にあります。
以下のソースコードが Database の定義です。
// Database
const database = new Database(this, 'Database');
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を指定
- GSI のパーティションキーに文字列型の
GenerativeAiUseCasesStack > Api リソース
Api リソースは、アーキテクチャ図でいうと以下の赤枠の部分にあたります。
Api リソースの実体は packages/cdk/lib/construct/api.ts にあります。
以下のソースコードが Api の定義です。
// 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 CognitoUserPoolsAuthorizerRestApi- 【CDK 用関数】allowDownloadFile
1 つのバケットと、26 の Lambda 関数 (API の実体)、1 つの認証付き RestAPI を作成しています。
ここでは、Bucket と RestApi に分けて解説していきます。
GenerativeAiUseCasesStack > Api > Bucket リソース
Bucket はファイル参照用の S3 バケットのリソースです。
以下のソースコードが Bucket の定義です。
// 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 の定義です。
// 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 関数の紐づきは以下の通りです。
-
/chats(POST) =>createChatFunction -
/chats(GET) =>listChatsFunction -
/chats/{chatId}(GET) =>findChatbyIdFunction -
/chats/{chatId}(DELETE) =>deleteChatFunction -
/chats/{chatId}/title(PUT) =>updateChatTitleFunction -
/chats/{chatId}/messages(POST) =>createMessagesFunction -
/chats/{chatId}/messages(GET) =>listMessagesFunction -
/chats/{chatId}/feedbacks(POST) =>updateFeedbackFunction -
/file/url(POST) =>getSignedUrlFunction -
/file/url(GET) =>getFileDownloadSignedUrlFunction -
/file/{fileName}(DELETE) =>deleteFileFunction -
/image/generate(POST) =>generateImageFunction -
/predict(POST) =>predictFunction -
/predict/title(POST) =>predictTitleFunction -
/shares/chat/{chatId}(POST) =>createShareId -
/shares/chat/{chatId}(GET) =>findShareId -
/shares/share/{shareId}(GET) =>getSharedChat -
/shares/share/{shareId}(DELETE) =>deleteShareId -
/systemcontexts(POST) =>createSystemContextFunction -
/systemcontexts(GET) =>listSystemContextsFunction -
/systemcontexts/{systemContextId}(DELETE) =>deleteSystemContextFunction -
/systemcontexts/{systemContextId}/title(PUT) =>updateSystemContextTitleFunction -
/web-text(GET) =>getWebTextFunction
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もしくは空
-
- messages: 登録対象のメッセージ配列
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
- id:
- 同 listMessages 関数を呼び出して DynamoDB テーブルのデータを取得
- id:
chat#+ パスパラメータのchatId
- id:
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
-
/file/url(POST) - 名前は
GetSignedUrl - ソースコードは
packages/cdk/lambda/getFileUploadSignedUrl.ts - 環境変数
-
BUCKET_NAME: Bucket リソースで作成したファイル参照用の S3 バケット
-
- 処理概要
- オブジェクトアップロード用の署名付き URL を取得
-
Bucket: 環境変数のBUCKET_NAME -
Key: ユニーク ID +event.body.filename - 有効期限は 1 時間 (3600 秒)
-
- 戻り値にオブジェクトアップロード用の署名付き URL を設定して終了
- オブジェクトアップロード用の署名付き URL を取得
getFileDownloadSignedUrlFunction
-
/file/url(GET) - 名前は
GetFileDownloadSignedUrlFunction - ソースコードは
packages/cdk/lambda/getFileDownloadSignedUrl.ts - 処理概要
- オブジェクトダウンロード用の署名付き URL を取得
-
region: クエリパラメータ文字列のregion -
Bucket: クエリパラメータ文字列のbucketName -
Key: クエリパラメータ文字列のfilePrefix -
ResponseContentType: クエリパラメータ文字列のcontentType - 有効期限は 1 分 (60 秒)
-
- 戻り値にオブジェクトダウンロード用の署名付き URL を設定して終了
- オブジェクトダウンロード用の署名付き 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:0us.anthropic.claude-3-5-haiku-20241022-v1:0us.amazon.nova-pro-v1:0us.amazon.nova-lite-v1:0us.amazon.nova-micro-v1:0
-
IMAGE_GENERATION_MODEL_IDS: スタック作成時のパラメータimageGenerationModelIds(デフォルト値は以下)amazon.nova-canvas-v1:0
-
CROSS_ACCOUNT_BEDROCK_ROLE_ARN: スタック作成時のパラメータcrossAccountBedrockRoleArn(デフォルト値は null)
-
- 追加インストールモジュール
- 処理概要
- パラメータから使用するモデル情報 (
event.body.model) を取得する- デフォルト値は
packages/cdk/lambda/utils/models.tsで設定 -
type:'bedrock' | 'bedrockAgent' | 'bedrockKb' | 'sagemaker'(デフォルト値は'bedrock') -
modelId: デフォルト値は環境変数のIMAGE_GENERATION_MODEL_IDSの 1 件目 -
modelParameters: 任意で設定 -
sessionId: 任意で設定
- デフォルト値は
-
packages/cdk/lambda/utils/api.tsの generateImage 関数を呼び出して画像を生成-
typeがbedrockの場合packages/cdk/lambda/utils/bedrockApi.ts- 環境変数の
CROSS_ACCOUNT_BEDROCK_ROLE_ARNが指定されている場合、STS から認証情報を取得してクライアントを初期化 - 画像を生成
-
modelId: モデル情報のmodelId -
body: モデルに応じたパラメータをpackages/cdk/lambda/utils/models.tsで生成して指定 -
contentType: 固定値'application/json'
-
- 環境変数の
-
typeがbedrockAgentの場合packages/cdk/lambda/utils/bedrockAgentApi.ts- 定義なし (恐らくエラー)
-
typeがbedrockKbの場合packages/cdk/lambda/utils/bedrockKbApi.ts- 定義なし (恐らくエラー)
-
typeがsagemakerの場合packages/cdk/lambda/utils/sagemakerApi.ts- エラー 'Not Implemented' を返却
-
- 戻り値に画像データ (base64 エンコード) を設定して終了
- パラメータから使用するモデル情報 (
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:0us.anthropic.claude-3-5-haiku-20241022-v1:0us.amazon.nova-pro-v1:0us.amazon.nova-lite-v1:0us.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: 任意で設定
- デフォルト値は
-
packages/cdk/lambda/utils/api.tsの invoke 関数を呼び出してテキストを生成-
typeがbedrockの場合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
-
- 環境変数の
-
typeがbedrockAgentの場合packages/cdk/lambda/utils/bedrockAgentApi.ts- 定義なし
-
typeがbedrockKbの場合packages/cdk/lambda/utils/bedrockKbApi.ts- 定義なし
-
typeがsagemakerの場合packages/cdk/lambda/utils/sagemakerApi.ts-
modelId: モデル情報のmodelId -
body: モデルに応じたプロンプトをpackages/cdk/lambda/utils/models.tsで生成して指定 -
ContentType: 固定値'application/json' -
Accept: 固定値'application/json'
-
-
- 戻り値に生成したテキストを設定して終了
- パラメータから使用するモデル情報 (
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:0us.anthropic.claude-3-5-haiku-20241022-v1:0us.amazon.nova-pro-v1:0us.amazon.nova-lite-v1:0us.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.idevent.body.promptevent.body.chat.idevent.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
-
- 同 findUserIdAndChatId 関数を呼び出して DynamoDB テーブルからユーザ、チャットデータを取得
-
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
-
- 同 findSystemContextById 関数を呼び出して System Context データの取得
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
-
- 同 findSystemContextById 関数を呼び出して System Context データの取得
- 戻り値に更新後のデータを設定して終了
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:0us.anthropic.claude-3-5-haiku-20241022-v1:0us.amazon.nova-pro-v1:0us.amazon.nova-lite-v1:0us.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 関数を呼び出してテキストを生成-
typeがbedrockの場合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
-
- 環境変数の
-
typeがbedrockAgentの場合packages/cdk/lambda/utils/bedrockAgentApi.tsの invokeStream 関数を呼び出してテキストを生成- モデル情報の
modelIdと環境変数のAGENT_MAPから、agentId,agentAliasIdを取得 -
agentId,agentAliasIdからエージェントの情報を取得 - エージェントを実行
-
event.messages[最後の要素].extraDataからファイル情報を取得して設定 - エージェント情報の
codeInterpreterEnabledの値でuseCaseを設定- true の場合、
CODE_INTERPRETER - false の場合、
CHAT
- true の場合、
-
agentId: 取得したagentId -
agentAliasId: 取得したagentAliasId -
sessionId: モデル情報のsessionId -
enableTrace: 固定値 true -
inputText:event.messages[最後の要素].content
-
- 画像は S3 にアップロードし画像として設定
- ファイルは S3 にアップロードしリファレンスを設定
- 思考過程および Code Interpreter の実行コードを設定
- ナレッジベース (RAG) があればソース URL を設定
- モデル情報の
-
typeがbedrockKbの場合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 を設定
- 末尾にリファレンスを設定
-
-
typeがsagemakerの場合packages/cdk/lambda/utils/sagemakerApi.tsの invokeStream 関数を呼び出してテキストを生成- コマンドを生成
-
EndpointName: モデル情報のmodelId -
Body: モデル情報のmodelIdとevent.body.messagesからテキストを取得 -
ContentType: 固定値application/json -
Accept: 固定値application/json
-
- コマンドを SageMakerRuntimeClient に送信
- 取得したテキストをデコード
- コマンドを生成
-
- 戻り値に生成したテキストを設定して終了
- パラメータから使用するモデル情報 (
invokeFlowFunction
- 名前は
InvokeFlow - ソースコードは
packages/cdk/lambda/invokeFlow.ts - 追加インストールモジュール
- 処理概要
-
packages/cdk/lambda/utils/bedrockFlowApi.tsの invokeFlow 関数を呼び出してフローを実行-
flowIdentifier:event.flowIdentifier -
flowAliasIdentifier:event.flowAliasIdentifier -
inputs:-
nodeName: 固定値 'FlowInputNode' -
nodeOutputName: 固定値 'document' -
content:-
document:event.document
-
-
-
-
optimizePromptFunction
- 名前は
OptimizePromptFunction - ソースコードは
packages/cdk/lambda/optimizePrompt.ts - 環境変数
-
MODEL_REGION: スタック作成時のパラメータmodelRegion(デフォルト値はus-east-1)
-
- 追加インストールモジュール
- 処理概要
-
packages/cdk/lambda/utils/bedrockOptimizePrompt.tsの execute 関数を呼び出してプロンプト最適化を実行-
input:-
textPrompt:-
text:event.prompt
-
-
-
targetModelId:event.targetModelId
-
-
【CDK 用関数】allowDownloadFile
最後に、Api リソースの中で allowDownloadFile 関数を定義しています。
この関数の引数に S3 バケット名を指定して呼び出すことで、対象の S3 バケット内のファイルに対し getFileDownloadSignedUrlFunction 関数で署名付き URL を作成することができるようになります。
// 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*'],
})
);
}
Database と Api でとんでもなく長くなってしまいました。
次回は GenU 内の GenerativeAiUseCasesStack スタックの CommonWebAcl リソースから解説したいと思います。
(参考) GenU のバックエンド (CDK) 詳細解説投稿一覧
- ①AWS CDK のセットアップ
- ②AWS CDK の動作確認
- ③GenU の概要
- ④GenU CDK スタックの概要
- ⑤CloudFrontWafStack スタックの解説
- ⑥RagKnowledgeBaseStack スタックの解説
- ⑦WebSearchAgentStack スタックの解説
- ⑧GuardrailStack スタックの解説
- ⑨GenerativeAiUseCasesStack > Auth スタックの解説
- ⑩GenerativeAiUseCasesStack > Database, Api スタックの解説
- ⑪GenerativeAiUseCasesStack > CommonWebAcl, Web, Rag スタックの解説
- ⑫GenerativeAiUseCasesStack > RagKnowledgeBase, UseCaseBuilder, Transcribe スタックの解説
- ⑬DashBoard スタックの解説
- ⑭GenU の Outputs の解説


