Invoke and customize Amazon Bedrock models with Step Functions
You can integrate Step Functions with Amazon Bedrock to invoke a specified Amazon Bedrock model and create a fine-tuning job to customize a model. This page lists the supported Amazon Bedrock APIs and provides an example Task
state to extract the result of a model invocation.
To learn about integrating with AWS services in Step Functions, see Integrating services and Passing parameters to a service API in Step Functions.
Tip
To deploy an example workflow that integrates with Amazon Bedrock, see Perform AI prompt-chaining with Amazon Bedrock.
Amazon Bedrock service integration APIs
To integrate AWS Step Functions with Amazon Bedrock, you can use the following APIs. These APIs are similar to the corresponding Amazon Bedrock APIs, except InvokeModel has additional request fields.
Amazon Bedrock API - CreateModelCustomizationJob
Creates a fine-tuning job to customize a base model. You can invoke the Step Functions integration API with CreateModelCustomizationJob for Request Response, or CreateModelCustomizationJob.sync for Run a Job (.sync) integration patterns. There are no differences in the fields for the API calls.
Amazon Bedrock API - InvokeModel
Invokes the specified Amazon Bedrock model to run inference using the input you provide in the request body. You use InvokeModel
to run inference for text models, image models, and embedding models.
The Amazon Bedrock service integration API request body for InvokeModel includes the following additional parameters.
-
Body
– Specifies input data in the format specified in the content-type request header.Body
contains parameters specific to the target model.If you use the
InvokeModel
API, you must specify theBody
parameter. Step Functions doesn't validate the input you provide inBody
.When you specify
Body
using the Amazon Bedrock optimized integration, you can specify a payload of up to 256 KiB. If your payload exceeds 256 KiB, we recommend that you useInput
. -
Input
– Specifies the source to retrieve the input data from. This optional field is specific to Amazon Bedrock optimized integration with Step Functions. In this field, you can specify anS3Uri
.You can specify either
Body
in the Parameters orInput
, but not both.When you specify
Input
without specifyingContentType
, the content type of the input data source becomes the value forContentType
. -
Output
– Specifies the destination where the API response is written. This optional field is specific to Amazon Bedrock optimized integration with Step Functions. In this field, you can specify anS3Uri
.If you specify this field, the API response body is replaced with a reference to the Amazon S3 location of the original output.
The following example shows the syntax for InvokeModel API for Amazon Bedrock integration.
{ "ModelId": String, // required "Accept": String, // default: application/json "ContentType": String, // default: application/json "Input": { // not from Bedrock API "S3Uri": String }, "Output": { // not from Bedrock API "S3Uri": String } }
Task state definition for Amazon Bedrock integration
The following Task state definition shows how you can integrate with Amazon Bedrock in your state machines. This example shows a Task state that extracts the full result of model invocation specified by the path, result_one
. This is based on Inference parameters for foundation models. This example uses the Cohere Command large language model (LLM).
{ "Type": "Task", "Resource": "arn:aws:states:::bedrock:invokeModel", "Parameters": { "ModelId": "cohere.command-text-v14", "Body": { "prompt.$": "$.prompt_one", "max_tokens": 250 }, "ContentType": "application/json", "Accept": "*/*" }, "ResultPath": "$.result_one", "ResultSelector": { "result_one.$": "$.Body.generations[0].text" }, "End": true }
IAM policies for calling Amazon Bedrock
When you create a state machine using the console, Step Functions automatically creates an execution role for your state machine with the least privileges required. These automatically generated IAM roles are valid for the AWS Region in which you create the state machine.
We recommend that when you create IAM policies, do not include wildcards in the policies. As a security best practice, you should scope your policies down as much as possible. You should use dynamic policies only when certain input parameters are not known during runtime.
The following example templates show how AWS Step Functions generates IAM policies based on the resources in your state machine definition. For more information, see How Step Functions generates IAM policies for integrated services and Discover service integration patterns in Step Functions.
IAM policy examples for Amazon Bedrock integration
The following section describes the IAM permissions you need based on the Amazon Bedrock API that you use for a specific foundation or provisioned model. This section also contains examples of policies that grant full access.
Remember to replace the italicized
text with your resource-specific information.
-
IAM policy example to access a specific foundation model using InvokeModel
-
IAM policy example to access a specific provisioned model using InvokeModel
-
IAM policy example to access a specific foundation model as a base model
-
IAM policy example to access a specific custom model as a base model
-
Full access IAM policy example to use CreateModelCustomizationJob.sync
-
IAM policy example to access a specific foundation model using CreateModelCustomizationJob.sync
-
IAM policy example to access a custom model using CreateModelCustomizationJob.sync
-
Full access IAM policy example to use CreateModelCustomizationJob.sync
IAM policy example to access a specific foundation model using InvokeModel
The following is an IAM policy example for a state machine that accesses a specific foundation model named amazon.titan-text-express-v1
using the InvokeModel API action.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Sid": "InvokeModel1", "Action": [ "bedrock:InvokeModel" ], "Resource": [ "arn:aws:bedrock:us-east-2::foundation-model/
amazon.titan-text-express-v1
" ] } ] }
IAM policy example to access a specific provisioned model using InvokeModel
The following is an IAM policy example for a state machine that accesses a specific provisioned model named c2oi931ulksx
using the InvokeModel API action.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Sid": "InvokeModel1", "Action": [ "bedrock:InvokeModel" ], "Resource": [ "arn:aws:bedrock:us-east-2:
123456789012
:provisioned-model/c2oi931ulksx
" ] } ] }
Full access IAM policy example to use InvokeModel
The following is an IAM policy example for a state machine that provides full access when you use the InvokeModel API action.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Sid": "InvokeModel1", "Action": [ "bedrock:InvokeModel" ], "Resource": [ "arn:aws:bedrock:us-east-2::foundation-model/*", "arn:aws:bedrock:us-east-2:
123456789012
:provisioned-model/*" ] } ] }
IAM policy example to access a specific foundation model as a base model
The following is an IAM policy example for a state machine to access a specific foundation model named amazon.titan-text-express-v1
as a base model using the CreateModelCustomizationJob API action.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Sid": "CreateModelCustomizationJob1", "Action": [ "bedrock:CreateModelCustomizationJob" ], "Resource": [ "arn:aws:bedrock:us-east-2::foundation-model/
amazon.titan-text-express-v1
", "arn:aws:bedrock:us-east-2:123456789012
:custom-model/*", "arn:aws:bedrock:us-east-2:123456789012
:model-customization-job/*" ] }, { "Effect": "Allow", "Sid": "CreateModelCustomizationJob2", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::123456789012
:role/myRole
" ] } ] }
IAM policy example to access a specific custom model as a base model
The following is an IAM policy example for a state machine to access a specific custom model as a base model using the CreateModelCustomizationJob API action.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Sid": "CreateModelCustomizationJob1", "Action": [ "bedrock:CreateModelCustomizationJob" ], "Resource": [ "arn:aws:bedrock:us-east-2:
123456789012
:custom-model/*", "arn:aws:bedrock:us-east-2:123456789012
:model-customization-job/*" ] }, { "Effect": "Allow", "Sid": "CreateModelCustomizationJob2", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::123456789012
:role/[[roleName]]" ] } ] }
Full access IAM policy example to use CreateModelCustomizationJob.sync
The following is an IAM policy example for a state machine that provides full access when you use the CreateModelCustomizationJob API action.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Sid": "CreateModelCustomizationJob1", "Action": [ "bedrock:CreateModelCustomizationJob" ], "Resource": [ "arn:aws:bedrock:us-east-2::foundation-model/*", "arn:aws:bedrock:us-east-2:
123456789012
:custom-model/*", "arn:aws:bedrock:us-east-2:123456789012
:model-customization-job/*" ] }, { "Effect": "Allow", "Sid": "CreateModelCustomizationJob2", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::123456789012
:role/myRole
" ] } ] }
IAM policy example to access a specific foundation model using CreateModelCustomizationJob.sync
The following is an IAM policy example for a state machine to access a specific foundation model named amazon.titan-text-express-v1
using the CreateModelCustomizationJob.sync API action.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Sid": "CreateModelCustomizationJob1", "Action": [ "bedrock:CreateModelCustomizationJob" ], "Resource": [ "arn:aws:bedrock:us-east-2::foundation-model/amazon.titan-text-express-v1", "arn:aws:bedrock:us-east-2:
123456789012
:custom-model/*", "arn:aws:bedrock:us-east-2:123456789012
:model-customization-job/*" ] }, { "Effect": "Allow", "Sid": "CreateModelCustomizationJob2", "Action": [ "bedrock:GetModelCustomizationJob", "bedrock:StopModelCustomizationJob" ], "Resource": [ "arn:aws:bedrock:us-east-2:123456789012
:model-customization-job/*" ] }, { "Effect": "Allow", "Sid": "CreateModelCustomizationJob3", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::123456789012
:role/myRole
" ] } ] }
IAM policy example to access a custom model using CreateModelCustomizationJob.sync
The following is an IAM policy example for a state machine to access a custom model using the CreateModelCustomizationJob.sync API action.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Sid": "CreateModelCustomizationJob1", "Action": [ "bedrock:CreateModelCustomizationJob" ], "Resource": [ "arn:aws:bedrock:us-east-2:
123456789012
:custom-model/*", "arn:aws:bedrock:us-east-2:123456789012
:model-customization-job/*" ] }, { "Effect": "Allow", "Sid": "CreateModelCustomizationJob2", "Action": [ "bedrock:GetModelCustomizationJob", "bedrock:StopModelCustomizationJob" ], "Resource": [ "arn:aws:bedrock:us-east-2:123456789012
:model-customization-job/*" ] }, { "Effect": "Allow", "Sid": "CreateModelCustomizationJob3", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::123456789012
:role/myRole
" ] } ] }
Full access IAM policy example to use CreateModelCustomizationJob.sync
The following is an IAM policy example for a state machine that provides full access when you use the CreateModelCustomizationJob.sync API action.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Sid": "CreateModelCustomizationJob1", "Action": [ "bedrock:CreateModelCustomizationJob" ], "Resource": [ "arn:aws:bedrock:
us-east-2
::foundation-model/*", "arn:aws:bedrock:us-east-2
:123456789012
:custom-model/*", "arn:aws:bedrock:us-east-2
:123456789012
:model-customization-job/*" ] }, { "Effect": "Allow", "Sid": "CreateModelCustomizationJob2", "Action": [ "bedrock:GetModelCustomizationJob", "bedrock:StopModelCustomizationJob" ], "Resource": [ "arn:aws:bedrock:us-east-2
:123456789012
:model-customization-job/*" ] }, { "Effect": "Allow", "Sid": "CreateModelCustomizationJob3", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::123456789012
:role/myRole
" ] } ] }