AWS Step Functionsから別アカウントのAmazon Bedrockを呼び出してみた

AWS Step Functionsから別アカウントのAmazon Bedrockを呼び出してみた

Clock Icon2025.07.18

はじめに

本記事では、AWS Step Functionsから別アカウントのAmazon Bedrockを呼び出す方法について解説します。
既存のシステムとは別のAWSアカウントでAmazon Bedrockを利用する必要がある場合に、この方法が有用です。

以前、AWS Lambdaから別アカウントのAmazon Bedrockを呼び出す方法を記事にしましたが、今回は、AWS Step Functionsを利用する方法です。

https://dev.classmethod.jp/articles/aws-lambda-cross-account-bedrock/

アカウント構成とそれぞれのアカウントで作成するリソースは以下の通りです。

  • アカウントA:呼び出し元(Step Functions側アカウント)
    • Step Functions:Amazon Bedrockを呼び出す
    • IAMロール:Step Functions実行用のロール(AssumeRole権限を含む)
  • アカウントB:呼び出し先(Bedrock側アカウント)
    • Amazon Bedrock:モデルを利用可能にする
    • IAMロール:Amazon Bedrockへのアクセス権限を持つロール
      cm-hirai-screenshot 2025-07-16 11.00.55

処理の流れは以下の通りです。

  1. Step FunctionsがAWS Security Token Service(STS)経由でBedrock側アカウントのIAMロールを引き受ける
  2. 一時認証情報でBedrockにリクエスト
  3. Bedrockからレスポンスを受け取る

前提条件

  • Amazon Bedrockで利用したいモデルのアクセスが有効化されていること
    • 本記事ではapac.anthropic.claude-sonnet-4-20250514-v1:0モデルを使用します

Step Functions側アカウントでの作業

Step Functions側アカウントでは、以下の2つのリソースを作成します

  1. Step Functions実行用のIAMロール(AssumeRole権限含む)
  2. Bedrock呼び出し用のステートマシン

Step Functions用のIAMロール作成

まず、Step Functions用のIAMロールを作成します。このロールには、Step Functionsの基本実行権限とBedrock側のロールを引き受ける権限が必要です。

AWS CloudShellで以下のコマンドを実行し、Step Functions用のIAMロールを作成します。

aws iam create-role \
  --role-name CrossAccountBedrockInvokerRole \
  --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
          "Service": "states.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
      }
    ]
  }' \
  --description "Step Functions role for cross-account Bedrock invocation"

Step Functions用のIAMロールに、Bedrock側アカウントのロールを引き受けるためのAssumeRole権限を持つポリシーを作成し、アタッチします。

アカウントBは、Bedrockを利用するAWSアカウントのIDに置き換えてください。

aws iam put-role-policy \
  --role-name CrossAccountBedrockInvokerRole \
  --policy-name CrossAccountRoleAssumePolicy \
  --policy-document '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::アカウントB:role/CrossAccountBedrockExecutionRole"
      }
    ]
  }'

Step Functionsログ配信権限の追加します。

aws iam put-role-policy \
  --role-name CrossAccountBedrockInvokerRole \
  --policy-name StepFunctionsLogDeliveryPolicy \
  --policy-document '{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogDelivery",
                "logs:CreateLogStream",
                "logs:GetLogDelivery",
                "logs:UpdateLogDelivery",
                "logs:DeleteLogDelivery",
                "logs:ListLogDeliveries",
                "logs:PutLogEvents",
                "logs:PutResourcePolicy",
                "logs:DescribeResourcePolicies",
                "logs:DescribeLogGroups"
            ],
            "Resource": "*"
        }
    ]
}'

ステートマシンを作成

Step Functionsのステートマシンを作成します。マネジメントコンソール上でCrossAccountBedrockInvokeStateMachineという名前で作成します。

以下がステートマシンの定義です。JSONataクエリ言語を使用してBedrockのConverse APIを呼び出します。

cm-hirai-screenshot 2025-07-16 10.57.34

アカウントBは、Bedrockを利用するAWSアカウントのIDに置き換えてください。
アカウントAは、Step Functionsを利用するAWSアカウントのIDに置き換えてください。

