Configure AWS Bedrock Agent Action Groups

The aws:bedrock/agentAgentActionGroup:AgentAgentActionGroup resource, part of the Pulumi AWS provider, defines action groups that extend Bedrock agents with custom capabilities by connecting them to Lambda functions or application code. This guide focuses on three capabilities: OpenAPI schema definition (file-based and S3-hosted), simplified function schema for inline definitions, and Lambda execution vs return-of-control patterns.

Action groups belong to existing Bedrock agents and reference Lambda functions or application handlers. The examples are intentionally small. Combine them with your own agent configuration, Lambda functions, and schema management strategy.

Define actions with an OpenAPI schema file

Most action groups describe available operations through an OpenAPI schema that tells the agent what your Lambda function can do and what parameters each operation accepts.

import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
import * as std from "@pulumi/std";

const example = new aws.bedrock.AgentAgentActionGroup("example", {
    actionGroupName: "example",
    agentId: "GGRRAED6JP",
    agentVersion: "DRAFT",
    skipResourceInUseCheck: true,
    actionGroupExecutor: {
        lambda: "arn:aws:lambda:us-west-2:123456789012:function:example-function",
    },
    apiSchema: {
        payload: std.file({
            input: "path/to/schema.yaml",
        }).then(invoke => invoke.result),
    },
});
import pulumi
import pulumi_aws as aws
import pulumi_std as std

example = aws.bedrock.AgentAgentActionGroup("example",
    action_group_name="example",
    agent_id="GGRRAED6JP",
    agent_version="DRAFT",
    skip_resource_in_use_check=True,
    action_group_executor={
        "lambda_": "arn:aws:lambda:us-west-2:123456789012:function:example-function",
    },
    api_schema={
        "payload": std.file(input="path/to/schema.yaml").result,
    })
package main

import (
	"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/bedrock"
	"github.com/pulumi/pulumi-std/sdk/go/std"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		invokeFile, err := std.File(ctx, &std.FileArgs{
			Input: "path/to/schema.yaml",
		}, nil)
		if err != nil {
			return err
		}
		_, err = bedrock.NewAgentAgentActionGroup(ctx, "example", &bedrock.AgentAgentActionGroupArgs{
			ActionGroupName:        pulumi.String("example"),
			AgentId:                pulumi.String("GGRRAED6JP"),
			AgentVersion:           pulumi.String("DRAFT"),
			SkipResourceInUseCheck: pulumi.Bool(true),
			ActionGroupExecutor: &bedrock.AgentAgentActionGroupActionGroupExecutorArgs{
				Lambda: pulumi.String("arn:aws:lambda:us-west-2:123456789012:function:example-function"),
			},
			ApiSchema: &bedrock.AgentAgentActionGroupApiSchemaArgs{
				Payload: pulumi.String(invokeFile.Result),
			},
		})
		if err != nil {
			return err
		}
		return nil
	})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Aws = Pulumi.Aws;
using Std = Pulumi.Std;

