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) 詳細解説 ⑧GuardrailStack スタックの解説

Last updated at Posted at 2025-03-20

はじめに

皆さん、こんにちは。

私は業務でデータ利活用基盤を取り扱っているため、dbtIceberg、そしてAWS GenUに取り組む必要があると考えています。特に AWS Japan Top Engineer として、GenUを扱い、その活用を広めることが責務だと感じています。

しかし、私はこれまで CloudFormation を好んで使っており、(逆張り思考も重なって)Cfn テンプレートをシンプルかつ汎用性・拡張性の高い形で作ることに注力してきました。そのため、改めてGenU の CDK コードを読もうとしても、なかなか理解が進みませんでした。

そこで、CDK を学びながら、その過程を記事としてまとめることにしました。

前回までのおさらい

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

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

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

今回は GenU 内の GuardrailStack スタックを解説していきたいと思います。

GuardrailStack スタック

GuardrailStack は 生成 AI の入出力に含まれる機密情報のフィルタリング機能のスタックです。

GuardrailStack の実体は packages/cdk/lib/guardrail-stack.ts にあります。

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 の定義です。

packages/cdk/lib/construct/guardrail.ts
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: ログイン名などのアカウントを識別するユーザー名
  • 入力内容に機密情報が含まれていることを検出した際のメッセージ
    禁止された入力を検出しました。会話を最初からやり直すか、管理者にお問い合わせください。
  • 出力内容に機密情報が含まれていることを検出した際のメッセージ
    システムが禁じている内容の出力を検出しました。会話を最初からやり直すか、管理者にお問い合わせください。

以上です。
次回は ついにメインとなる GenU 内の GenerativeAiUseCasesStack スタックを解説していきたいと思います。

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?