{
  "Comment": "Cross-account Bedrock invocation from Step Functions",
  "QueryLanguage": "JSONata",
  "StartAt": "InvokeBedrockCrossAccount",
  "States": {
    "InvokeBedrockCrossAccount": {
      "Type": "Task",
      "Resource": "arn:aws:states:::aws-sdk:bedrockruntime:converse",
      "Credentials": {
        "RoleArn": "arn:aws:iam::アカウントB:role/CrossAccountBedrockExecutionRole"
      },
      "Arguments": {
        "ModelId": "apac.anthropic.claude-sonnet-4-20250514-v1:0",
        "Messages": [
          {
            "Role": "user",
            "Content": [
              {
                "Text": "{% $states.input.message %}"
              }
            ]
          }
        ],
        "InferenceConfig": {
          "MaxTokens": 1000,
          "Temperature": 0.7
        }
      },
      "Logging": {
        "Level": "ALL",
        "IncludeExecutionData": true,
        "Destinations": [
          {
            "CloudWatchLogsLogGroup": {
              "LogGroupArn": "arn:aws:logs:ap-northeast-1:アカウントA:log-group:/aws/stepfunctions/CrossAccountBedrockInvokeStateMachine"
            }
          }
        ]
      },
      "End": true
    }
  }
}

このTaskステートでは、以下の処理を行います。

  1. ターゲットロールの指定CredentialsでBedrock側アカウントのIAMロールを指定
  2. Bedrock Runtime Converse API呼び出し:指定したモデルIDでテキスト生成を実行

クロスアカウントアクセスもコンソール上でIAMロールを指定するだけで容易に設定できます。
cm-hirai-screenshot 2025-07-16 10.57.54

引数は以下の通りです。
cm-hirai-screenshot 2025-07-16 10.58.02

IAMロールは先程作成したCrossAccountBedrockInvokerRoleを選択します。ログは有効化します。
cm-hirai-screenshot 2025-07-16 10.57.23

Bedrock側アカウントでの作業

Bedrock側アカウントでは、Step Functions側アカウントのIAMロールが引き受けることができるIAMロールを作成します。

以下のコマンドを実行します。アカウントAは、Step Functionsを利用するAWSアカウントのIDに置き換えてください。

aws iam create-role \
    --role-name CrossAccountBedrockExecutionRole \
    --assume-role-policy-document '{
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::アカウントA:role/CrossAccountBedrockInvokerRole"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }' \
    --description "Role for cross-account Bedrock access from Step Functions"

このIAMロールには、Bedrockへのアクセス権限が必要です。
AmazonBedrockFullAccessをアタッチします。

aws iam attach-role-policy \
    --role-name CrossAccountBedrockExecutionRole \
    --policy-arn arn:aws:iam::aws:policy/AmazonBedrockFullAccess

動作確認

Step Functionsの動作確認を行います。

マネジメントコンソールからテスト実行を行います。テストイベントは以下のJSONを使用します。

テスト入力:

{
    "message": "こんにちは、日本語でテストしています。"
}

実行結果

以下のようなレスポンスが返ってきました

cm-hirai-screenshot 2025-07-16 11.02.15

{
  "output": {
    "Metrics": {
      "LatencyMs": 2203
    },
    "Output": {
      "Message": {
        "Content": [
          {
            "Text": "こんにちは!日本語のテストですね。\n\n私は日本語で会話することができます。何かご質問がございましたら、お気軽にお聞かせください。どのようなことについてお話ししたいですか?"
          }
        ],
        "Role": "assistant"
      }
    },
    "StopReason": "end_turn",
    "Usage": {
      "CacheReadInputTokens": 0,
      "CacheWriteInputTokens": 0,
      "InputTokens": 22,
      "OutputTokens": 70,
      "TotalTokens": 92
    }
  },
  "outputDetails": {
    "truncated": false
  }
}

レスポンスには以下の情報が含まれています:

  • Message: Bedrockからの応答テキスト
  • Usage: トークン使用量(入力・出力・合計)
  • Metrics: 処理時間(LatencyMs)
  • StopReason: 生成終了の理由

まとめ

本記事では、AWS Step Functionsから別アカウントのAmazon Bedrockを呼び出す方法について説明しました。
主なポイントは以下の通りです。

  • クロスアカウントでの利用には適切なIAMロールとポリシーの設定が必要
  • Step FunctionsのCredentialsフィールドを使用して別アカウントの認証情報を指定
  • JSONataクエリ言語を使用することで動的な入力処理が実現可能

これらの設定を適切に行うことで、セキュアなクロスアカウントでのBedrock利用が実現できます。

参考

https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/concepts-access-cross-acct-resources.html?icmpid=docs_console_unmapped

https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/tutorial-access-cross-acct-resources.html?icmpid=docs_console_unmapped

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.