return await Deployment.RunAsync(() => 
{
    var example = new Aws.Bedrock.AgentAgentActionGroup("example", new()
    {
        ActionGroupName = "example",
        AgentId = "GGRRAED6JP",
        AgentVersion = "DRAFT",
        SkipResourceInUseCheck = true,
        ActionGroupExecutor = new Aws.Bedrock.Inputs.AgentAgentActionGroupActionGroupExecutorArgs
        {
            Lambda = "arn:aws:lambda:us-west-2:123456789012:function:example-function",
        },
        ApiSchema = new Aws.Bedrock.Inputs.AgentAgentActionGroupApiSchemaArgs
        {
            Payload = Std.File.Invoke(new()
            {
                Input = "path/to/schema.yaml",
            }).Apply(invoke => invoke.Result),
        },
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.bedrock.AgentAgentActionGroup;
import com.pulumi.aws.bedrock.AgentAgentActionGroupArgs;
import com.pulumi.aws.bedrock.inputs.AgentAgentActionGroupActionGroupExecutorArgs;
import com.pulumi.aws.bedrock.inputs.AgentAgentActionGroupApiSchemaArgs;
import com.pulumi.std.StdFunctions;
import com.pulumi.std.inputs.FileArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var example = new AgentAgentActionGroup("example", AgentAgentActionGroupArgs.builder()
            .actionGroupName("example")
            .agentId("GGRRAED6JP")
            .agentVersion("DRAFT")
            .skipResourceInUseCheck(true)
            .actionGroupExecutor(AgentAgentActionGroupActionGroupExecutorArgs.builder()
                .lambda("arn:aws:lambda:us-west-2:123456789012:function:example-function")
                .build())
            .apiSchema(AgentAgentActionGroupApiSchemaArgs.builder()
                .payload(StdFunctions.file(FileArgs.builder()
                    .input("path/to/schema.yaml")
                    .build()).result())
                .build())
            .build());

    }
}
resources:
  example:
    type: aws:bedrock:AgentAgentActionGroup
    properties:
      actionGroupName: example
      agentId: GGRRAED6JP
      agentVersion: DRAFT
      skipResourceInUseCheck: true
      actionGroupExecutor:
        lambda: arn:aws:lambda:us-west-2:123456789012:function:example-function
      apiSchema:
        payload:
          fn::invoke:
            function: std:file
            arguments:
              input: path/to/schema.yaml
            return: result

When the agent invokes an action, Bedrock calls the Lambda function specified in actionGroupExecutor. The apiSchema payload property loads your OpenAPI definition from a local file, which describes endpoints, parameters, and response formats. The agentVersion must be “DRAFT” for action groups under development.

Reference API schemas stored in S3

Teams managing schemas centrally store OpenAPI definitions in S3 rather than embedding them in code, supporting versioning and sharing across action groups.

import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";

const example = new aws.bedrock.AgentAgentActionGroup("example", {
    actionGroupName: "example",
    agentId: "GGRRAED6JP",
    agentVersion: "DRAFT",
    skipResourceInUseCheck: true,
    actionGroupExecutor: {
        lambda: "arn:aws:lambda:us-west-2:123456789012:function:example-function",
    },
    apiSchema: {
        s3: {
            s3BucketName: "example-bucket",
            s3ObjectKey: "path/to/schema.json",
        },
    },
});
import pulumi
import pulumi_aws as aws

example = aws.bedrock.AgentAgentActionGroup("example",
    action_group_name="example",
    agent_id="GGRRAED6JP",
    agent_version="DRAFT",
    skip_resource_in_use_check=True,
    action_group_executor={
        "lambda_": "arn:aws:lambda:us-west-2:123456789012:function:example-function",
    },
    api_schema={
        "s3": {
            "s3_bucket_name": "example-bucket",
            "s3_object_key": "path/to/schema.json",
        },
    })
package main

import (
	"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/bedrock"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := bedrock.NewAgentAgentActionGroup(ctx, "example", &bedrock.AgentAgentActionGroupArgs{
			ActionGroupName:        pulumi.String("example"),
			AgentId:                pulumi.String("GGRRAED6JP"),
			AgentVersion:           pulumi.String("DRAFT"),
			SkipResourceInUseCheck: pulumi.Bool(true),
			ActionGroupExecutor: &bedrock.AgentAgentActionGroupActionGroupExecutorArgs{
				Lambda: pulumi.String("arn:aws:lambda:us-west-2:123456789012:function:example-function"),
			},
			ApiSchema: &bedrock.AgentAgentActionGroupApiSchemaArgs{
				S3: &bedrock.AgentAgentActionGroupApiSchemaS3Args{
					S3BucketName: pulumi.String("example-bucket"),
					S3ObjectKey:  pulumi.String("path/to/schema.json"),
				},
			},
		})
		if err != nil {
			return err
		}
		return nil
	})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Aws = Pulumi.Aws;

return await Deployment.RunAsync(() => 
{
    var example = new Aws.Bedrock.AgentAgentActionGroup("example", new()
    {
        ActionGroupName = "example",
        AgentId = "GGRRAED6JP",
        AgentVersion = "DRAFT",
        SkipResourceInUseCheck = true,
        ActionGroupExecutor = new Aws.Bedrock.Inputs.AgentAgentActionGroupActionGroupExecutorArgs
        {
            Lambda = "arn:aws:lambda:us-west-2:123456789012:function:example-function",
        },
        ApiSchema = new Aws.Bedrock.Inputs.AgentAgentActionGroupApiSchemaArgs
        {
            S3 = new Aws.Bedrock.Inputs.AgentAgentActionGroupApiSchemaS3Args
            {
                S3BucketName = "example-bucket",
                S3ObjectKey = "path/to/schema.json",
            },
        },
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.bedrock.AgentAgentActionGroup;
import com.pulumi.aws.bedrock.AgentAgentActionGroupArgs;
import com.pulumi.aws.bedrock.inputs.AgentAgentActionGroupActionGroupExecutorArgs;
import com.pulumi.aws.bedrock.inputs.AgentAgentActionGroupApiSchemaArgs;
import com.pulumi.aws.bedrock.inputs.AgentAgentActionGroupApiSchemaS3Args;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var example = new AgentAgentActionGroup("example", AgentAgentActionGroupArgs.builder()
            .actionGroupName("example")
            .agentId("GGRRAED6JP")
            .agentVersion("DRAFT")
            .skipResourceInUseCheck(true)
            .actionGroupExecutor(AgentAgentActionGroupActionGroupExecutorArgs.builder()
                .lambda("arn:aws:lambda:us-west-2:123456789012:function:example-function")
                .build())
            .apiSchema(AgentAgentActionGroupApiSchemaArgs.builder()
                .s3(AgentAgentActionGroupApiSchemaS3Args.builder()
                    .s3BucketName("example-bucket")
                    .s3ObjectKey("path/to/schema.json")
                    .build())
                .build())
            .build());

    }
}
resources:
  example:
    type: aws:bedrock:AgentAgentActionGroup
    properties:
      actionGroupName: example
      agentId: GGRRAED6JP
      agentVersion: DRAFT
      skipResourceInUseCheck: true
      actionGroupExecutor:
        lambda: arn:aws:lambda:us-west-2:123456789012:function:example-function
      apiSchema:
        s3:
          s3BucketName: example-bucket
          s3ObjectKey: path/to/schema.json

The apiSchema s3 block points to a schema object in S3 instead of loading from a local file. The s3BucketName and s3ObjectKey properties specify the location. Your Lambda execution role needs read permissions for the bucket.

Define actions inline with function schema

For simpler cases, you can specify actions directly in the configuration without maintaining a separate OpenAPI file.

import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";

const example = new aws.bedrock.AgentAgentActionGroup("example", {
    actionGroupName: "example",
    agentId: "GGRRAED6JP",
    agentVersion: "DRAFT",
    skipResourceInUseCheck: true,
    actionGroupExecutor: {
        lambda: "arn:aws:lambda:us-west-2:123456789012:function:example-function",
    },
    functionSchema: {
        memberFunctions: {
            functions: [{
                name: "example-function",
                description: "Example function",
                parameters: [
                    {
                        mapBlockKey: "param1",
                        type: "string",
                        description: "The first parameter",
                        required: true,
                    },
                    {
                        mapBlockKey: "param2",
                        type: "integer",
                        description: "The second parameter",
                        required: false,
                    },
                ],
            }],
        },
    },
});
import pulumi
import pulumi_aws as aws

example = aws.bedrock.AgentAgentActionGroup("example",
    action_group_name="example",
    agent_id="GGRRAED6JP",
    agent_version="DRAFT",
    skip_resource_in_use_check=True,
    action_group_executor={
        "lambda_": "arn:aws:lambda:us-west-2:123456789012:function:example-function",
    },
    function_schema={
        "member_functions": {
            "functions": [{
                "name": "example-function",
                "description": "Example function",
                "parameters": [
                    {
                        "map_block_key": "param1",
                        "type": "string",
                        "description": "The first parameter",
                        "required": True,
                    },
                    {
                        "map_block_key": "param2",
                        "type": "integer",
                        "description": "The second parameter",
                        "required": False,
                    },
                ],
            }],
        },
    })
package main

import (
	"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/bedrock"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := bedrock.NewAgentAgentActionGroup(ctx, "example", &bedrock.AgentAgentActionGroupArgs{
			ActionGroupName:        pulumi.String("example"),
			AgentId:                pulumi.String("GGRRAED6JP"),
			AgentVersion:           pulumi.String("DRAFT"),
			SkipResourceInUseCheck: pulumi.Bool(true),
			ActionGroupExecutor: &bedrock.AgentAgentActionGroupActionGroupExecutorArgs{
				Lambda: pulumi.String("arn:aws:lambda:us-west-2:123456789012:function:example-function"),
			},
			FunctionSchema: &bedrock.AgentAgentActionGroupFunctionSchemaArgs{
				MemberFunctions: &bedrock.AgentAgentActionGroupFunctionSchemaMemberFunctionsArgs{
					Functions: bedrock.AgentAgentActionGroupFunctionSchemaMemberFunctionsFunctionArray{
						&bedrock.AgentAgentActionGroupFunctionSchemaMemberFunctionsFunctionArgs{
							Name:        pulumi.String("example-function"),
							Description: pulumi.String("Example function"),
							Parameters: bedrock.AgentAgentActionGroupFunctionSchemaMemberFunctionsFunctionParameterArray{
								&bedrock.AgentAgentActionGroupFunctionSchemaMemberFunctionsFunctionParameterArgs{
									MapBlockKey: pulumi.String("param1"),
									Type:        pulumi.String("string"),
									Description: pulumi.String("The first parameter"),
									Required:    pulumi.Bool(true),
								},
								&bedrock.AgentAgentActionGroupFunctionSchemaMemberFunctionsFunctionParameterArgs{
									MapBlockKey: pulumi.String("param2"),
									Type:        pulumi.String("integer"),
									Description: pulumi.String("The second parameter"),
									Required:    pulumi.Bool(false),
								},
							},
						},
					},
				},
			},
		})
		if err != nil {
			return err
		}
		return nil
	})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Aws = Pulumi.Aws;

return await Deployment.RunAsync(() => 
{
    var example = new Aws.Bedrock.AgentAgentActionGroup("example", new()
    {
        ActionGroupName = "example",
        AgentId = "GGRRAED6JP",
        AgentVersion = "DRAFT",
        SkipResourceInUseCheck = true,
        ActionGroupExecutor = new Aws.Bedrock.Inputs.AgentAgentActionGroupActionGroupExecutorArgs
        {
            Lambda = "arn:aws:lambda:us-west-2:123456789012:function:example-function",
        },
        FunctionSchema = new Aws.Bedrock.Inputs.AgentAgentActionGroupFunctionSchemaArgs
        {
            MemberFunctions = new Aws.Bedrock.Inputs.AgentAgentActionGroupFunctionSchemaMemberFunctionsArgs
            {
                Functions = new[]
                {
                    new Aws.Bedrock.Inputs.AgentAgentActionGroupFunctionSchemaMemberFunctionsFunctionArgs
                    {
                        Name = "example-function",
                        Description = "Example function",
                        Parameters = new[]
                        {
                            new Aws.Bedrock.Inputs.AgentAgentActionGroupFunctionSchemaMemberFunctionsFunctionParameterArgs
                            {
                                MapBlockKey = "param1",
                                Type = "string",
                                Description = "The first parameter",
                                Required = true,
                            },
                            new Aws.Bedrock.Inputs.AgentAgentActionGroupFunctionSchemaMemberFunctionsFunctionParameterArgs
                            {
                                MapBlockKey = "param2",
                                Type = "integer",
                                Description = "The second parameter",
                                Required = false,
                            },
                        },
                    },
                },
            },
        },
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.bedrock.AgentAgentActionGroup;
import com.pulumi.aws.bedrock.AgentAgentActionGroupArgs;
import com.pulumi.aws.bedrock.inputs.AgentAgentActionGroupActionGroupExecutorArgs;
import com.pulumi.aws.bedrock.inputs.AgentAgentActionGroupFunctionSchemaArgs;
import com.pulumi.aws.bedrock.inputs.AgentAgentActionGroupFunctionSchemaMemberFunctionsArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var example = new AgentAgentActionGroup("example", AgentAgentActionGroupArgs.builder()
            .actionGroupName("example")
            .agentId("GGRRAED6JP")
            .agentVersion("DRAFT")
            .skipResourceInUseCheck(true)
            .actionGroupExecutor(AgentAgentActionGroupActionGroupExecutorArgs.builder()
                .lambda("arn:aws:lambda:us-west-2:123456789012:function:example-function")
                .build())
            .functionSchema(AgentAgentActionGroupFunctionSchemaArgs.builder()
                .memberFunctions(AgentAgentActionGroupFunctionSchemaMemberFunctionsArgs.builder()
                    .functions(AgentAgentActionGroupFunctionSchemaMemberFunctionsFunctionArgs.builder()
                        .name("example-function")
                        .description("Example function")
                        .parameters(                        
                            AgentAgentActionGroupFunctionSchemaMemberFunctionsFunctionParameterArgs.builder()
                                .mapBlockKey("param1")
                                .type("string")
                                .description("The first parameter")
                                .required(true)
                                .build(),
                            AgentAgentActionGroupFunctionSchemaMemberFunctionsFunctionParameterArgs.builder()
                                .mapBlockKey("param2")
                                .type("integer")
                                .description("The second parameter")
                                .required(false)
                                .build())
                        .build())
                    .build())
                .build())
            .build());

    }
}
resources:
  example:
    type: aws:bedrock:AgentAgentActionGroup
    properties:
      actionGroupName: example
      agentId: GGRRAED6JP
      agentVersion: DRAFT
      skipResourceInUseCheck: true
      actionGroupExecutor:
        lambda: arn:aws:lambda:us-west-2:123456789012:function:example-function
      functionSchema:
        memberFunctions:
          functions:
            - name: example-function
              description: Example function
              parameters:
                - mapBlockKey: param1
                  type: string
                  description: The first parameter
                  required: true
                - mapBlockKey: param2
                  type: integer
                  description: The second parameter
                  required: false

The functionSchema memberFunctions block defines actions inline. Each function in the functions array describes one action with its parameters. The mapBlockKey identifies each parameter, type specifies its data type, and required controls whether the agent must provide it. This approach works well for straightforward APIs with a few parameters.

Return control to application for custom handling

Some workflows need the application to handle action execution directly rather than delegating to Lambda.

import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
import * as std from "@pulumi/std";

const example = new aws.bedrock.AgentAgentActionGroup("example", {
    actionGroupName: "example",
    agentId: "GGRRAED6JP",
    agentVersion: "DRAFT",
    skipResourceInUseCheck: true,
    actionGroupExecutor: {
        customControl: "RETURN_CONTROL",
    },
    apiSchema: {
        payload: std.file({
            input: "path/to/schema.yaml",
        }).then(invoke => invoke.result),
    },
});
import pulumi
import pulumi_aws as aws
import pulumi_std as std

example = aws.bedrock.AgentAgentActionGroup("example",
    action_group_name="example",
    agent_id="GGRRAED6JP",
    agent_version="DRAFT",
    skip_resource_in_use_check=True,
    action_group_executor={
        "custom_control": "RETURN_CONTROL",
    },
    api_schema={
        "payload": std.file(input="path/to/schema.yaml").result,
    })
package main

import (
	"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/bedrock"
	"github.com/pulumi/pulumi-std/sdk/go/std"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		invokeFile, err := std.File(ctx, &std.FileArgs{
			Input: "path/to/schema.yaml",
		}, nil)
		if err != nil {
			return err
		}
		_, err = bedrock.NewAgentAgentActionGroup(ctx, "example", &bedrock.AgentAgentActionGroupArgs{
			ActionGroupName:        pulumi.String("example"),
			AgentId:                pulumi.String("GGRRAED6JP"),
			AgentVersion:           pulumi.String("DRAFT"),
			SkipResourceInUseCheck: pulumi.Bool(true),
			ActionGroupExecutor: &bedrock.AgentAgentActionGroupActionGroupExecutorArgs{
				CustomControl: pulumi.String("RETURN_CONTROL"),
			},
			ApiSchema: &bedrock.AgentAgentActionGroupApiSchemaArgs{
				Payload: pulumi.String(invokeFile.Result),
			},
		})
		if err != nil {
			return err
		}
		return nil
	})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Aws = Pulumi.Aws;
using Std = Pulumi.Std;

return await Deployment.RunAsync(() => 
{
    var example = new Aws.Bedrock.AgentAgentActionGroup("example", new()
    {
        ActionGroupName = "example",
        AgentId = "GGRRAED6JP",
        AgentVersion = "DRAFT",
        SkipResourceInUseCheck = true,
        ActionGroupExecutor = new Aws.Bedrock.Inputs.AgentAgentActionGroupActionGroupExecutorArgs
        {
            CustomControl = "RETURN_CONTROL",
        },
        ApiSchema = new Aws.Bedrock.Inputs.AgentAgentActionGroupApiSchemaArgs
        {
            Payload = Std.File.Invoke(new()
            {
                Input = "path/to/schema.yaml",
            }).Apply(invoke => invoke.Result),
        },
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.bedrock.AgentAgentActionGroup;
import com.pulumi.aws.bedrock.AgentAgentActionGroupArgs;
import com.pulumi.aws.bedrock.inputs.AgentAgentActionGroupActionGroupExecutorArgs;
import com.pulumi.aws.bedrock.inputs.AgentAgentActionGroupApiSchemaArgs;
import com.pulumi.std.StdFunctions;
import com.pulumi.std.inputs.FileArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var example = new AgentAgentActionGroup("example", AgentAgentActionGroupArgs.builder()
            .actionGroupName("example")
            .agentId("GGRRAED6JP")
            .agentVersion("DRAFT")
            .skipResourceInUseCheck(true)
            .actionGroupExecutor(AgentAgentActionGroupActionGroupExecutorArgs.builder()
                .customControl("RETURN_CONTROL")
                .build())
            .apiSchema(AgentAgentActionGroupApiSchemaArgs.builder()
                .payload(StdFunctions.file(FileArgs.builder()
                    .input("path/to/schema.yaml")
                    .build()).result())
                .build())
            .build());

    }
}
resources:
  example:
    type: aws:bedrock:AgentAgentActionGroup
    properties:
      actionGroupName: example
      agentId: GGRRAED6JP
      agentVersion: DRAFT
      skipResourceInUseCheck: true
      actionGroupExecutor:
        customControl: RETURN_CONTROL
      apiSchema:
        payload:
          fn::invoke:
            function: std:file
            arguments:
              input: path/to/schema.yaml
            return: result

Setting actionGroupExecutor customControl to “RETURN_CONTROL” tells Bedrock to pass action invocation details back through the InvokeAgent API response instead of calling a Lambda function. Your application code receives the action name and parameters, executes the logic, and returns results in the next API call.

Beyond these examples

These snippets focus on specific action group features: OpenAPI schema definition (file-based and S3-hosted), simplified function schema for inline action definitions, and Lambda execution and return-of-control patterns. They’re intentionally minimal rather than full agent implementations.

The examples reference pre-existing infrastructure such as Bedrock agents (agentId references), Lambda functions for action execution, and S3 buckets for schema storage. They focus on configuring the action group rather than provisioning the surrounding agent infrastructure.

To keep things focused, common action group patterns are omitted, including:

  • Agent state management (actionGroupState property)
  • User input collection (parentActionGroupSignature with AMAZON.UserInput)
  • Agent preparation control (prepareAgent property)
  • Resource deletion behavior (skipResourceInUseCheck)

These omissions are intentional: the goal is to illustrate how each action group feature is wired, not provide drop-in agent modules. See the Bedrock Agent Action Group resource reference for all available configuration options.

Let's configure AWS Bedrock Agent Action Groups

Get started with Pulumi Cloud, then follow our quick setup guide to deploy this infrastructure.

Try Pulumi Cloud for FREE

Frequently Asked Questions

Configuration Basics
Why can I only use DRAFT for the agent version?
The agentVersion property only accepts DRAFT as a valid value. No other agent versions are currently supported for action groups.
What's the difference between ENABLED and DISABLED action group states?
Setting actionGroupState to ENABLED makes the action group available for InvokeAgent requests, while DISABLED prevents the agent from invoking it.
Does the agent automatically prepare after I create or modify an action group?
Yes, by default. The prepareAgent property defaults to true, automatically preparing the agent after creation or modification.
Schema Definition
What are my options for defining the action group schema?

You have three options:

  1. Inline payload - Use apiSchema.payload with YAML or JSON content
  2. S3 reference - Use apiSchema.s3 with bucket name and object key
  3. Function schema - Use functionSchema for a simplified schema definition without OpenAPI
When should I use functionSchema instead of apiSchema?
Use functionSchema when you want a simplified schema definition. It lets you define functions with parameters directly in Pulumi code, avoiding the need for separate OpenAPI schema files.
Execution Models
What's the difference between Lambda executor and return of control?
Use actionGroupExecutor.lambda with a Lambda function ARN for direct execution of business logic. Use actionGroupExecutor.customControl set to RETURN_CONTROL to handle the action logic outside the action group, giving you more control over the execution flow.
Special Cases & Gotchas
How do I allow my agent to request additional information from users?
Set parentActionGroupSignature to AMAZON.UserInput. When using this value, you must leave description, apiSchema, and actionGroupExecutor blank.
What does skipResourceInUseCheck do?
Setting skipResourceInUseCheck to true skips the in-use check when deleting the action group, allowing deletion even if the action group is currently in use.

Using a different cloud?

Explore analytics guides for other cloud providers: