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