8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CDK を使って Amazon Bedrock エージェントを試した

Last updated at Posted at 2025-07-07

記事のザックリまとめ

  • CDK を使った Bedrock エージェントの作成と、動作検証を行いました
    • 作成したエージェントに質問して、動作を確認しました
  • エージェントとアクショングループとして設定する Lambda を別リージョンに作成して動作検証を行いました
    • 残念ながらエラーで実行できませんでした
    • エージェントと Lambda は同一リージョンに作成する必要がありそうです

はじめに

Amazon Bedrock を使ったアプリ開発を進めていて、実現したい機能に対して Bedrock のエージェント機能が重要になるかも?となったため、できることの確認も含めてチーム内で検証しました。この記事で備忘録として残しておこうと思います。どなたかの参考になれば幸いです。

この記事の情報は、2025/07/07 の検証時点のものになります。
AWS の公式ドキュメントなど、最新の情報も一緒に参照ください。

今回の実装内容

全体構成

  • 今回作成したリソース構成は次の通りです
    image.png

  • 作成したエージェントのテストはマネージドコンソール上で行います

CDK によるリソース作成

Lambda

  • ダミーのレスポンスを返す Lambda を作成します
    • 検証用途のため、Lambda のアプリケーションコードはインラインで作成しています
Lambda を作成する CDK コード
import * as cdk from "aws-cdk-lib";
import { Construct } from "constructs";
import * as iam from "aws-cdk-lib/aws-iam";
import * as lambda from "aws-cdk-lib/aws-lambda";

export class LambdaStack extends cdk.Stack {
  public readonly actionGroupLambda: lambda.Function;

  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    this.actionGroupLambda = new lambda.Function(this, "ActionGroupLambda", {
      functionName: "bedrock-agent-action-group-lambda",
      runtime: lambda.Runtime.NODEJS_22_X,
      handler: "index.handler",
      code: lambda.Code.fromInline(`

exports.handler = async (event, context) => {
const actionGroup = event.actionGroup || '';
const functionName = event.function || 'get_weather';
const messageVersion = event.messageVersion || '1.0';

    const data = {
            "location": "Tokyo",
            "temperature": "22°C",
            "condition": "Sunny",
            "humidity": "65%"
        };

    const responseBody = {
        'TEXT': {
            'body': JSON.stringify(data)
        }
    };

    const actionResponse = {
        'actionGroup': actionGroup,
        'function': functionName,
        'functionResponse': {
            'responseBody': responseBody
        }
    };

    return {
        'response': actionResponse,
        'messageVersion': messageVersion
    };

};
`),
      description: "Lambda function for Bedrock Agent ActionGroup",
    });

    this.actionGroupLambda.addPermission("BedrockInvokePermission", {
      principal: new iam.ServicePrincipal("bedrock.amazonaws.com"),
      action: "lambda:InvokeFunction",
      sourceArn: `arn:aws:bedrock:${this.region}:${this.account}:agent/*`,
    });
  }
}

Bedrock エージェント

  • 上記で作成した Lambda をアクショングループの関数として設定します
    • エージェントへの指示として、特定の質問が来たらアクショングループを使って回答するように指定しておきます
Bedrock エージェントを作成する CDK コード
import * as cdk from "aws-cdk-lib";
import { Construct } from "constructs";
import * as iam from "aws-cdk-lib/aws-iam";
import * as bedrock from "aws-cdk-lib/aws-bedrock";

export interface BedrockTestStackProps extends cdk.StackProps {
  lambdaFunctionArn: string;
}

export class BedrockTestStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props: BedrockTestStackProps) {
    super(scope, id, props);

    const bedrockAgentRole = new iam.Role(this, "BedrockAgentRole", {
      assumedBy: new iam.ServicePrincipal("bedrock.amazonaws.com"),
      description: "IAM role for Bedrock Agent",
      managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName("AmazonBedrockFullAccess")],
    });

    const lambdaFunctionArn = props.lambdaFunctionArn;

    const bedrockAgent = new bedrock.CfnAgent(this, "BedrockAgent", {
      agentName: "claude-sonnet-agent",
      description: "Bedrock agent using Claude 3.7 Sonnet model",
      foundationModel: "us.anthropic.claude-3-7-sonnet-20250219-v1:0",
      agentResourceRoleArn: bedrockAgentRole.roleArn,
      instruction:
        "ユーザーからの質問に対して、適切に回答してください。天気の質問の場合は Action group (test-actions) を使うことで、東京の現在の天気を知ることができます。",
      idleSessionTtlInSeconds: 60,
      autoPrepare: true,
      actionGroups: [
        {
          actionGroupName: "test-actions",
          description: "Action group with dummy Lambda functions",
          actionGroupExecutor: {
            lambda: lambdaFunctionArn,
          },
          functionSchema: {
            functions: [
              {
                name: "get_weather",
                description: "Get current weather information",
              },
            ],
          },
        },
      ],
    });
  }
}

アクショングループとして設定する Lambda 関数について

  • Bedrock エージェントからアクショングループに設定した Lambda を呼び出した際の、エージェントのリクエスト・Lambda からエージェントに返却するべきレスポンスは規定の形式があります

作成したエージェントをテストしてみる

  • 「東京の天気は?」と聞くと、アクショングループとして作成した Lambda 関数のダミーレスポンスをもとに、ユーザーに回答してくれます
    • Lambda のダミーレスポンスに設定した内容と一致しており、期待通り動作していそうです
    • Lambda のレスポンスに含まれない内容の質問をした場合でも、情報がない旨を伝えてくれます
      スクリーンショット 2025-07-07 13.16.07.png

さらに試したこと

  • 業務での利用を考えて、追加で以下の検証も行ってみました

    • エージェントを作成するリージョンと異なるリージョンに、アクショングループとして利用する Lambda を作成してみます

    • 構成としては次のようにしてみようと思います
      image.png

    • CDK でのデプロイは成功しました

執筆時点では、マネージドコンソールからは設定できません。Lambda 関数を選択するドロップダウンメニューを開くと、エージェントを作成しているリージョンと同じリージョンに作成されている Lambda の一覧が表示されます。

実行してみると...!

  • 実行時に、エラーになりました
    • エラーの内容はこちら
      スクリーンショット 2025-07-04 17.54.59.png
    • Bedrock エージェントのリソースが存在するリージョンと、アクショングループに設定する Lambda は同一リージョンに存在する必要がありそうです
    • Claude 3.7 Sonnet の Cross-region Inference に対応しているリージョン (us-east-2) でも試しましたが、同様にエラーでした
      スクリーンショット 2025-07-04 18.06.11.png
    • 執筆時点では、エージェントと Lambda でリージョンを跨いだアクショングループの実行はサポートされていないようです

まとめ

  • この記事では CDK を使った Bedrock エージェントの作成と、動作検証を行いました
  • また、エージェントとアクショングループとして設定する Lambda を別リージョンに作成して動作検証を行いました
    • こちらはエラーで実行できずでした、今後のアップデートでのサポートに期待したいです...!

参考文献

8
1
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
8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?