AWS Step Functionsから別アカウントのAmazon Bedrockを呼び出してみた
はじめに
本記事では、AWS Step Functionsから別アカウントのAmazon Bedrockを呼び出す方法について解説します。
既存のシステムとは別のAWSアカウントでAmazon Bedrockを利用する必要がある場合に、この方法が有用です。
以前、AWS Lambdaから別アカウントのAmazon Bedrockを呼び出す方法を記事にしましたが、今回は、AWS Step Functionsを利用する方法です。
アカウント構成とそれぞれのアカウントで作成するリソースは以下の通りです。
- アカウントA:呼び出し元(Step Functions側アカウント)
- Step Functions:Amazon Bedrockを呼び出す
 - IAMロール:Step Functions実行用のロール(AssumeRole権限を含む)
 
 - アカウントB:呼び出し先(Bedrock側アカウント)
- Amazon Bedrock:モデルを利用可能にする
 - IAMロール:Amazon Bedrockへのアクセス権限を持つロール

 
 
処理の流れは以下の通りです。
- Step FunctionsがAWS Security Token Service(STS)経由でBedrock側アカウントのIAMロールを引き受ける
 - 一時認証情報でBedrockにリクエスト
 - Bedrockからレスポンスを受け取る
 
前提条件
- Amazon Bedrockで利用したいモデルのアクセスが有効化されていること
- 本記事では
apac.anthropic.claude-sonnet-4-20250514-v1:0モデルを使用します 
 - 本記事では
 
Step Functions側アカウントでの作業
Step Functions側アカウントでは、以下の2つのリソースを作成します
- Step Functions実行用のIAMロール(AssumeRole権限含む)
 - 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を呼び出します。

アカウント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ステートでは、以下の処理を行います。
- ターゲットロールの指定:
CredentialsでBedrock側アカウントのIAMロールを指定 - Bedrock Runtime Converse API呼び出し:指定したモデルIDでテキスト生成を実行
 
クロスアカウントアクセスもコンソール上でIAMロールを指定するだけで容易に設定できます。

引数は以下の通りです。

IAMロールは先程作成したCrossAccountBedrockInvokerRoleを選択します。ログは有効化します。

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": "こんにちは、日本語でテストしています。"
}
実行結果
以下のようなレスポンスが返ってきました

{
  "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利用が実現できます。
参考






