はじめに
皆さん、こんにちは。
私は業務でデータ利活用基盤を取り扱っているため、dbtやIceberg、そしてAWS GenUに取り組む必要があると考えています。特に AWS Japan Top Engineer として、GenUを扱い、その活用を広めることが責務だと感じています。
しかし、私はこれまで CloudFormation を好んで使っており、(逆張り思考も重なって)Cfn テンプレートをシンプルかつ汎用性・拡張性の高い形で作ることに注力してきました。そのため、改めてGenU の CDK コードを読もうとしても、なかなか理解が進みませんでした。
そこで、CDK を学びながら、その過程を記事としてまとめることにしました。
前回までのおさらい
前回までで、以下が完了しました。
- ①AWS CDK のセットアップ
- ②AWS CDK の動作確認
- ③GenU の概要
- ④GenU CDK スタックの概要
- ⑤CloudFrontWafStack スタックの解説
- ⑥RagKnowledgeBaseStack スタックの解説
- ⑦WebSearchAgentStack スタックの解説
GenU の CDK は最大で以下の 6 つの子スタックを作成します。
CloudFrontWafStack
RagKnowledgeBaseStack
AgentStack
GuardrailStack
-
GenerativeAiUseCasesStack
※メインスタック DashboardStack
今回は GenU 内の GuardrailStack
スタックを解説していきたいと思います。
GuardrailStack スタック
GuardrailStack は 生成 AI の入出力に含まれる機密情報のフィルタリング機能のスタックです。
GuardrailStack の実体は packages/cdk/lib/guardrail-stack.ts
にあります。
import { Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { Guardrail } from './construct';
interface GuardrailStackProps extends StackProps {}
export class GuardrailStack extends Stack {
public readonly guardrailIdentifier: string;
constructor(scope: Construct, id: string, props: GuardrailStackProps) {
super(scope, id, props);
const guardrail = new Guardrail(this, 'Guardrail');
this.guardrailIdentifier = guardrail.guardrailIdentifier;
}
}
このスタックでは、以下のリソースを作成しています。
Guardrail
GuardrailStack > Guardrail リソース
Guardrail リソースの実体は packages/cdk/lib/construct/guardrail.ts
にあります。
以下のソースコードが Guardrail の定義です。
import { Construct } from 'constructs';
import { aws_bedrock as bedrock, Lazy, Names } from 'aws-cdk-lib';
export class Guardrail extends Construct {
public readonly guardrailIdentifier: string;
constructor(scope: Construct, id: string) {
super(scope, id);
const suffix = Lazy.string({ produce: () => Names.uniqueId(this) });
const cfnGuardrail = new bedrock.CfnGuardrail(this, `guardrail`, {
blockedInputMessaging:
'禁止された入力を検出しました。会話を最初からやり直すか、管理者にお問い合わせください。',
blockedOutputsMessaging:
'システムが禁じている内容の出力を検出しました。会話を最初からやり直すか、管理者にお問い合わせください。',
name: `Guardrail-${suffix}`,
sensitiveInformationPolicyConfig: {
// NAME, DRIVER_ID は日本のものが機能しないので設定しない
// CA_*, US_*, UK_* はそれぞれの国固有のものなので設定しない
piiEntitiesConfig: [
{ action: 'BLOCK', type: 'AGE' },
{ action: 'BLOCK', type: 'AWS_ACCESS_KEY' },
{ action: 'BLOCK', type: 'AWS_SECRET_KEY' },
{ action: 'BLOCK', type: 'CREDIT_DEBIT_CARD_CVV' },
{ action: 'BLOCK', type: 'CREDIT_DEBIT_CARD_EXPIRY' },
{ action: 'BLOCK', type: 'CREDIT_DEBIT_CARD_NUMBER' },
{ action: 'BLOCK', type: 'EMAIL' },
{ action: 'BLOCK', type: 'INTERNATIONAL_BANK_ACCOUNT_NUMBER' },
{ action: 'BLOCK', type: 'IP_ADDRESS' },
{ action: 'BLOCK', type: 'LICENSE_PLATE' },
{ action: 'BLOCK', type: 'MAC_ADDRESS' },
{ action: 'BLOCK', type: 'PASSWORD' },
{ action: 'BLOCK', type: 'PHONE' },
{ action: 'BLOCK', type: 'PIN' },
{ action: 'BLOCK', type: 'SWIFT_CODE' },
{ action: 'BLOCK', type: 'URL' },
{ action: 'BLOCK', type: 'USERNAME' },
],
},
});
this.guardrailIdentifier = cfnGuardrail.attrGuardrailId;
}
}
この中では、Bedrock が組み込まれた生成 AI アプリケーションの入出力について、機密情報のフィルタリングを目的としたガードレール CfnGuardrail
を生成しています。
- 名前は
Guardrail-ABCD1234
- 機密情報フィルター
sensitiveInformationPolicyConfig
を設定- PII エンティティの検知設定である
piiEntitiesConfig
のうち、以下を指定
※PII(Personally Identifiable Information)とは、個人を識別できる情報のこと-
AGE
: 個人の年齢 -
AWS_ACCESS_KEY
: AWS のアクセスキー ID -
AWS_SECRET_KEY
: AWS のシークレットキー -
CREDIT_DEBIT_CARD_CVV
: クレジットカード検証コード (CVV) (3 桁または 4 桁) -
CREDIT_DEBIT_CARD_EXPIRY
: クレジットカードの有効期限 -
CREDIT_DEBIT_CARD_NUMBER
: クレジットカード番号 -
EMAIL
: 電子メールアドレス -
INTERNATIONAL_BANK_ACCOUNT_NUMBER
: 国際銀行口座番号 -
IP_ADDRESS
: IPv4 アドレス -
LICENSE_PLATE
: 自動車のナンバープレート (5 桁から 8 桁) -
MAC_ADDRESS
: MAC アドレス -
PASSWORD
: パスワード -
PHONE
: 電話番号 (FAX 番号やポケベルも含む) -
PIN
: 銀行口座の暗証番号 (4 桁の PIN) -
SWIFT_CODE
: 銀行識別コード (BIC) (8 桁または 11 桁) -
URL
: Web サイトの URL -
USERNAME
: ログイン名などのアカウントを識別するユーザー名
-
- PII エンティティの検知設定である
- 入力内容に機密情報が含まれていることを検出した際のメッセージ
禁止された入力を検出しました。会話を最初からやり直すか、管理者にお問い合わせください。 - 出力内容に機密情報が含まれていることを検出した際のメッセージ
システムが禁じている内容の出力を検出しました。会話を最初からやり直すか、管理者にお問い合わせください。
以上です。
次回は ついにメインとなる GenU 内の GenerativeAiUseCasesStack
スタックを解説していきたいと思います。