You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2023/08/08 04:45:25 UTC

[camel] branch main updated: CAMEL-12317: Added AWS StepFunctions Component (#11014)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new b3180b12fc8 CAMEL-12317: Added AWS StepFunctions Component (#11014)
b3180b12fc8 is described below

commit b3180b12fc8be34381587bdacdbc24528e2fcea0
Author: Vignesh Nayak Manel <vn...@gmail.com>
AuthorDate: Tue Aug 8 10:15:18 2023 +0530

    CAMEL-12317: Added AWS StepFunctions Component (#11014)
    
    * CAMEL-12317: Added AWS StepFunctions Component
    
    * CAMEL-12317: Updated minor changes and used Java 17 instanceof syntax
    
    * CAMEL-12317: Added test cases, doc and refactored code
    
    * CAMEL-12317: Updated doc and added auto generated files
    
    ---------
    
    Co-authored-by: Vignesh Nayak Manel <vi...@Vigneshs-MacBook-Air.local>
---
 bom/camel-bom/pom.xml                              |   5 +
 catalog/camel-allcomponents/pom.xml                |   5 +
 .../org/apache/camel/catalog/components.properties |   1 +
 .../catalog/components/aws2-step-functions.json    |  85 +++
 .../camel-aws/camel-aws2-step-functions/pom.xml    |  87 +++
 .../StepFunctions2ComponentConfigurer.java         | 166 +++++
 .../StepFunctions2EndpointConfigurer.java          | 138 ++++
 .../StepFunctions2EndpointUriFactory.java          |  87 +++
 .../services/org/apache/camel/component.properties |   7 +
 .../org/apache/camel/component/aws2-step-functions |   2 +
 .../camel/configurer/aws2-step-functions-component |   2 +
 .../camel/configurer/aws2-step-functions-endpoint  |   2 +
 .../camel/urifactory/aws2-step-functions-endpoint  |   2 +
 .../aws2/stepfunctions/aws2-step-functions.json    |  85 +++
 .../main/docs/aws2-step-functions-component.adoc   | 152 ++++
 .../stepfunctions/StepFunctions2Component.java     |  69 ++
 .../stepfunctions/StepFunctions2Configuration.java | 246 ++++++
 .../stepfunctions/StepFunctions2Constants.java     |  79 ++
 .../aws2/stepfunctions/StepFunctions2Endpoint.java |  88 +++
 .../stepfunctions/StepFunctions2Operations.java    |  38 +
 .../aws2/stepfunctions/StepFunctions2Producer.java | 729 ++++++++++++++++++
 .../StepFunctions2ProducerHealthCheck.java         |  71 ++
 .../client/StepFunctions2ClientFactory.java        |  41 +
 .../client/StepFunctions2InternalClient.java       |  32 +
 .../impl/StepFunctions2ClientIAMOptimizedImpl.java |  89 +++
 .../impl/StepFunctions2ClientStandardImpl.java     | 104 +++
 .../AmazonStepFunctionsClientMock.java             | 158 ++++
 .../StepFunctions2ClientFactoryTest.java           |  51 ++
 .../StepFunctions2ComponentClientRegistryTest.java |  59 ++
 .../StepFunctions2ComponentConfigurationTest.java  |  89 +++
 ...ctions2ProducerHealthCheckProfileCredsTest.java |  94 +++
 ...nctions2ProducerHealthCheckStaticCredsTest.java |  95 +++
 .../StepFunctions2ProducerSpringTest.java          | 337 +++++++++
 .../stepfunctions/StepFunctions2ProducerTest.java  | 397 ++++++++++
 .../src/test/resources/log4j2.properties           |  28 +
 .../StepFunctionsComponentSpringTest-context.xml   | 115 +++
 components/camel-aws/pom.xml                       |   1 +
 .../org/apache/camel/main/components.properties    |   1 +
 .../ROOT/examples/json/aws2-step-functions.json    |   1 +
 docs/components/modules/ROOT/nav.adoc              |   1 +
 .../ROOT/pages/aws2-step-functions-component.adoc  |   1 +
 .../component/ComponentsBuilderFactory.java        |  13 +
 .../Aws2StepFunctionsComponentBuilderFactory.java  | 443 +++++++++++
 .../src/generated/resources/metadata.json          |  22 +
 .../builder/endpoint/EndpointBuilderFactory.java   |   1 +
 .../camel/builder/endpoint/EndpointBuilders.java   |   1 +
 .../builder/endpoint/StaticEndpointBuilders.java   |  43 ++
 .../dsl/StepFunctions2EndpointBuilderFactory.java  | 830 +++++++++++++++++++++
 .../camel-component-known-dependencies.properties  |   1 +
 parent/pom.xml                                     |   5 +
 .../apache/camel/maven/packaging/MojoHelper.java   |   3 +-
 51 files changed, 5201 insertions(+), 1 deletion(-)

diff --git a/bom/camel-bom/pom.xml b/bom/camel-bom/pom.xml
index 24ae2b3f66a..e6f39b5a037 100644
--- a/bom/camel-bom/pom.xml
+++ b/bom/camel-bom/pom.xml
@@ -221,6 +221,11 @@
         <artifactId>camel-aws2-sqs</artifactId>
         <version>${project.version}</version>
       </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>camel-aws2-step-functions</artifactId>
+        <version>${project.version}</version>
+      </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
         <artifactId>camel-aws2-sts</artifactId>
diff --git a/catalog/camel-allcomponents/pom.xml b/catalog/camel-allcomponents/pom.xml
index 672d680eaaf..2a729bd0af6 100644
--- a/catalog/camel-allcomponents/pom.xml
+++ b/catalog/camel-allcomponents/pom.xml
@@ -217,6 +217,11 @@
             <artifactId>camel-aws2-sqs</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-aws2-step-functions</artifactId>
+            <version>${project.version}</version>
+        </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-aws2-sts</artifactId>
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
index d7ffb452357..75a7ac2930b 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
@@ -27,6 +27,7 @@ aws2-s3
 aws2-ses
 aws2-sns
 aws2-sqs
+aws2-step-functions
 aws2-sts
 aws2-translate
 azure-cosmosdb
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-step-functions.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-step-functions.json
new file mode 100644
index 00000000000..5d6608196f6
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-step-functions.json
@@ -0,0 +1,85 @@
+{
+  "component": {
+    "kind": "component",
+    "name": "aws2-step-functions",
+    "title": "AWS StepFunctions",
+    "description": "Manage and invoke AWS Step functions using AWS SDK version 2.x.",
+    "deprecated": false,
+    "firstVersion": "4.0.0",
+    "label": "cloud,serverless",
+    "javaType": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Component",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-aws2-step-functions",
+    "version": "4.0.0-SNAPSHOT",
+    "scheme": "aws2-step-functions",
+    "extendsScheme": "",
+    "syntax": "aws2-step-functions:label",
+    "async": false,
+    "api": false,
+    "consumerOnly": false,
+    "producerOnly": true,
+    "lenientProperties": false
+  },
+  "componentProperties": {
+    "configuration": { "index": 0, "kind": "property", "displayName": "Configuration", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "deprecated": false, "autowired": false, "secret": false, "description": "Component configuration" },
+    "lazyStartProducer": { "index": 1, "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail [...]
+    "operation": { "index": 2, "kind": "property", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "object", "javaType": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Operations", "enum": [ "createStateMachine", "deleteStateMachine", "updateStateMachine", "describeStateMachine", "listStateMachines", "createActivity", "deleteActivity", "describeActivity", "getActivityTask", "listActivities", "startExecution", "startSyncExecution", "st [...]
+    "overrideEndpoint": { "index": 3, "kind": "property", "displayName": "Override Endpoint", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Set the need for overidding the endpoint. This option needs to be us [...]
+    "pojoRequest": { "index": 4, "kind": "property", "displayName": "Pojo Request", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "If we want to use a POJO request as body or not" },
+    "profileCredentialsName": { "index": 5, "kind": "property", "displayName": "Profile Credentials Name", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "If using a profile credentials provider this parameter will set the pr [...]
+    "region": { "index": 6, "kind": "property", "displayName": "Region", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "The region in which StepFunctions client needs to work. When using this parameter, the configuration wil [...]
+    "trustAllCertificates": { "index": 7, "kind": "property", "displayName": "Trust All Certificates", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "If we want to trust all certificates in case of overriding  [...]
+    "uriEndpointOverride": { "index": 8, "kind": "property", "displayName": "Uri Endpoint Override", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Set the overriding uri endpoint. This option needs to be used in combination [...]
+    "useDefaultCredentialsProvider": { "index": 9, "kind": "property", "displayName": "Use Default Credentials Provider", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Set whether the StepFunctions client sho [...]
+    "useProfileCredentialsProvider": { "index": 10, "kind": "property", "displayName": "Use Profile Credentials Provider", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Set whether the StepFunctions client sh [...]
+    "autowiredEnabled": { "index": 11, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching  [...]
+    "awsSfnClient": { "index": 12, "kind": "property", "displayName": "Aws Sfn Client", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "software.amazon.awssdk.services.sfn.SfnClient", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "To use a existing configured A [...]
+    "healthCheckConsumerEnabled": { "index": 13, "kind": "property", "displayName": "Health Check Consumer Enabled", "group": "health", "label": "health", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Used for enabling or disabling all consumer based health checks from this component" },
+    "healthCheckProducerEnabled": { "index": 14, "kind": "property", "displayName": "Health Check Producer Enabled", "group": "health", "label": "health", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Used for enabling or disabling all producer based health checks from this component. Notice: Camel has by default disabled all producer based health-checks. You can turn on produce [...]
+    "proxyHost": { "index": 15, "kind": "property", "displayName": "Proxy Host", "group": "proxy", "label": "proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "To define a proxy host when instantiating the StepFunctions client" },
+    "proxyPort": { "index": 16, "kind": "property", "displayName": "Proxy Port", "group": "proxy", "label": "proxy", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "To define a proxy port when instantiating the StepFunctions client" },
+    "proxyProtocol": { "index": 17, "kind": "property", "displayName": "Proxy Protocol", "group": "proxy", "label": "proxy", "required": false, "type": "object", "javaType": "software.amazon.awssdk.core.Protocol", "enum": [ "HTTP", "HTTPS" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "HTTPS", "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "To define a  [...]
+    "accessKey": { "index": 18, "kind": "property", "displayName": "Access Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Amazon AWS Access Key" },
+    "secretKey": { "index": 19, "kind": "property", "displayName": "Secret Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Amazon AWS Secret Key" }
+  },
+  "headers": {
+    "CamelAwsStateMachineOperation": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation we want to perform", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#OPERATION" },
+    "CamelAwsStepFunctionsStateMachineName": { "index": 1, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the state machine", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#STATE_MACHINE_NAME" },
+    "CamelAwsStepFunctionsStateMachineDefinition": { "index": 2, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Amazon States Language definition of the state machine", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#STATE_MACHINE_DEFINITION" },
+    "CamelAwsStepFunctionsStateMachineType": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Determines whether a Standard or Express state machine is created", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#STATE_MACHINE_TYPE" },
+    "CamelAwsStepFunctionsStateMachineRoleArn": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Amazon Resource Name (ARN) of the IAM role to use for this state machine.", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#STATE_MACHINE_ROLE_ARN" },
+    "CamelAwsStepFunctionsStateMachineArn": { "index": 5, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Amazon Resource Name (ARN) of state machine.", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#STATE_MACHINE_ARN" },
+    "CamelAwsStateMachinesMaxResults": { "index": 6, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The limit number of results while listing state machines", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#STATE_MACHINES_MAX_RESULTS" },
+    "CamelAwsStepFunctionsStateMachineActivityName": { "index": 7, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the state machine activity", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#ACTIVITY_NAME" },
+    "CamelAwsStepFunctionsStateMachineActivityArn": { "index": 8, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ARN of the state machine activity", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#ACTIVITY_ARN" },
+    "CamelAwsStateMachineActivitiesMaxResults": { "index": 9, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The limit number of results while listing state machines", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#ACTIVITIES_MAX_RESULTS" },
+    "CamelAwsStateMachineExecutionArn": { "index": 10, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Amazon Resource Name (ARN) of the execution.", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTION_ARN" },
+    "CamelAwsStateMachineExecutionName": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Optional name of the execution.", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTION_NAME" },
+    "CamelAwsStateMachineExecutionInput": { "index": 12, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The string that contains the JSON input data for the execution.", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTION_INPUT" },
+    "CamelAwsStateMachineExecutionTraceHeader": { "index": 13, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Passes the X-Ray trace header.", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTION_TRACE_HEADER" },
+    "CamelAwsStateMachineExecutionHistoryMaxResults": { "index": 14, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The limit number of results while listing execution history", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTION_HISTORY_MAX_RESULTS" },
+    "CamelAwsStateMachineExecutionHistoryIncludeExecutionData": { "index": 15, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "You can select whether execution data (input or output of a history event) is returned.", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTION_HISTORY_INCLUDE_ [...]
+    "CamelAwsStateMachineExecutionHistoryReverseOrder": { "index": 16, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Lists events in descending order of their timeStamp.", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTION_HISTORY_REVERSE_ORDER" },
+    "CamelAwsStateMachineExecutionMaxResults": { "index": 17, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The limit number of results while listing executions", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTIONS_MAX_RESULTS" }
+  },
+  "properties": {
+    "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Logical name" },
+    "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "object", "javaType": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Operations", "enum": [ "createStateMachine", "deleteStateMachine", "updateStateMachine", "describeStateMachine", "listStateMachines", "createActivity", "deleteActivity", "describeActivity", "getActivityTask", "listActivities", "startExecution", "startSyncExecution", "s [...]
+    "overrideEndpoint": { "index": 2, "kind": "parameter", "displayName": "Override Endpoint", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Set the need for overidding the endpoint. This option needs to be u [...]
+    "pojoRequest": { "index": 3, "kind": "parameter", "displayName": "Pojo Request", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "If we want to use a POJO request as body or not" },
+    "profileCredentialsName": { "index": 4, "kind": "parameter", "displayName": "Profile Credentials Name", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "If using a profile credentials provider this parameter will set the p [...]
+    "region": { "index": 5, "kind": "parameter", "displayName": "Region", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "The region in which StepFunctions client needs to work. When using this parameter, the configuration wi [...]
+    "trustAllCertificates": { "index": 6, "kind": "parameter", "displayName": "Trust All Certificates", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "If we want to trust all certificates in case of overriding [...]
+    "uriEndpointOverride": { "index": 7, "kind": "parameter", "displayName": "Uri Endpoint Override", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Set the overriding uri endpoint. This option needs to be used in combinatio [...]
+    "useDefaultCredentialsProvider": { "index": 8, "kind": "parameter", "displayName": "Use Default Credentials Provider", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Set whether the StepFunctions client sh [...]
+    "useProfileCredentialsProvider": { "index": 9, "kind": "parameter", "displayName": "Use Profile Credentials Provider", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Set whether the StepFunctions client sh [...]
+    "lazyStartProducer": { "index": 10, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...]
+    "awsSfnClient": { "index": 11, "kind": "parameter", "displayName": "Aws Sfn Client", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "software.amazon.awssdk.services.sfn.SfnClient", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "To use a existing configured  [...]
+    "proxyHost": { "index": 12, "kind": "parameter", "displayName": "Proxy Host", "group": "proxy", "label": "proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "To define a proxy host when instantiating the StepFunctions client" },
+    "proxyPort": { "index": 13, "kind": "parameter", "displayName": "Proxy Port", "group": "proxy", "label": "proxy", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "To define a proxy port when instantiating the StepFunctions client" },
+    "proxyProtocol": { "index": 14, "kind": "parameter", "displayName": "Proxy Protocol", "group": "proxy", "label": "proxy", "required": false, "type": "object", "javaType": "software.amazon.awssdk.core.Protocol", "enum": [ "HTTP", "HTTPS" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "HTTPS", "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "To define a [...]
+    "accessKey": { "index": 15, "kind": "parameter", "displayName": "Access Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Amazon AWS Access Key" },
+    "secretKey": { "index": 16, "kind": "parameter", "displayName": "Secret Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Amazon AWS Secret Key" }
+  }
+}
diff --git a/components/camel-aws/camel-aws2-step-functions/pom.xml b/components/camel-aws/camel-aws2-step-functions/pom.xml
new file mode 100644
index 00000000000..dcb5201ce6c
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/pom.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>camel-aws-parent</artifactId>
+        <version>4.0.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-aws2-step-functions</artifactId>
+    <packaging>jar</packaging>
+
+    <name>Camel :: AWS Step Functions</name>
+    <description>A Camel Amazon Web Services Step Functions component</description>
+
+    <properties>
+        <camel.surefire.forkTimeout>1200</camel.surefire.forkTimeout>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-support</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-health</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>software.amazon.awssdk</groupId>
+            <artifactId>sfn</artifactId>
+            <version>${aws-java-sdk2-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>software.amazon.awssdk</groupId>
+            <artifactId>apache-client</artifactId>
+            <version>${aws-java-sdk2-version}</version>
+        </dependency>
+
+        <!-- for testing -->
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-spring-junit5</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- test infra -->
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-infra-aws-v2</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <argLine>${camel.surefire.fork.vmargs} -Xmx2G</argLine>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/components/camel-aws/camel-aws2-step-functions/src/generated/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ComponentConfigurer.java b/components/camel-aws/camel-aws2-step-functions/src/generated/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ComponentConfigurer.java
new file mode 100644
index 00000000000..00b7f3d498e
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/generated/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ComponentConfigurer.java
@@ -0,0 +1,166 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.aws2.stepfunctions;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class StepFunctions2ComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    private org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration getOrCreateConfiguration(StepFunctions2Component target) {
+        if (target.getConfiguration() == null) {
+            target.setConfiguration(new org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration());
+        }
+        return target.getConfiguration();
+    }
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        StepFunctions2Component target = (StepFunctions2Component) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "accesskey":
+        case "accessKey": getOrCreateConfiguration(target).setAccessKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "autowiredenabled":
+        case "autowiredEnabled": target.setAutowiredEnabled(property(camelContext, boolean.class, value)); return true;
+        case "awssfnclient":
+        case "awsSfnClient": getOrCreateConfiguration(target).setAwsSfnClient(property(camelContext, software.amazon.awssdk.services.sfn.SfnClient.class, value)); return true;
+        case "configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration.class, value)); return true;
+        case "healthcheckconsumerenabled":
+        case "healthCheckConsumerEnabled": target.setHealthCheckConsumerEnabled(property(camelContext, boolean.class, value)); return true;
+        case "healthcheckproducerenabled":
+        case "healthCheckProducerEnabled": target.setHealthCheckProducerEnabled(property(camelContext, boolean.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        case "operation": getOrCreateConfiguration(target).setOperation(property(camelContext, org.apache.camel.component.aws2.stepfunctions.StepFunctions2Operations.class, value)); return true;
+        case "overrideendpoint":
+        case "overrideEndpoint": getOrCreateConfiguration(target).setOverrideEndpoint(property(camelContext, boolean.class, value)); return true;
+        case "pojorequest":
+        case "pojoRequest": getOrCreateConfiguration(target).setPojoRequest(property(camelContext, boolean.class, value)); return true;
+        case "profilecredentialsname":
+        case "profileCredentialsName": getOrCreateConfiguration(target).setProfileCredentialsName(property(camelContext, java.lang.String.class, value)); return true;
+        case "proxyhost":
+        case "proxyHost": getOrCreateConfiguration(target).setProxyHost(property(camelContext, java.lang.String.class, value)); return true;
+        case "proxyport":
+        case "proxyPort": getOrCreateConfiguration(target).setProxyPort(property(camelContext, java.lang.Integer.class, value)); return true;
+        case "proxyprotocol":
+        case "proxyProtocol": getOrCreateConfiguration(target).setProxyProtocol(property(camelContext, software.amazon.awssdk.core.Protocol.class, value)); return true;
+        case "region": getOrCreateConfiguration(target).setRegion(property(camelContext, java.lang.String.class, value)); return true;
+        case "secretkey":
+        case "secretKey": getOrCreateConfiguration(target).setSecretKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "trustallcertificates":
+        case "trustAllCertificates": getOrCreateConfiguration(target).setTrustAllCertificates(property(camelContext, boolean.class, value)); return true;
+        case "uriendpointoverride":
+        case "uriEndpointOverride": getOrCreateConfiguration(target).setUriEndpointOverride(property(camelContext, java.lang.String.class, value)); return true;
+        case "usedefaultcredentialsprovider":
+        case "useDefaultCredentialsProvider": getOrCreateConfiguration(target).setUseDefaultCredentialsProvider(property(camelContext, boolean.class, value)); return true;
+        case "useprofilecredentialsprovider":
+        case "useProfileCredentialsProvider": getOrCreateConfiguration(target).setUseProfileCredentialsProvider(property(camelContext, boolean.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public String[] getAutowiredNames() {
+        return new String[]{"awsSfnClient"};
+    }
+
+    @Override
+    public Class<?> getOptionType(String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "accesskey":
+        case "accessKey": return java.lang.String.class;
+        case "autowiredenabled":
+        case "autowiredEnabled": return boolean.class;
+        case "awssfnclient":
+        case "awsSfnClient": return software.amazon.awssdk.services.sfn.SfnClient.class;
+        case "configuration": return org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration.class;
+        case "healthcheckconsumerenabled":
+        case "healthCheckConsumerEnabled": return boolean.class;
+        case "healthcheckproducerenabled":
+        case "healthCheckProducerEnabled": return boolean.class;
+        case "lazystartproducer":
+        case "lazyStartProducer": return boolean.class;
+        case "operation": return org.apache.camel.component.aws2.stepfunctions.StepFunctions2Operations.class;
+        case "overrideendpoint":
+        case "overrideEndpoint": return boolean.class;
+        case "pojorequest":
+        case "pojoRequest": return boolean.class;
+        case "profilecredentialsname":
+        case "profileCredentialsName": return java.lang.String.class;
+        case "proxyhost":
+        case "proxyHost": return java.lang.String.class;
+        case "proxyport":
+        case "proxyPort": return java.lang.Integer.class;
+        case "proxyprotocol":
+        case "proxyProtocol": return software.amazon.awssdk.core.Protocol.class;
+        case "region": return java.lang.String.class;
+        case "secretkey":
+        case "secretKey": return java.lang.String.class;
+        case "trustallcertificates":
+        case "trustAllCertificates": return boolean.class;
+        case "uriendpointoverride":
+        case "uriEndpointOverride": return java.lang.String.class;
+        case "usedefaultcredentialsprovider":
+        case "useDefaultCredentialsProvider": return boolean.class;
+        case "useprofilecredentialsprovider":
+        case "useProfileCredentialsProvider": return boolean.class;
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        StepFunctions2Component target = (StepFunctions2Component) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "accesskey":
+        case "accessKey": return getOrCreateConfiguration(target).getAccessKey();
+        case "autowiredenabled":
+        case "autowiredEnabled": return target.isAutowiredEnabled();
+        case "awssfnclient":
+        case "awsSfnClient": return getOrCreateConfiguration(target).getAwsSfnClient();
+        case "configuration": return target.getConfiguration();
+        case "healthcheckconsumerenabled":
+        case "healthCheckConsumerEnabled": return target.isHealthCheckConsumerEnabled();
+        case "healthcheckproducerenabled":
+        case "healthCheckProducerEnabled": return target.isHealthCheckProducerEnabled();
+        case "lazystartproducer":
+        case "lazyStartProducer": return target.isLazyStartProducer();
+        case "operation": return getOrCreateConfiguration(target).getOperation();
+        case "overrideendpoint":
+        case "overrideEndpoint": return getOrCreateConfiguration(target).isOverrideEndpoint();
+        case "pojorequest":
+        case "pojoRequest": return getOrCreateConfiguration(target).isPojoRequest();
+        case "profilecredentialsname":
+        case "profileCredentialsName": return getOrCreateConfiguration(target).getProfileCredentialsName();
+        case "proxyhost":
+        case "proxyHost": return getOrCreateConfiguration(target).getProxyHost();
+        case "proxyport":
+        case "proxyPort": return getOrCreateConfiguration(target).getProxyPort();
+        case "proxyprotocol":
+        case "proxyProtocol": return getOrCreateConfiguration(target).getProxyProtocol();
+        case "region": return getOrCreateConfiguration(target).getRegion();
+        case "secretkey":
+        case "secretKey": return getOrCreateConfiguration(target).getSecretKey();
+        case "trustallcertificates":
+        case "trustAllCertificates": return getOrCreateConfiguration(target).isTrustAllCertificates();
+        case "uriendpointoverride":
+        case "uriEndpointOverride": return getOrCreateConfiguration(target).getUriEndpointOverride();
+        case "usedefaultcredentialsprovider":
+        case "useDefaultCredentialsProvider": return getOrCreateConfiguration(target).isUseDefaultCredentialsProvider();
+        case "useprofilecredentialsprovider":
+        case "useProfileCredentialsProvider": return getOrCreateConfiguration(target).isUseProfileCredentialsProvider();
+        default: return null;
+        }
+    }
+}
+
diff --git a/components/camel-aws/camel-aws2-step-functions/src/generated/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2EndpointConfigurer.java b/components/camel-aws/camel-aws2-step-functions/src/generated/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2EndpointConfigurer.java
new file mode 100644
index 00000000000..20ca52784cd
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/generated/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2EndpointConfigurer.java
@@ -0,0 +1,138 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.aws2.stepfunctions;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class StepFunctions2EndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        StepFunctions2Endpoint target = (StepFunctions2Endpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "accesskey":
+        case "accessKey": target.getConfiguration().setAccessKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "awssfnclient":
+        case "awsSfnClient": target.getConfiguration().setAwsSfnClient(property(camelContext, software.amazon.awssdk.services.sfn.SfnClient.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        case "operation": target.getConfiguration().setOperation(property(camelContext, org.apache.camel.component.aws2.stepfunctions.StepFunctions2Operations.class, value)); return true;
+        case "overrideendpoint":
+        case "overrideEndpoint": target.getConfiguration().setOverrideEndpoint(property(camelContext, boolean.class, value)); return true;
+        case "pojorequest":
+        case "pojoRequest": target.getConfiguration().setPojoRequest(property(camelContext, boolean.class, value)); return true;
+        case "profilecredentialsname":
+        case "profileCredentialsName": target.getConfiguration().setProfileCredentialsName(property(camelContext, java.lang.String.class, value)); return true;
+        case "proxyhost":
+        case "proxyHost": target.getConfiguration().setProxyHost(property(camelContext, java.lang.String.class, value)); return true;
+        case "proxyport":
+        case "proxyPort": target.getConfiguration().setProxyPort(property(camelContext, java.lang.Integer.class, value)); return true;
+        case "proxyprotocol":
+        case "proxyProtocol": target.getConfiguration().setProxyProtocol(property(camelContext, software.amazon.awssdk.core.Protocol.class, value)); return true;
+        case "region": target.getConfiguration().setRegion(property(camelContext, java.lang.String.class, value)); return true;
+        case "secretkey":
+        case "secretKey": target.getConfiguration().setSecretKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "trustallcertificates":
+        case "trustAllCertificates": target.getConfiguration().setTrustAllCertificates(property(camelContext, boolean.class, value)); return true;
+        case "uriendpointoverride":
+        case "uriEndpointOverride": target.getConfiguration().setUriEndpointOverride(property(camelContext, java.lang.String.class, value)); return true;
+        case "usedefaultcredentialsprovider":
+        case "useDefaultCredentialsProvider": target.getConfiguration().setUseDefaultCredentialsProvider(property(camelContext, boolean.class, value)); return true;
+        case "useprofilecredentialsprovider":
+        case "useProfileCredentialsProvider": target.getConfiguration().setUseProfileCredentialsProvider(property(camelContext, boolean.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public String[] getAutowiredNames() {
+        return new String[]{"awsSfnClient"};
+    }
+
+    @Override
+    public Class<?> getOptionType(String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "accesskey":
+        case "accessKey": return java.lang.String.class;
+        case "awssfnclient":
+        case "awsSfnClient": return software.amazon.awssdk.services.sfn.SfnClient.class;
+        case "lazystartproducer":
+        case "lazyStartProducer": return boolean.class;
+        case "operation": return org.apache.camel.component.aws2.stepfunctions.StepFunctions2Operations.class;
+        case "overrideendpoint":
+        case "overrideEndpoint": return boolean.class;
+        case "pojorequest":
+        case "pojoRequest": return boolean.class;
+        case "profilecredentialsname":
+        case "profileCredentialsName": return java.lang.String.class;
+        case "proxyhost":
+        case "proxyHost": return java.lang.String.class;
+        case "proxyport":
+        case "proxyPort": return java.lang.Integer.class;
+        case "proxyprotocol":
+        case "proxyProtocol": return software.amazon.awssdk.core.Protocol.class;
+        case "region": return java.lang.String.class;
+        case "secretkey":
+        case "secretKey": return java.lang.String.class;
+        case "trustallcertificates":
+        case "trustAllCertificates": return boolean.class;
+        case "uriendpointoverride":
+        case "uriEndpointOverride": return java.lang.String.class;
+        case "usedefaultcredentialsprovider":
+        case "useDefaultCredentialsProvider": return boolean.class;
+        case "useprofilecredentialsprovider":
+        case "useProfileCredentialsProvider": return boolean.class;
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        StepFunctions2Endpoint target = (StepFunctions2Endpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "accesskey":
+        case "accessKey": return target.getConfiguration().getAccessKey();
+        case "awssfnclient":
+        case "awsSfnClient": return target.getConfiguration().getAwsSfnClient();
+        case "lazystartproducer":
+        case "lazyStartProducer": return target.isLazyStartProducer();
+        case "operation": return target.getConfiguration().getOperation();
+        case "overrideendpoint":
+        case "overrideEndpoint": return target.getConfiguration().isOverrideEndpoint();
+        case "pojorequest":
+        case "pojoRequest": return target.getConfiguration().isPojoRequest();
+        case "profilecredentialsname":
+        case "profileCredentialsName": return target.getConfiguration().getProfileCredentialsName();
+        case "proxyhost":
+        case "proxyHost": return target.getConfiguration().getProxyHost();
+        case "proxyport":
+        case "proxyPort": return target.getConfiguration().getProxyPort();
+        case "proxyprotocol":
+        case "proxyProtocol": return target.getConfiguration().getProxyProtocol();
+        case "region": return target.getConfiguration().getRegion();
+        case "secretkey":
+        case "secretKey": return target.getConfiguration().getSecretKey();
+        case "trustallcertificates":
+        case "trustAllCertificates": return target.getConfiguration().isTrustAllCertificates();
+        case "uriendpointoverride":
+        case "uriEndpointOverride": return target.getConfiguration().getUriEndpointOverride();
+        case "usedefaultcredentialsprovider":
+        case "useDefaultCredentialsProvider": return target.getConfiguration().isUseDefaultCredentialsProvider();
+        case "useprofilecredentialsprovider":
+        case "useProfileCredentialsProvider": return target.getConfiguration().isUseProfileCredentialsProvider();
+        default: return null;
+        }
+    }
+}
+
diff --git a/components/camel-aws/camel-aws2-step-functions/src/generated/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2EndpointUriFactory.java b/components/camel-aws/camel-aws2-step-functions/src/generated/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2EndpointUriFactory.java
new file mode 100644
index 00000000000..01ae0f3485d
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/generated/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2EndpointUriFactory.java
@@ -0,0 +1,87 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.aws2.stepfunctions;
+
+import java.net.URISyntaxException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.camel.spi.EndpointUriFactory;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+public class StepFunctions2EndpointUriFactory extends org.apache.camel.support.component.EndpointUriFactorySupport implements EndpointUriFactory {
+
+    private static final String BASE = ":label";
+
+    private static final Set<String> PROPERTY_NAMES;
+    private static final Set<String> SECRET_PROPERTY_NAMES;
+    private static final Set<String> MULTI_VALUE_PREFIXES;
+    static {
+        Set<String> props = new HashSet<>(17);
+        props.add("accessKey");
+        props.add("awsSfnClient");
+        props.add("label");
+        props.add("lazyStartProducer");
+        props.add("operation");
+        props.add("overrideEndpoint");
+        props.add("pojoRequest");
+        props.add("profileCredentialsName");
+        props.add("proxyHost");
+        props.add("proxyPort");
+        props.add("proxyProtocol");
+        props.add("region");
+        props.add("secretKey");
+        props.add("trustAllCertificates");
+        props.add("uriEndpointOverride");
+        props.add("useDefaultCredentialsProvider");
+        props.add("useProfileCredentialsProvider");
+        PROPERTY_NAMES = Collections.unmodifiableSet(props);
+        Set<String> secretProps = new HashSet<>(2);
+        secretProps.add("accessKey");
+        secretProps.add("secretKey");
+        SECRET_PROPERTY_NAMES = Collections.unmodifiableSet(secretProps);
+        MULTI_VALUE_PREFIXES = Collections.emptySet();
+    }
+
+    @Override
+    public boolean isEnabled(String scheme) {
+        return "aws2-step-functions".equals(scheme);
+    }
+
+    @Override
+    public String buildUri(String scheme, Map<String, Object> properties, boolean encode) throws URISyntaxException {
+        String syntax = scheme + BASE;
+        String uri = syntax;
+
+        Map<String, Object> copy = new HashMap<>(properties);
+
+        uri = buildPathParameter(syntax, uri, "label", null, true, copy);
+        uri = buildQueryParameters(uri, copy, encode);
+        return uri;
+    }
+
+    @Override
+    public Set<String> propertyNames() {
+        return PROPERTY_NAMES;
+    }
+
+    @Override
+    public Set<String> secretPropertyNames() {
+        return SECRET_PROPERTY_NAMES;
+    }
+
+    @Override
+    public Set<String> multiValuePrefixes() {
+        return MULTI_VALUE_PREFIXES;
+    }
+
+    @Override
+    public boolean isLenientProperties() {
+        return false;
+    }
+}
+
diff --git a/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/services/org/apache/camel/component.properties b/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/services/org/apache/camel/component.properties
new file mode 100644
index 00000000000..0f83c896fce
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/services/org/apache/camel/component.properties
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+components=aws2-step-functions
+groupId=org.apache.camel
+artifactId=camel-aws2-step-functions
+version=4.0.0-SNAPSHOT
+projectName=Camel :: AWS Step Functions
+projectDescription=A Camel Amazon Web Services Step Functions component
diff --git a/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/services/org/apache/camel/component/aws2-step-functions b/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/services/org/apache/camel/component/aws2-step-functions
new file mode 100644
index 00000000000..a1bd4169e3d
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/services/org/apache/camel/component/aws2-step-functions
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.aws2.stepfunctions.StepFunctions2Component
diff --git a/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-step-functions-component b/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-step-functions-component
new file mode 100644
index 00000000000..a119998f9a0
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-step-functions-component
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.aws2.stepfunctions.StepFunctions2ComponentConfigurer
diff --git a/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-step-functions-endpoint b/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-step-functions-endpoint
new file mode 100644
index 00000000000..91bdfb2442d
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-step-functions-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.aws2.stepfunctions.StepFunctions2EndpointConfigurer
diff --git a/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/services/org/apache/camel/urifactory/aws2-step-functions-endpoint b/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/services/org/apache/camel/urifactory/aws2-step-functions-endpoint
new file mode 100644
index 00000000000..a2e2e7242b3
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/generated/resources/META-INF/services/org/apache/camel/urifactory/aws2-step-functions-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.aws2.stepfunctions.StepFunctions2EndpointUriFactory
diff --git a/components/camel-aws/camel-aws2-step-functions/src/generated/resources/org/apache/camel/component/aws2/stepfunctions/aws2-step-functions.json b/components/camel-aws/camel-aws2-step-functions/src/generated/resources/org/apache/camel/component/aws2/stepfunctions/aws2-step-functions.json
new file mode 100644
index 00000000000..5d6608196f6
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/generated/resources/org/apache/camel/component/aws2/stepfunctions/aws2-step-functions.json
@@ -0,0 +1,85 @@
+{
+  "component": {
+    "kind": "component",
+    "name": "aws2-step-functions",
+    "title": "AWS StepFunctions",
+    "description": "Manage and invoke AWS Step functions using AWS SDK version 2.x.",
+    "deprecated": false,
+    "firstVersion": "4.0.0",
+    "label": "cloud,serverless",
+    "javaType": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Component",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-aws2-step-functions",
+    "version": "4.0.0-SNAPSHOT",
+    "scheme": "aws2-step-functions",
+    "extendsScheme": "",
+    "syntax": "aws2-step-functions:label",
+    "async": false,
+    "api": false,
+    "consumerOnly": false,
+    "producerOnly": true,
+    "lenientProperties": false
+  },
+  "componentProperties": {
+    "configuration": { "index": 0, "kind": "property", "displayName": "Configuration", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "deprecated": false, "autowired": false, "secret": false, "description": "Component configuration" },
+    "lazyStartProducer": { "index": 1, "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail [...]
+    "operation": { "index": 2, "kind": "property", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "object", "javaType": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Operations", "enum": [ "createStateMachine", "deleteStateMachine", "updateStateMachine", "describeStateMachine", "listStateMachines", "createActivity", "deleteActivity", "describeActivity", "getActivityTask", "listActivities", "startExecution", "startSyncExecution", "st [...]
+    "overrideEndpoint": { "index": 3, "kind": "property", "displayName": "Override Endpoint", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Set the need for overidding the endpoint. This option needs to be us [...]
+    "pojoRequest": { "index": 4, "kind": "property", "displayName": "Pojo Request", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "If we want to use a POJO request as body or not" },
+    "profileCredentialsName": { "index": 5, "kind": "property", "displayName": "Profile Credentials Name", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "If using a profile credentials provider this parameter will set the pr [...]
+    "region": { "index": 6, "kind": "property", "displayName": "Region", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "The region in which StepFunctions client needs to work. When using this parameter, the configuration wil [...]
+    "trustAllCertificates": { "index": 7, "kind": "property", "displayName": "Trust All Certificates", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "If we want to trust all certificates in case of overriding  [...]
+    "uriEndpointOverride": { "index": 8, "kind": "property", "displayName": "Uri Endpoint Override", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Set the overriding uri endpoint. This option needs to be used in combination [...]
+    "useDefaultCredentialsProvider": { "index": 9, "kind": "property", "displayName": "Use Default Credentials Provider", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Set whether the StepFunctions client sho [...]
+    "useProfileCredentialsProvider": { "index": 10, "kind": "property", "displayName": "Use Profile Credentials Provider", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Set whether the StepFunctions client sh [...]
+    "autowiredEnabled": { "index": 11, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching  [...]
+    "awsSfnClient": { "index": 12, "kind": "property", "displayName": "Aws Sfn Client", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "software.amazon.awssdk.services.sfn.SfnClient", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "To use a existing configured A [...]
+    "healthCheckConsumerEnabled": { "index": 13, "kind": "property", "displayName": "Health Check Consumer Enabled", "group": "health", "label": "health", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Used for enabling or disabling all consumer based health checks from this component" },
+    "healthCheckProducerEnabled": { "index": 14, "kind": "property", "displayName": "Health Check Producer Enabled", "group": "health", "label": "health", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Used for enabling or disabling all producer based health checks from this component. Notice: Camel has by default disabled all producer based health-checks. You can turn on produce [...]
+    "proxyHost": { "index": 15, "kind": "property", "displayName": "Proxy Host", "group": "proxy", "label": "proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "To define a proxy host when instantiating the StepFunctions client" },
+    "proxyPort": { "index": 16, "kind": "property", "displayName": "Proxy Port", "group": "proxy", "label": "proxy", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "To define a proxy port when instantiating the StepFunctions client" },
+    "proxyProtocol": { "index": 17, "kind": "property", "displayName": "Proxy Protocol", "group": "proxy", "label": "proxy", "required": false, "type": "object", "javaType": "software.amazon.awssdk.core.Protocol", "enum": [ "HTTP", "HTTPS" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "HTTPS", "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "To define a  [...]
+    "accessKey": { "index": 18, "kind": "property", "displayName": "Access Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Amazon AWS Access Key" },
+    "secretKey": { "index": 19, "kind": "property", "displayName": "Secret Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Amazon AWS Secret Key" }
+  },
+  "headers": {
+    "CamelAwsStateMachineOperation": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation we want to perform", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#OPERATION" },
+    "CamelAwsStepFunctionsStateMachineName": { "index": 1, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the state machine", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#STATE_MACHINE_NAME" },
+    "CamelAwsStepFunctionsStateMachineDefinition": { "index": 2, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Amazon States Language definition of the state machine", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#STATE_MACHINE_DEFINITION" },
+    "CamelAwsStepFunctionsStateMachineType": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Determines whether a Standard or Express state machine is created", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#STATE_MACHINE_TYPE" },
+    "CamelAwsStepFunctionsStateMachineRoleArn": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Amazon Resource Name (ARN) of the IAM role to use for this state machine.", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#STATE_MACHINE_ROLE_ARN" },
+    "CamelAwsStepFunctionsStateMachineArn": { "index": 5, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Amazon Resource Name (ARN) of state machine.", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#STATE_MACHINE_ARN" },
+    "CamelAwsStateMachinesMaxResults": { "index": 6, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The limit number of results while listing state machines", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#STATE_MACHINES_MAX_RESULTS" },
+    "CamelAwsStepFunctionsStateMachineActivityName": { "index": 7, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the state machine activity", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#ACTIVITY_NAME" },
+    "CamelAwsStepFunctionsStateMachineActivityArn": { "index": 8, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ARN of the state machine activity", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#ACTIVITY_ARN" },
+    "CamelAwsStateMachineActivitiesMaxResults": { "index": 9, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The limit number of results while listing state machines", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#ACTIVITIES_MAX_RESULTS" },
+    "CamelAwsStateMachineExecutionArn": { "index": 10, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Amazon Resource Name (ARN) of the execution.", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTION_ARN" },
+    "CamelAwsStateMachineExecutionName": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Optional name of the execution.", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTION_NAME" },
+    "CamelAwsStateMachineExecutionInput": { "index": 12, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The string that contains the JSON input data for the execution.", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTION_INPUT" },
+    "CamelAwsStateMachineExecutionTraceHeader": { "index": 13, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Passes the X-Ray trace header.", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTION_TRACE_HEADER" },
+    "CamelAwsStateMachineExecutionHistoryMaxResults": { "index": 14, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The limit number of results while listing execution history", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTION_HISTORY_MAX_RESULTS" },
+    "CamelAwsStateMachineExecutionHistoryIncludeExecutionData": { "index": 15, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "You can select whether execution data (input or output of a history event) is returned.", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTION_HISTORY_INCLUDE_ [...]
+    "CamelAwsStateMachineExecutionHistoryReverseOrder": { "index": 16, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Lists events in descending order of their timeStamp.", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTION_HISTORY_REVERSE_ORDER" },
+    "CamelAwsStateMachineExecutionMaxResults": { "index": 17, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The limit number of results while listing executions", "constantName": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Constants#EXECUTIONS_MAX_RESULTS" }
+  },
+  "properties": {
+    "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Logical name" },
+    "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "object", "javaType": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Operations", "enum": [ "createStateMachine", "deleteStateMachine", "updateStateMachine", "describeStateMachine", "listStateMachines", "createActivity", "deleteActivity", "describeActivity", "getActivityTask", "listActivities", "startExecution", "startSyncExecution", "s [...]
+    "overrideEndpoint": { "index": 2, "kind": "parameter", "displayName": "Override Endpoint", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Set the need for overidding the endpoint. This option needs to be u [...]
+    "pojoRequest": { "index": 3, "kind": "parameter", "displayName": "Pojo Request", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "If we want to use a POJO request as body or not" },
+    "profileCredentialsName": { "index": 4, "kind": "parameter", "displayName": "Profile Credentials Name", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "If using a profile credentials provider this parameter will set the p [...]
+    "region": { "index": 5, "kind": "parameter", "displayName": "Region", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "The region in which StepFunctions client needs to work. When using this parameter, the configuration wi [...]
+    "trustAllCertificates": { "index": 6, "kind": "parameter", "displayName": "Trust All Certificates", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "If we want to trust all certificates in case of overriding [...]
+    "uriEndpointOverride": { "index": 7, "kind": "parameter", "displayName": "Uri Endpoint Override", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Set the overriding uri endpoint. This option needs to be used in combinatio [...]
+    "useDefaultCredentialsProvider": { "index": 8, "kind": "parameter", "displayName": "Use Default Credentials Provider", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Set whether the StepFunctions client sh [...]
+    "useProfileCredentialsProvider": { "index": 9, "kind": "parameter", "displayName": "Use Profile Credentials Provider", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Set whether the StepFunctions client sh [...]
+    "lazyStartProducer": { "index": 10, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...]
+    "awsSfnClient": { "index": 11, "kind": "parameter", "displayName": "Aws Sfn Client", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "software.amazon.awssdk.services.sfn.SfnClient", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "To use a existing configured  [...]
+    "proxyHost": { "index": 12, "kind": "parameter", "displayName": "Proxy Host", "group": "proxy", "label": "proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "To define a proxy host when instantiating the StepFunctions client" },
+    "proxyPort": { "index": 13, "kind": "parameter", "displayName": "Proxy Port", "group": "proxy", "label": "proxy", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "To define a proxy port when instantiating the StepFunctions client" },
+    "proxyProtocol": { "index": 14, "kind": "parameter", "displayName": "Proxy Protocol", "group": "proxy", "label": "proxy", "required": false, "type": "object", "javaType": "software.amazon.awssdk.core.Protocol", "enum": [ "HTTP", "HTTPS" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "HTTPS", "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "To define a [...]
+    "accessKey": { "index": 15, "kind": "parameter", "displayName": "Access Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Amazon AWS Access Key" },
+    "secretKey": { "index": 16, "kind": "parameter", "displayName": "Secret Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration", "configurationField": "configuration", "description": "Amazon AWS Secret Key" }
+  }
+}
diff --git a/components/camel-aws/camel-aws2-step-functions/src/main/docs/aws2-step-functions-component.adoc b/components/camel-aws/camel-aws2-step-functions/src/main/docs/aws2-step-functions-component.adoc
new file mode 100644
index 00000000000..40ec25fa5e3
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/main/docs/aws2-step-functions-component.adoc
@@ -0,0 +1,152 @@
+= AWS StepFunctions Component
+:doctitle: AWS StepFunctions
+:shortname: aws2-step-functions
+:artifactid: camel-aws2-step-functions
+:description: Manage and invoke AWS Step functions using AWS SDK version 2.x.
+:since: 4.0
+:supportlevel: Preview
+:tabs-sync-option:
+:component-header: Only producer is supported
+//Manually maintained attributes
+:group: AWS
+:camel-spring-boot-name: aws2-step-functions
+
+*Since Camel {since}*
+
+*{component-header}*
+
+The AWS2 Step Functions component supports following operations on
+https://aws.amazon.com/step-functions/[AWS Step Functions]
+- Create, delete, update, describe, list state machines.
+- Create, delete, describe, list activities.
+- Start, start sync, stop, list, describe executions.
+- Get activities task.
+- Get execution history
+
+Prerequisites
+
+You must have a valid Amazon Web Services developer account, and be
+signed up to use Amazon Step Functions. More information is available at
+https://aws.amazon.com/step-functions/[AWS Step Functions].
+
+
+== URI Format
+
+-------------------------
+aws2-step-functions://label[?options]
+-------------------------
+
+You can append query options to the URI in the following format,
+?options=value&option2=value&...
+
+
+// component-configure options: START
+
+// component-configure options: END
+
+// component options: START
+include::partial$component-configure-options.adoc[]
+include::partial$component-endpoint-options.adoc[]
+// component options: END
+
+// endpoint options: START
+
+// endpoint options: END
+
+
+Required Step Functions component options
+
+You have to provide the awsSfnClient in the
+Registry or your accessKey and secretKey to access
+the https://aws.amazon.com/step-functions/[AWS Step Functions] service.
+
+== Usage
+
+=== Static credentials, Default Credential Provider and Profile Credentials Provider
+
+You have the possibility of avoiding the usage of explicit static credentials, by specifying the useDefaultCredentialsProvider option and set it to true.
+
+The order of evaluation for Default Credentials Provider is the following:
+
+ - Java system properties - aws.accessKeyId and aws.secretKey
+ - Environment variables - AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY.
+ - Web Identity Token from AWS STS.
+ - The shared credentials and config files.
+ - Amazon ECS container credentials - loaded from the Amazon ECS if the environment variable AWS_CONTAINER_CREDENTIALS_RELATIVE_URI is set.
+ - Amazon EC2 Instance profile credentials.
+
+You have also the possibility of using Profile Credentials Provider, by specifying the useProfileCredentialsProvider option to true and profileCredentialsName to the profile name.
+
+Only one of static, default and profile credentials could be used at the same time.
+
+For more information about this you can look at https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/credentials.html[AWS credentials documentation]
+
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
+
+=== Step Functions Producer operations
+
+Camel-AWS Step Functions component provides the following operation on the producer side:
+
+- createStateMachine
+- deleteStateMachine
+- updateStateMachine
+- describeStateMachine
+- listStateMachines
+- createActivity
+- deleteActivity
+- describeActivity
+- getActivityTask
+- listActivities
+- startExecution
+- startSyncExecution
+- stopExecution
+- describeExecution
+- listExecutions
+- getExecutionHistory
+
+== Producer Examples
+
+- createStateMachine: this operation will create a state machine
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:createStateMachine")
+    .to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=createMachine")
+--------------------------------------------------------------------------------
+
+== Using a POJO as body
+
+Sometimes build an AWS Request can be complex, because of multiple options. We introduce the possibility to use a POJO as body.
+In AWS Step Functions there are multiple operations you can submit, as an example for Create state machine
+ request, you can do something like:
+
+[source,java]
+------------------------------------------------------------------------------------------------------
+from("direct:start")
+  .setBody(CreateStateMachineRequest.builder().name("state-machine").build())
+  .to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=createStateMachine&pojoRequest=true")
+------------------------------------------------------------------------------------------------------
+
+In this way you'll pass the request directly without the need of passing headers and options specifically related to this operation.
+
+== Dependencies
+
+Maven users will need to add the following dependency to their pom.xml.
+
+*pom.xml*
+
+[source,xml]
+---------------------------------------
+<dependency>
+    <groupId>org.apache.camel</groupId>
+    <artifactId>camel-aws2-step-functions</artifactId>
+    <version>${camel-version}</version>
+</dependency>
+---------------------------------------
+
+where `$\{camel-version}` must be replaced by the actual version of Camel.
+
+
+include::spring-boot:partial$starter.adoc[]
diff --git a/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Component.java b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Component.java
new file mode 100644
index 00000000000..11578dd809b
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Component.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.stepfunctions;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.annotations.Component;
+import org.apache.camel.support.HealthCheckComponent;
+
+@Component(value = "aws2-step-functions")
+public class StepFunctions2Component extends HealthCheckComponent {
+
+    @Metadata
+    private StepFunctions2Configuration configuration = new StepFunctions2Configuration();
+
+    public StepFunctions2Component() {
+        this(null);
+    }
+
+    public StepFunctions2Component(CamelContext context) {
+        super(context);
+    }
+
+    @Override
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        StepFunctions2Configuration configuration
+                = this.configuration != null ? this.configuration.copy() : new StepFunctions2Configuration();
+        StepFunctions2Endpoint endpoint = new StepFunctions2Endpoint(uri, this, configuration);
+        setProperties(endpoint, parameters);
+        if (Boolean.FALSE.equals(configuration.isUseDefaultCredentialsProvider())
+                && Boolean.FALSE.equals(configuration.isUseProfileCredentialsProvider())
+                && configuration.getAwsSfnClient() == null
+                && (configuration.getAccessKey() == null || configuration.getSecretKey() == null)) {
+            throw new IllegalArgumentException(
+                    "useDefaultCredentialsProvider is set to false, useProfileCredentialsProvider is set to false, Amazon step functions client or accessKey and secretKey must be specified");
+        }
+
+        return endpoint;
+    }
+
+    public StepFunctions2Configuration getConfiguration() {
+        return configuration;
+    }
+
+    /**
+     * Component configuration
+     */
+    public void setConfiguration(StepFunctions2Configuration configuration) {
+        this.configuration = configuration;
+    }
+
+}
diff --git a/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Configuration.java b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Configuration.java
new file mode 100644
index 00000000000..28b80c329e3
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Configuration.java
@@ -0,0 +1,246 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.stepfunctions;
+
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriParams;
+import org.apache.camel.spi.UriPath;
+import software.amazon.awssdk.core.Protocol;
+import software.amazon.awssdk.services.sfn.SfnClient;
+
+@UriParams
+public class StepFunctions2Configuration implements Cloneable {
+
+    @UriPath(description = "Logical name")
+    @Metadata(required = true)
+    private String label;
+    @UriParam
+    @Metadata(required = true)
+    private StepFunctions2Operations operation;
+    @UriParam(label = "security", secret = true)
+    private String accessKey;
+    @UriParam(label = "security", secret = true)
+    private String secretKey;
+    @UriParam
+    private String region;
+    @UriParam(label = "proxy", enums = "HTTP,HTTPS", defaultValue = "HTTPS")
+    private Protocol proxyProtocol = Protocol.HTTPS;
+    @UriParam(label = "proxy")
+    private String proxyHost;
+    @UriParam(label = "proxy")
+    private Integer proxyPort;
+    @UriParam(label = "advanced")
+    @Metadata(autowired = true)
+    private SfnClient awsSfnClient;
+    @UriParam(defaultValue = "false")
+    private boolean pojoRequest;
+    @UriParam(defaultValue = "false")
+    private boolean trustAllCertificates;
+    @UriParam(defaultValue = "false")
+    private boolean overrideEndpoint;
+    @UriParam
+    private String uriEndpointOverride;
+    @UriParam(defaultValue = "false")
+    private boolean useDefaultCredentialsProvider;
+    @UriParam(defaultValue = "false")
+    private boolean useProfileCredentialsProvider;
+    @UriParam
+    private String profileCredentialsName;
+
+    public SfnClient getAwsSfnClient() {
+        return awsSfnClient;
+    }
+
+    /**
+     * To use a existing configured AwsStepFunctionsClient as client
+     */
+    public void setAwsSfnClient(SfnClient awsSfnClient) {
+        this.awsSfnClient = awsSfnClient;
+    }
+
+    public String getAccessKey() {
+        return accessKey;
+    }
+
+    /**
+     * Amazon AWS Access Key
+     */
+    public void setAccessKey(String accessKey) {
+        this.accessKey = accessKey;
+    }
+
+    public String getSecretKey() {
+        return secretKey;
+    }
+
+    /**
+     * Amazon AWS Secret Key
+     */
+    public void setSecretKey(String secretKey) {
+        this.secretKey = secretKey;
+    }
+
+    public String getRegion() {
+        return region;
+    }
+
+    /**
+     * The region in which StepFunctions client needs to work. When using this parameter, the configuration will expect
+     * the lowercase name of the region (for example ap-east-1) You'll need to use the name Region.EU_WEST_1.id()
+     */
+    public void setRegion(String region) {
+        this.region = region;
+    }
+
+    public StepFunctions2Operations getOperation() {
+        return operation;
+    }
+
+    /**
+     * The operation to perform. It can be listFunctions, getFunction, createFunction, deleteFunction or invokeFunction
+     */
+    public void setOperation(StepFunctions2Operations operation) {
+        this.operation = operation;
+    }
+
+    public Protocol getProxyProtocol() {
+        return proxyProtocol;
+    }
+
+    /**
+     * To define a proxy protocol when instantiating the StepFunctions client
+     */
+    public void setProxyProtocol(Protocol proxyProtocol) {
+        this.proxyProtocol = proxyProtocol;
+    }
+
+    public String getProxyHost() {
+        return proxyHost;
+    }
+
+    /**
+     * To define a proxy host when instantiating the StepFunctions client
+     */
+    public void setProxyHost(String proxyHost) {
+        this.proxyHost = proxyHost;
+    }
+
+    public Integer getProxyPort() {
+        return proxyPort;
+    }
+
+    /**
+     * To define a proxy port when instantiating the StepFunctions client
+     */
+    public void setProxyPort(Integer proxyPort) {
+        this.proxyPort = proxyPort;
+    }
+
+    public boolean isPojoRequest() {
+        return pojoRequest;
+    }
+
+    /**
+     * If we want to use a POJO request as body or not
+     */
+    public void setPojoRequest(boolean pojoRequest) {
+        this.pojoRequest = pojoRequest;
+    }
+
+    public boolean isTrustAllCertificates() {
+        return trustAllCertificates;
+    }
+
+    /**
+     * If we want to trust all certificates in case of overriding the endpoint
+     */
+    public void setTrustAllCertificates(boolean trustAllCertificates) {
+        this.trustAllCertificates = trustAllCertificates;
+    }
+
+    public boolean isOverrideEndpoint() {
+        return overrideEndpoint;
+    }
+
+    /**
+     * Set the need for overidding the endpoint. This option needs to be used in combination with uriEndpointOverride
+     * option
+     */
+    public void setOverrideEndpoint(boolean overrideEndpoint) {
+        this.overrideEndpoint = overrideEndpoint;
+    }
+
+    public String getUriEndpointOverride() {
+        return uriEndpointOverride;
+    }
+
+    /**
+     * Set the overriding uri endpoint. This option needs to be used in combination with overrideEndpoint option
+     */
+    public void setUriEndpointOverride(String uriEndpointOverride) {
+        this.uriEndpointOverride = uriEndpointOverride;
+    }
+
+    /**
+     * Set whether the StepFunctions client should expect to load credentials through a default credentials provider or
+     * to expect static credentials to be passed in.
+     */
+    public void setUseDefaultCredentialsProvider(Boolean useDefaultCredentialsProvider) {
+        this.useDefaultCredentialsProvider = useDefaultCredentialsProvider;
+    }
+
+    public Boolean isUseDefaultCredentialsProvider() {
+        return useDefaultCredentialsProvider;
+    }
+
+    public boolean isUseProfileCredentialsProvider() {
+        return useProfileCredentialsProvider;
+    }
+
+    /**
+     * Set whether the StepFunctions client should expect to load credentials through a profile credentials provider.
+     */
+    public void setUseProfileCredentialsProvider(boolean useProfileCredentialsProvider) {
+        this.useProfileCredentialsProvider = useProfileCredentialsProvider;
+    }
+
+    public String getProfileCredentialsName() {
+        return profileCredentialsName;
+    }
+
+    /**
+     * If using a profile credentials provider this parameter will set the profile name
+     */
+    public void setProfileCredentialsName(String profileCredentialsName) {
+        this.profileCredentialsName = profileCredentialsName;
+    }
+
+    // *************************************************
+    //
+    // *************************************************
+
+    public StepFunctions2Configuration copy() {
+        try {
+            return (StepFunctions2Configuration) super.clone();
+        } catch (CloneNotSupportedException e) {
+            throw new RuntimeCamelException(e);
+        }
+    }
+
+}
diff --git a/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Constants.java b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Constants.java
new file mode 100644
index 00000000000..8f653fa0095
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Constants.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.stepfunctions;
+
+import org.apache.camel.spi.Metadata;
+
+public interface StepFunctions2Constants {
+
+    @Metadata(description = "The operation we want to perform", javaType = "String")
+    String OPERATION = "CamelAwsStateMachineOperation";
+
+    @Metadata(description = "The name of the state machine", javaType = "String")
+    String STATE_MACHINE_NAME = "CamelAwsStepFunctionsStateMachineName";
+
+    @Metadata(description = "The Amazon States Language definition of the state machine", javaType = "String")
+    String STATE_MACHINE_DEFINITION = "CamelAwsStepFunctionsStateMachineDefinition";
+
+    @Metadata(description = "Determines whether a Standard or Express state machine is created", javaType = "String")
+    String STATE_MACHINE_TYPE = "CamelAwsStepFunctionsStateMachineType";
+
+    @Metadata(description = "The Amazon Resource Name (ARN) of the IAM role to use for this state machine.",
+              javaType = "String")
+    String STATE_MACHINE_ROLE_ARN = "CamelAwsStepFunctionsStateMachineRoleArn";
+
+    @Metadata(description = "The Amazon Resource Name (ARN) of state machine.", javaType = "String")
+    String STATE_MACHINE_ARN = "CamelAwsStepFunctionsStateMachineArn";
+
+    @Metadata(description = "The limit number of results while listing state machines", javaType = "Integer")
+    String STATE_MACHINES_MAX_RESULTS = "CamelAwsStateMachinesMaxResults";
+
+    @Metadata(description = "The name of the state machine activity", javaType = "String")
+    String ACTIVITY_NAME = "CamelAwsStepFunctionsStateMachineActivityName";
+
+    @Metadata(description = "The ARN of the state machine activity", javaType = "String")
+    String ACTIVITY_ARN = "CamelAwsStepFunctionsStateMachineActivityArn";
+
+    @Metadata(description = "The limit number of results while listing state machines", javaType = "Integer")
+    String ACTIVITIES_MAX_RESULTS = "CamelAwsStateMachineActivitiesMaxResults";
+
+    @Metadata(description = "The Amazon Resource Name (ARN) of the execution.", javaType = "String")
+    String EXECUTION_ARN = "CamelAwsStateMachineExecutionArn";
+
+    @Metadata(description = "Optional name of the execution.", javaType = "String")
+    String EXECUTION_NAME = "CamelAwsStateMachineExecutionName";
+
+    @Metadata(description = "The string that contains the JSON input data for the execution.", javaType = "String")
+    String EXECUTION_INPUT = "CamelAwsStateMachineExecutionInput";
+
+    @Metadata(description = "Passes the X-Ray trace header.", javaType = "String")
+    String EXECUTION_TRACE_HEADER = "CamelAwsStateMachineExecutionTraceHeader";
+
+    @Metadata(description = "The limit number of results while listing execution history", javaType = "Integer")
+    String EXECUTION_HISTORY_MAX_RESULTS = "CamelAwsStateMachineExecutionHistoryMaxResults";
+
+    @Metadata(description = "You can select whether execution data (input or output of a history event) is returned.",
+              javaType = "Boolean")
+    String EXECUTION_HISTORY_INCLUDE_EXECUTION_DATA = "CamelAwsStateMachineExecutionHistoryIncludeExecutionData";
+
+    @Metadata(description = "Lists events in descending order of their timeStamp.", javaType = "Boolean")
+    String EXECUTION_HISTORY_REVERSE_ORDER = "CamelAwsStateMachineExecutionHistoryReverseOrder";
+
+    @Metadata(description = "The limit number of results while listing executions", javaType = "Integer")
+    String EXECUTIONS_MAX_RESULTS = "CamelAwsStateMachineExecutionMaxResults";
+
+}
diff --git a/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Endpoint.java b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Endpoint.java
new file mode 100644
index 00000000000..51fc9c7faad
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Endpoint.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.stepfunctions;
+
+import org.apache.camel.*;
+import org.apache.camel.component.aws2.stepfunctions.client.StepFunctions2ClientFactory;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.support.DefaultEndpoint;
+import org.apache.camel.util.ObjectHelper;
+import software.amazon.awssdk.services.sfn.SfnClient;
+
+/**
+ * Manage and invoke AWS Step functions using AWS SDK version 2.x.
+ */
+@UriEndpoint(firstVersion = "4.0.0", scheme = "aws2-step-functions", title = "AWS StepFunctions",
+             syntax = "aws2-step-functions:label",
+             producerOnly = true, category = { Category.CLOUD, Category.SERVERLESS },
+             headersClass = StepFunctions2Constants.class)
+public class StepFunctions2Endpoint extends DefaultEndpoint {
+
+    private SfnClient awsSfnClient;
+
+    @UriParam
+    private StepFunctions2Configuration configuration;
+
+    public StepFunctions2Endpoint(String uri, Component component, StepFunctions2Configuration configuration) {
+        super(uri, component);
+        this.configuration = configuration;
+    }
+
+    @Override
+    public StepFunctions2Component getComponent() {
+        return (StepFunctions2Component) super.getComponent();
+    }
+
+    @Override
+    public Consumer createConsumer(Processor processor) throws Exception {
+        throw new UnsupportedOperationException("You cannot receive messages from this endpoint");
+    }
+
+    @Override
+    public Producer createProducer() throws Exception {
+        return new StepFunctions2Producer(this);
+    }
+
+    @Override
+    public void doStart() throws Exception {
+        super.doStart();
+        awsSfnClient = configuration.getAwsSfnClient() != null
+                ? configuration.getAwsSfnClient()
+                : StepFunctions2ClientFactory.getSfnClient(configuration).getSfnClient();
+    }
+
+    @Override
+    public void doStop() throws Exception {
+
+        if (ObjectHelper.isEmpty(configuration.getAwsSfnClient())) {
+            if (awsSfnClient != null) {
+                awsSfnClient.close();
+            }
+        }
+        super.doStop();
+    }
+
+    public StepFunctions2Configuration getConfiguration() {
+        return configuration;
+    }
+
+    public SfnClient getAwsSfnClient() {
+        return awsSfnClient;
+    }
+
+}
diff --git a/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Operations.java b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Operations.java
new file mode 100644
index 00000000000..51d83526fcd
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Operations.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.stepfunctions;
+
+public enum StepFunctions2Operations {
+
+    createStateMachine,
+    deleteStateMachine,
+    updateStateMachine,
+    describeStateMachine,
+    listStateMachines,
+    createActivity,
+    deleteActivity,
+    describeActivity,
+    getActivityTask,
+    listActivities,
+    startExecution,
+    startSyncExecution,
+    stopExecution,
+    describeExecution,
+    listExecutions,
+    getExecutionHistory
+
+}
diff --git a/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Producer.java b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Producer.java
new file mode 100644
index 00000000000..0dde2746e5d
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2Producer.java
@@ -0,0 +1,729 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.stepfunctions;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.InvalidPayloadException;
+import org.apache.camel.Message;
+import org.apache.camel.health.HealthCheck;
+import org.apache.camel.health.HealthCheckHelper;
+import org.apache.camel.health.WritableHealthCheckRepository;
+import org.apache.camel.support.DefaultProducer;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.URISupport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import software.amazon.awssdk.awscore.exception.AwsServiceException;
+import software.amazon.awssdk.services.sfn.SfnClient;
+import software.amazon.awssdk.services.sfn.model.*;
+
+/**
+ * A Producer which sends messages to the Amazon Web Service Step Functions
+ * <a href="https://aws.amazon.com/step-functions/">AWS Step Functions</a>
+ */
+public class StepFunctions2Producer extends DefaultProducer {
+
+    private static final Logger LOG = LoggerFactory.getLogger(StepFunctions2Producer.class);
+
+    private transient String sfnProducerToString;
+
+    private HealthCheck producerHealthCheck;
+    private WritableHealthCheckRepository healthCheckRepository;
+
+    public StepFunctions2Producer(final Endpoint endpoint) {
+        super(endpoint);
+    }
+
+    @Override
+    public void process(final Exchange exchange) throws Exception {
+        switch (determineOperation(exchange)) {
+            case createStateMachine -> createStateMachine(getEndpoint().getAwsSfnClient(), exchange);
+            case deleteStateMachine -> deleteStateMachine(getEndpoint().getAwsSfnClient(), exchange);
+            case updateStateMachine -> updateStateMachine(getEndpoint().getAwsSfnClient(), exchange);
+            case describeStateMachine -> describeStateMachine(getEndpoint().getAwsSfnClient(), exchange);
+            case listStateMachines -> listStateMachines(getEndpoint().getAwsSfnClient(), exchange);
+            case createActivity -> createActivity(getEndpoint().getAwsSfnClient(), exchange);
+            case deleteActivity -> deleteActivity(getEndpoint().getAwsSfnClient(), exchange);
+            case describeActivity -> describeActivity(getEndpoint().getAwsSfnClient(), exchange);
+            case getActivityTask -> getActivityTask(getEndpoint().getAwsSfnClient(), exchange);
+            case listActivities -> listActivities(getEndpoint().getAwsSfnClient(), exchange);
+            case startExecution -> startExecution(getEndpoint().getAwsSfnClient(), exchange);
+            case startSyncExecution -> startSyncExecution(getEndpoint().getAwsSfnClient(), exchange);
+            case stopExecution -> stopExecution(getEndpoint().getAwsSfnClient(), exchange);
+            case describeExecution -> describeExecution(getEndpoint().getAwsSfnClient(), exchange);
+            case listExecutions -> listExecutions(getEndpoint().getAwsSfnClient(), exchange);
+            case getExecutionHistory -> getExecutionHistory(getEndpoint().getAwsSfnClient(), exchange);
+            default -> throw new IllegalArgumentException("Unsupported operation");
+        }
+    }
+
+    private StepFunctions2Operations determineOperation(Exchange exchange) {
+        StepFunctions2Operations operation
+                = exchange.getIn().getHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.class);
+        if (operation == null) {
+            operation = getConfiguration().getOperation();
+        }
+        return operation;
+    }
+
+    protected StepFunctions2Configuration getConfiguration() {
+        return getEndpoint().getConfiguration();
+    }
+
+    @Override
+    public String toString() {
+        if (sfnProducerToString == null) {
+            sfnProducerToString = "StepFunctionsProducer[" + URISupport.sanitizeUri(getEndpoint().getEndpointUri()) + "]";
+        }
+        return sfnProducerToString;
+    }
+
+    @Override
+    public StepFunctions2Endpoint getEndpoint() {
+        return (StepFunctions2Endpoint) super.getEndpoint();
+    }
+
+    private void createStateMachine(SfnClient sfnClient, Exchange exchange) throws InvalidPayloadException {
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof CreateStateMachineRequest request) {
+                CreateStateMachineResponse result;
+                try {
+                    result = sfnClient.createStateMachine(request);
+                } catch (AwsServiceException ase) {
+                    LOG.trace("Create State Machine command returned the error code {}", ase.awsErrorDetails().errorCode());
+                    throw ase;
+                }
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            CreateStateMachineRequest.Builder builder = CreateStateMachineRequest.builder();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_NAME))) {
+                String stateMachineName = exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_NAME, String.class);
+                builder.name(stateMachineName);
+            }
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_DEFINITION))) {
+                String stateMachineDefinition
+                        = exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_DEFINITION, String.class);
+                builder.definition(stateMachineDefinition);
+            }
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_TYPE))) {
+                if (exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_TYPE) instanceof StateMachineType) {
+                    StateMachineType stateMachineType
+                            = exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_TYPE, StateMachineType.class);
+                    builder.type(stateMachineType);
+                } else {
+                    String stateMachineType
+                            = exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_TYPE, String.class);
+                    builder.type(stateMachineType);
+                }
+            }
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_ROLE_ARN))) {
+                String stateMachineRoleArn
+                        = exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_ROLE_ARN, String.class);
+                builder.roleArn(stateMachineRoleArn);
+            }
+            CreateStateMachineResponse result;
+            try {
+                result = sfnClient.createStateMachine(builder.build());
+            } catch (AwsServiceException ase) {
+                LOG.trace("Create State Machine command returned the error code {}", ase.awsErrorDetails().errorCode());
+                throw ase;
+            }
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+        }
+    }
+
+    private void deleteStateMachine(SfnClient sfnClient, Exchange exchange) throws InvalidPayloadException {
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof DeleteStateMachineRequest request) {
+                DeleteStateMachineResponse result;
+                try {
+                    result = sfnClient.deleteStateMachine(request);
+                } catch (AwsServiceException ase) {
+                    LOG.trace("Delete State Machine command returned the error code {}", ase.awsErrorDetails().errorCode());
+                    throw ase;
+                }
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            DeleteStateMachineRequest.Builder builder = DeleteStateMachineRequest.builder();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_ARN))) {
+                String stateMachineArn = exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_ARN, String.class);
+                builder.stateMachineArn(stateMachineArn);
+            }
+
+            DeleteStateMachineResponse result;
+            try {
+                DeleteStateMachineRequest request = builder.build();
+                result = sfnClient.deleteStateMachine(request);
+            } catch (AwsServiceException ase) {
+                LOG.trace("Delete State Machine command returned the error code {}", ase.awsErrorDetails().errorCode());
+                throw ase;
+            }
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+        }
+    }
+
+    private void updateStateMachine(SfnClient sfnClient, Exchange exchange) throws InvalidPayloadException {
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof UpdateStateMachineRequest request) {
+                UpdateStateMachineResponse result;
+                try {
+                    result = sfnClient.updateStateMachine(request);
+                } catch (AwsServiceException ase) {
+                    LOG.trace("Update State Machine command returned the error code {}", ase.awsErrorDetails().errorCode());
+                    throw ase;
+                }
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            UpdateStateMachineRequest.Builder builder = UpdateStateMachineRequest.builder();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_ARN))) {
+                String stateMachineArn = exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_ARN, String.class);
+                builder.stateMachineArn(stateMachineArn);
+            }
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_DEFINITION))) {
+                String stateMachineDefinition
+                        = exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_DEFINITION, String.class);
+                builder.definition(stateMachineDefinition);
+            }
+
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_ROLE_ARN))) {
+                String stateMachineRoleArn
+                        = exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_ROLE_ARN, String.class);
+                builder.roleArn(stateMachineRoleArn);
+            }
+            UpdateStateMachineResponse result;
+            try {
+                result = sfnClient.updateStateMachine(builder.build());
+            } catch (AwsServiceException ase) {
+                LOG.trace("Update State Machine command returned the error code {}", ase.awsErrorDetails().errorCode());
+                throw ase;
+            }
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+        }
+    }
+
+    private void describeStateMachine(SfnClient sfnClient, Exchange exchange) throws InvalidPayloadException {
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof DescribeStateMachineRequest request) {
+                DescribeStateMachineResponse result;
+                try {
+                    result = sfnClient.describeStateMachine(request);
+                } catch (AwsServiceException ase) {
+                    LOG.trace("Describe State Machine command returned the error code {}", ase.awsErrorDetails().errorCode());
+                    throw ase;
+                }
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            DescribeStateMachineRequest.Builder builder = DescribeStateMachineRequest.builder();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_ARN))) {
+                String stateMachineArn = exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_ARN, String.class);
+                builder.stateMachineArn(stateMachineArn);
+            }
+
+            DescribeStateMachineResponse result;
+            try {
+                result = sfnClient.describeStateMachine(builder.build());
+            } catch (AwsServiceException ase) {
+                LOG.trace("Describe State Machine command returned the error code {}", ase.awsErrorDetails().errorCode());
+                throw ase;
+            }
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+        }
+    }
+
+    private void listStateMachines(SfnClient sfnClient, Exchange exchange) throws InvalidPayloadException {
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof ListStateMachinesRequest request) {
+                ListStateMachinesResponse result;
+                try {
+                    result = sfnClient.listStateMachines(request);
+                } catch (AwsServiceException ase) {
+                    LOG.trace("List State Machines command returned the error code {}", ase.awsErrorDetails().errorCode());
+                    throw ase;
+                }
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            ListStateMachinesRequest.Builder builder = ListStateMachinesRequest.builder();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINES_MAX_RESULTS))) {
+                int maxRes = exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINES_MAX_RESULTS, Integer.class);
+                builder.maxResults(maxRes);
+            }
+
+            ListStateMachinesResponse result;
+            try {
+                result = sfnClient.listStateMachines(builder.build());
+            } catch (AwsServiceException ase) {
+                LOG.trace("List State Machines command returned the error code {}", ase.awsErrorDetails().errorCode());
+                throw ase;
+            }
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+        }
+    }
+
+    private void createActivity(SfnClient sfnClient, Exchange exchange) throws InvalidPayloadException {
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof CreateActivityRequest request) {
+                CreateActivityResponse result;
+                try {
+                    result = sfnClient.createActivity(request);
+                } catch (AwsServiceException ase) {
+                    LOG.trace("Create Activity command returned the error code {}", ase.awsErrorDetails().errorCode());
+                    throw ase;
+                }
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            CreateActivityRequest.Builder builder = CreateActivityRequest.builder();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.ACTIVITY_NAME))) {
+                String activityName = exchange.getIn().getHeader(StepFunctions2Constants.ACTIVITY_NAME, String.class);
+                builder.name(activityName);
+            }
+
+            CreateActivityResponse result;
+            try {
+                result = sfnClient.createActivity(builder.build());
+            } catch (AwsServiceException ase) {
+                LOG.trace("Create Activity command returned the error code {}", ase.awsErrorDetails().errorCode());
+                throw ase;
+            }
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+        }
+    }
+
+    private void deleteActivity(SfnClient sfnClient, Exchange exchange) throws InvalidPayloadException {
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof DeleteActivityRequest request) {
+                DeleteActivityResponse result;
+                try {
+                    result = sfnClient.deleteActivity(request);
+                } catch (AwsServiceException ase) {
+                    LOG.trace("Delete Activity command returned the error code {}", ase.awsErrorDetails().errorCode());
+                    throw ase;
+                }
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            DeleteActivityRequest.Builder builder = DeleteActivityRequest.builder();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.ACTIVITY_ARN))) {
+                String activityArn = exchange.getIn().getHeader(StepFunctions2Constants.ACTIVITY_ARN, String.class);
+                builder.activityArn(activityArn);
+            }
+
+            DeleteActivityResponse result;
+            try {
+                result = sfnClient.deleteActivity(builder.build());
+            } catch (AwsServiceException ase) {
+                LOG.trace("Delete Activity command returned the error code {}", ase.awsErrorDetails().errorCode());
+                throw ase;
+            }
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+        }
+    }
+
+    private void describeActivity(SfnClient sfnClient, Exchange exchange) throws InvalidPayloadException {
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof DescribeActivityRequest request) {
+                DescribeActivityResponse result;
+                try {
+                    result = sfnClient.describeActivity(request);
+                } catch (AwsServiceException ase) {
+                    LOG.trace("Describe Activity command returned the error code {}", ase.awsErrorDetails().errorCode());
+                    throw ase;
+                }
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            DescribeActivityRequest.Builder builder = DescribeActivityRequest.builder();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.ACTIVITY_ARN))) {
+                String activityArn = exchange.getIn().getHeader(StepFunctions2Constants.ACTIVITY_ARN, String.class);
+                builder.activityArn(activityArn);
+            }
+
+            DescribeActivityResponse result;
+            try {
+                result = sfnClient.describeActivity(builder.build());
+            } catch (AwsServiceException ase) {
+                LOG.trace("Describe Activity command returned the error code {}", ase.awsErrorDetails().errorCode());
+                throw ase;
+            }
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+        }
+    }
+
+    private void getActivityTask(SfnClient sfnClient, Exchange exchange) throws InvalidPayloadException {
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof GetActivityTaskRequest request) {
+                GetActivityTaskResponse result;
+                try {
+                    result = sfnClient.getActivityTask(request);
+                } catch (AwsServiceException ase) {
+                    LOG.trace("Get Activity Task command returned the error code {}", ase.awsErrorDetails().errorCode());
+                    throw ase;
+                }
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            GetActivityTaskRequest.Builder builder = GetActivityTaskRequest.builder();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.ACTIVITY_ARN))) {
+                String activityArn = exchange.getIn().getHeader(StepFunctions2Constants.ACTIVITY_ARN, String.class);
+                builder.activityArn(activityArn);
+            }
+
+            GetActivityTaskResponse result;
+            try {
+                result = sfnClient.getActivityTask(builder.build());
+            } catch (AwsServiceException ase) {
+                LOG.trace("Get Activity Task command returned the error code {}", ase.awsErrorDetails().errorCode());
+                throw ase;
+            }
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+        }
+    }
+
+    private void listActivities(SfnClient sfnClient, Exchange exchange) throws InvalidPayloadException {
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof ListActivitiesRequest request) {
+                ListActivitiesResponse result;
+                try {
+                    result = sfnClient.listActivities(request);
+                } catch (AwsServiceException ase) {
+                    LOG.trace("List Activities command returned the error code {}", ase.awsErrorDetails().errorCode());
+                    throw ase;
+                }
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            ListActivitiesRequest.Builder builder = ListActivitiesRequest.builder();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.ACTIVITIES_MAX_RESULTS))) {
+                int maxRes = exchange.getIn().getHeader(StepFunctions2Constants.ACTIVITIES_MAX_RESULTS, Integer.class);
+                builder.maxResults(maxRes);
+            }
+
+            ListActivitiesResponse result;
+            try {
+                result = sfnClient.listActivities(builder.build());
+            } catch (AwsServiceException ase) {
+                LOG.trace("List Activities command returned the error code {}", ase.awsErrorDetails().errorCode());
+                throw ase;
+            }
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+        }
+    }
+
+    private void startExecution(SfnClient sfnClient, Exchange exchange) throws InvalidPayloadException {
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof StartExecutionRequest request) {
+                StartExecutionResponse result;
+                try {
+                    result = sfnClient.startExecution(request);
+                } catch (AwsServiceException ase) {
+                    LOG.trace("Start Execution command returned the error code {}", ase.awsErrorDetails().errorCode());
+                    throw ase;
+                }
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            StartExecutionRequest.Builder builder = StartExecutionRequest.builder();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_ARN))) {
+                String stateMachineArn = exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_ARN, String.class);
+                builder.stateMachineArn(stateMachineArn);
+            }
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_NAME))) {
+                String executionName = exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_NAME, String.class);
+                builder.name(executionName);
+            }
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_INPUT))) {
+                String executionInput = exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_INPUT, String.class);
+                builder.input(executionInput);
+            }
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_TRACE_HEADER))) {
+                String executionTraceHeader
+                        = exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_TRACE_HEADER, String.class);
+                builder.traceHeader(executionTraceHeader);
+            }
+
+            StartExecutionResponse result;
+            try {
+                result = sfnClient.startExecution(builder.build());
+            } catch (AwsServiceException ase) {
+                LOG.trace("Start Execution command returned the error code {}", ase.awsErrorDetails().errorCode());
+                throw ase;
+            }
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+        }
+    }
+
+    private void startSyncExecution(SfnClient sfnClient, Exchange exchange) throws InvalidPayloadException {
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof StartSyncExecutionRequest request) {
+                StartSyncExecutionResponse result;
+                try {
+                    result = sfnClient.startSyncExecution(request);
+                } catch (AwsServiceException ase) {
+                    LOG.trace("Start Sync Execution command returned the error code {}", ase.awsErrorDetails().errorCode());
+                    throw ase;
+                }
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            StartSyncExecutionRequest.Builder builder = StartSyncExecutionRequest.builder();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_ARN))) {
+                String stateMachineArn = exchange.getIn().getHeader(StepFunctions2Constants.STATE_MACHINE_ARN, String.class);
+                builder.stateMachineArn(stateMachineArn);
+            }
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_NAME))) {
+                String executionName = exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_NAME, String.class);
+                builder.name(executionName);
+            }
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_INPUT))) {
+                String executionInput = exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_INPUT, String.class);
+                builder.input(executionInput);
+            }
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_TRACE_HEADER))) {
+                String executionTraceHeader
+                        = exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_TRACE_HEADER, String.class);
+                builder.traceHeader(executionTraceHeader);
+            }
+
+            StartSyncExecutionResponse result;
+            try {
+                result = sfnClient.startSyncExecution(builder.build());
+            } catch (AwsServiceException ase) {
+                LOG.trace("Start Sync Execution command returned the error code {}", ase.awsErrorDetails().errorCode());
+                throw ase;
+            }
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+        }
+    }
+
+    private void stopExecution(SfnClient sfnClient, Exchange exchange) throws InvalidPayloadException {
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof StopExecutionRequest request) {
+                StopExecutionResponse result;
+                try {
+                    result = sfnClient.stopExecution(request);
+                } catch (AwsServiceException ase) {
+                    LOG.trace("Stop Execution command returned the error code {}", ase.awsErrorDetails().errorCode());
+                    throw ase;
+                }
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            StopExecutionRequest.Builder builder = StopExecutionRequest.builder();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_ARN))) {
+                String stateMachineArn = exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_ARN, String.class);
+                builder.executionArn(stateMachineArn);
+            }
+
+            StopExecutionResponse result;
+            try {
+                result = sfnClient.stopExecution(builder.build());
+            } catch (AwsServiceException ase) {
+                LOG.trace("Stop Execution command returned the error code {}", ase.awsErrorDetails().errorCode());
+                throw ase;
+            }
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+        }
+    }
+
+    private void describeExecution(SfnClient sfnClient, Exchange exchange) throws InvalidPayloadException {
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof DescribeExecutionRequest request) {
+                DescribeExecutionResponse result;
+                try {
+                    result = sfnClient.describeExecution(request);
+                } catch (AwsServiceException ase) {
+                    LOG.trace("Describe Execution command returned the error code {}", ase.awsErrorDetails().errorCode());
+                    throw ase;
+                }
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            DescribeExecutionRequest.Builder builder = DescribeExecutionRequest.builder();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_ARN))) {
+                String stateMachineArn = exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_ARN, String.class);
+                builder.executionArn(stateMachineArn);
+            }
+
+            DescribeExecutionResponse result;
+            try {
+                result = sfnClient.describeExecution(builder.build());
+            } catch (AwsServiceException ase) {
+                LOG.trace("Describe Execution command returned the error code {}", ase.awsErrorDetails().errorCode());
+                throw ase;
+            }
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+        }
+    }
+
+    private void listExecutions(SfnClient sfnClient, Exchange exchange) throws InvalidPayloadException {
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof ListExecutionsRequest request) {
+                ListExecutionsResponse result;
+                try {
+                    result = sfnClient.listExecutions(request);
+                } catch (AwsServiceException ase) {
+                    LOG.trace("List Executions command returned the error code {}", ase.awsErrorDetails().errorCode());
+                    throw ase;
+                }
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            ListExecutionsRequest.Builder builder = ListExecutionsRequest.builder();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.EXECUTIONS_MAX_RESULTS))) {
+                int maxRes = exchange.getIn().getHeader(StepFunctions2Constants.EXECUTIONS_MAX_RESULTS, Integer.class);
+                builder.maxResults(maxRes);
+            }
+
+            ListExecutionsResponse result;
+            try {
+                result = sfnClient.listExecutions(builder.build());
+            } catch (AwsServiceException ase) {
+                LOG.trace("List Executions command returned the error code {}", ase.awsErrorDetails().errorCode());
+                throw ase;
+            }
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+        }
+    }
+
+    private void getExecutionHistory(SfnClient sfnClient, Exchange exchange) throws InvalidPayloadException {
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof GetExecutionHistoryRequest request) {
+                GetExecutionHistoryResponse result;
+                try {
+                    result = sfnClient.getExecutionHistory(request);
+                } catch (AwsServiceException ase) {
+                    LOG.trace("Get Execution History command returned the error code {}", ase.awsErrorDetails().errorCode());
+                    throw ase;
+                }
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            GetExecutionHistoryRequest.Builder builder = GetExecutionHistoryRequest.builder();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_ARN))) {
+                String executionArn = exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_ARN, String.class);
+                builder.executionArn(executionArn);
+            }
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_HISTORY_MAX_RESULTS))) {
+                int maxRes = exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_HISTORY_MAX_RESULTS, Integer.class);
+                builder.maxResults(maxRes);
+            }
+            if (ObjectHelper
+                    .isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_HISTORY_INCLUDE_EXECUTION_DATA))) {
+                boolean includeExecutionData = exchange.getIn()
+                        .getHeader(StepFunctions2Constants.EXECUTION_HISTORY_INCLUDE_EXECUTION_DATA, Boolean.class);
+                builder.includeExecutionData(includeExecutionData);
+            }
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_HISTORY_REVERSE_ORDER))) {
+                Boolean executionReverseOrder
+                        = exchange.getIn().getHeader(StepFunctions2Constants.EXECUTION_HISTORY_REVERSE_ORDER, Boolean.class);
+                builder.reverseOrder(executionReverseOrder);
+            }
+
+            GetExecutionHistoryResponse result;
+            try {
+                result = sfnClient.getExecutionHistory(builder.build());
+            } catch (AwsServiceException ase) {
+                LOG.trace("Get Execution History command returned the error code {}", ase.awsErrorDetails().errorCode());
+                throw ase;
+            }
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+        }
+    }
+
+    public static Message getMessageForResponse(final Exchange exchange) {
+        return exchange.getMessage();
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        // health-check is optional so discover and resolve
+        healthCheckRepository = HealthCheckHelper.getHealthCheckRepository(
+                getEndpoint().getCamelContext(),
+                "producers",
+                WritableHealthCheckRepository.class);
+
+        if (healthCheckRepository != null) {
+            String id = getEndpoint().getId();
+            producerHealthCheck = new StepFunctions2ProducerHealthCheck(getEndpoint(), id);
+            producerHealthCheck.setEnabled(getEndpoint().getComponent().isHealthCheckProducerEnabled());
+            healthCheckRepository.addHealthCheck(producerHealthCheck);
+        }
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        if (healthCheckRepository != null && producerHealthCheck != null) {
+            healthCheckRepository.removeHealthCheck(producerHealthCheck);
+            producerHealthCheck = null;
+        }
+    }
+
+}
diff --git a/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerHealthCheck.java b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerHealthCheck.java
new file mode 100644
index 00000000000..e1a7114b852
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerHealthCheck.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.camel.component.aws2.stepfunctions;
+
+import java.util.Map;
+
+import org.apache.camel.health.HealthCheckResultBuilder;
+import org.apache.camel.impl.health.AbstractHealthCheck;
+import org.apache.camel.util.ObjectHelper;
+import software.amazon.awssdk.awscore.exception.AwsServiceException;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.sfn.SfnClient;
+import software.amazon.awssdk.services.sfn.model.ListStateMachinesRequest;
+
+public class StepFunctions2ProducerHealthCheck extends AbstractHealthCheck {
+
+    private final StepFunctions2Endpoint stepFunctions2Endpoint;
+
+    public StepFunctions2ProducerHealthCheck(StepFunctions2Endpoint stepFunctions2Endpoint, String clientId) {
+        super("camel", "producer:aws2-step-functions-" + clientId);
+        this.stepFunctions2Endpoint = stepFunctions2Endpoint;
+    }
+
+    @Override
+    protected void doCall(HealthCheckResultBuilder builder, Map<String, Object> options) {
+        StepFunctions2Configuration configuration = stepFunctions2Endpoint.getConfiguration();
+        if (ObjectHelper.isNotEmpty(configuration.getRegion())) {
+            if (!SfnClient.serviceMetadata().regions().contains(Region.of(configuration.getRegion()))) {
+                builder.message("The service is not supported in this region");
+                builder.down();
+                return;
+            }
+        }
+        try {
+            SfnClient client = stepFunctions2Endpoint.getAwsSfnClient();
+            client.listStateMachines(ListStateMachinesRequest.builder().maxResults(1).build());
+        } catch (AwsServiceException e) {
+            builder.message(e.getMessage());
+            builder.error(e);
+            if (ObjectHelper.isNotEmpty(e.statusCode())) {
+                builder.detail(SERVICE_STATUS_CODE, e.statusCode());
+            }
+            if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+                builder.detail(SERVICE_ERROR_CODE, e.awsErrorDetails().errorCode());
+            }
+            builder.down();
+            return;
+        } catch (Exception e) {
+            builder.error(e);
+            builder.down();
+            return;
+        }
+        builder.up();
+    }
+
+}
diff --git a/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/client/StepFunctions2ClientFactory.java b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/client/StepFunctions2ClientFactory.java
new file mode 100644
index 00000000000..d068fa35cb2
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/client/StepFunctions2ClientFactory.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.stepfunctions.client;
+
+import org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration;
+import org.apache.camel.component.aws2.stepfunctions.client.impl.StepFunctions2ClientIAMOptimizedImpl;
+import org.apache.camel.component.aws2.stepfunctions.client.impl.StepFunctions2ClientStandardImpl;
+
+/**
+ * Factory class to return the correct type of AWS StepFunctions client.
+ */
+public final class StepFunctions2ClientFactory {
+
+    private StepFunctions2ClientFactory() {
+    }
+
+    /**
+     * Return the correct AWS StepFunctions client (based on remote vs local).
+     *
+     * @param  configuration configuration
+     * @return               StepFunctionsClient
+     */
+    public static StepFunctions2InternalClient getSfnClient(StepFunctions2Configuration configuration) {
+        return Boolean.TRUE.equals(configuration.isUseDefaultCredentialsProvider())
+                ? new StepFunctions2ClientIAMOptimizedImpl(configuration) : new StepFunctions2ClientStandardImpl(configuration);
+    }
+}
diff --git a/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/client/StepFunctions2InternalClient.java b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/client/StepFunctions2InternalClient.java
new file mode 100644
index 00000000000..d582115e6d0
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/client/StepFunctions2InternalClient.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.stepfunctions.client;
+
+import software.amazon.awssdk.services.sfn.SfnClient;
+
+/**
+ * Manage the required actions of an StepFunctions client for either local or remote.
+ */
+public interface StepFunctions2InternalClient {
+
+    /**
+     * Returns an StepFunctions client after a factory method determines which one to return.
+     *
+     * @return SfnClient SfnClient
+     */
+    SfnClient getSfnClient();
+}
diff --git a/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/client/impl/StepFunctions2ClientIAMOptimizedImpl.java b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/client/impl/StepFunctions2ClientIAMOptimizedImpl.java
new file mode 100644
index 00000000000..bb7b3b34c6d
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/client/impl/StepFunctions2ClientIAMOptimizedImpl.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.stepfunctions.client.impl;
+
+import java.net.URI;
+
+import org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration;
+import org.apache.camel.component.aws2.stepfunctions.client.StepFunctions2InternalClient;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import software.amazon.awssdk.http.SdkHttpClient;
+import software.amazon.awssdk.http.SdkHttpConfigurationOption;
+import software.amazon.awssdk.http.apache.ApacheHttpClient;
+import software.amazon.awssdk.http.apache.ProxyConfiguration;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.sfn.SfnClient;
+import software.amazon.awssdk.services.sfn.SfnClientBuilder;
+import software.amazon.awssdk.utils.AttributeMap;
+
+/**
+ * Manage an AWS StepFunctions client for all users to use (enabling temporary creds). This implementation is for remote
+ * instances to manage the credentials on their own (eliminating credential rotations)
+ */
+public class StepFunctions2ClientIAMOptimizedImpl implements StepFunctions2InternalClient {
+
+    private static final Logger LOG = LoggerFactory.getLogger(StepFunctions2ClientIAMOptimizedImpl.class);
+    private StepFunctions2Configuration configuration;
+
+    /**
+     * Constructor that uses the config file.
+     */
+    public StepFunctions2ClientIAMOptimizedImpl(StepFunctions2Configuration configuration) {
+        LOG.trace("Creating an AWS StepFunctions client for an ec2 instance with IAM temporary credentials (normal for ec2s).");
+        this.configuration = configuration;
+    }
+
+    /**
+     * Getting the StepFunctions aws client that is used.
+     *
+     * @return StepFunctions Client.
+     */
+    @Override
+    public SfnClient getSfnClient() {
+        SfnClient client = null;
+        SfnClientBuilder clientBuilder = SfnClient.builder();
+        ProxyConfiguration.Builder proxyConfig = null;
+        ApacheHttpClient.Builder httpClientBuilder = null;
+        if (ObjectHelper.isNotEmpty(configuration.getProxyHost()) && ObjectHelper.isNotEmpty(configuration.getProxyPort())) {
+            proxyConfig = ProxyConfiguration.builder();
+            URI proxyEndpoint = URI.create(configuration.getProxyProtocol() + "://" + configuration.getProxyHost() + ":"
+                                           + configuration.getProxyPort());
+            proxyConfig.endpoint(proxyEndpoint);
+            httpClientBuilder = ApacheHttpClient.builder().proxyConfiguration(proxyConfig.build());
+            clientBuilder = clientBuilder.httpClientBuilder(httpClientBuilder);
+        }
+        if (ObjectHelper.isNotEmpty(configuration.getRegion())) {
+            clientBuilder = clientBuilder.region(Region.of(configuration.getRegion()));
+        }
+        if (configuration.isOverrideEndpoint()) {
+            clientBuilder.endpointOverride(URI.create(configuration.getUriEndpointOverride()));
+        }
+        if (configuration.isTrustAllCertificates()) {
+            SdkHttpClient ahc = ApacheHttpClient.builder().buildWithDefaults(AttributeMap
+                    .builder()
+                    .put(
+                            SdkHttpConfigurationOption.TRUST_ALL_CERTIFICATES,
+                            Boolean.TRUE)
+                    .build());
+            clientBuilder.httpClient(ahc);
+        }
+        client = clientBuilder.build();
+        return client;
+    }
+}
diff --git a/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/client/impl/StepFunctions2ClientStandardImpl.java b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/client/impl/StepFunctions2ClientStandardImpl.java
new file mode 100644
index 00000000000..cac8c713444
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/client/impl/StepFunctions2ClientStandardImpl.java
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.stepfunctions.client.impl;
+
+import java.net.URI;
+
+import org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration;
+import org.apache.camel.component.aws2.stepfunctions.client.StepFunctions2InternalClient;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
+import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
+import software.amazon.awssdk.http.SdkHttpClient;
+import software.amazon.awssdk.http.SdkHttpConfigurationOption;
+import software.amazon.awssdk.http.apache.ApacheHttpClient;
+import software.amazon.awssdk.http.apache.ProxyConfiguration;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.sfn.SfnClient;
+import software.amazon.awssdk.services.sfn.SfnClientBuilder;
+import software.amazon.awssdk.utils.AttributeMap;
+
+/**
+ * Manage an AWS StepFunctions client for all users to use. This implementation is for local instances to use a static
+ * and solid credential set.
+ */
+public class StepFunctions2ClientStandardImpl implements StepFunctions2InternalClient {
+    private static final Logger LOG = LoggerFactory.getLogger(StepFunctions2ClientStandardImpl.class);
+    private StepFunctions2Configuration configuration;
+
+    /**
+     * Constructor that uses the config file.
+     */
+    public StepFunctions2ClientStandardImpl(StepFunctions2Configuration configuration) {
+        LOG.trace("Creating an AWS StepFunctions manager using static credentials.");
+        this.configuration = configuration;
+    }
+
+    /**
+     * Getting the StepFunctions AWS client that is used.
+     *
+     * @return Amazon StepFunctions Client.
+     */
+    @Override
+    public SfnClient getSfnClient() {
+        SfnClient client = null;
+        SfnClientBuilder clientBuilder = SfnClient.builder();
+        ProxyConfiguration.Builder proxyConfig = null;
+        ApacheHttpClient.Builder httpClientBuilder = null;
+        boolean isClientConfigFound = false;
+        if (ObjectHelper.isNotEmpty(configuration.getProxyHost()) && ObjectHelper.isNotEmpty(configuration.getProxyPort())) {
+            proxyConfig = ProxyConfiguration.builder();
+            URI proxyEndpoint = URI.create(configuration.getProxyProtocol() + "://" + configuration.getProxyHost() + ":"
+                                           + configuration.getProxyPort());
+            proxyConfig.endpoint(proxyEndpoint);
+            httpClientBuilder = ApacheHttpClient.builder().proxyConfiguration(proxyConfig.build());
+            isClientConfigFound = true;
+        }
+        if (configuration.getAccessKey() != null && configuration.getSecretKey() != null) {
+            AwsBasicCredentials cred = AwsBasicCredentials.create(configuration.getAccessKey(), configuration.getSecretKey());
+            if (isClientConfigFound) {
+                clientBuilder = clientBuilder.httpClientBuilder(httpClientBuilder)
+                        .credentialsProvider(StaticCredentialsProvider.create(cred));
+            } else {
+                clientBuilder = clientBuilder.credentialsProvider(StaticCredentialsProvider.create(cred));
+            }
+        } else {
+            if (!isClientConfigFound) {
+                clientBuilder = clientBuilder.httpClientBuilder(httpClientBuilder);
+            }
+        }
+        if (ObjectHelper.isNotEmpty(configuration.getRegion())) {
+            clientBuilder = clientBuilder.region(Region.of(configuration.getRegion()));
+        }
+        if (configuration.isOverrideEndpoint()) {
+            clientBuilder.endpointOverride(URI.create(configuration.getUriEndpointOverride()));
+        }
+        if (configuration.isTrustAllCertificates()) {
+            SdkHttpClient ahc = ApacheHttpClient.builder().buildWithDefaults(AttributeMap
+                    .builder()
+                    .put(
+                            SdkHttpConfigurationOption.TRUST_ALL_CERTIFICATES,
+                            Boolean.TRUE)
+                    .build());
+            clientBuilder.httpClient(ahc);
+        }
+        client = clientBuilder.build();
+        return client;
+    }
+}
diff --git a/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/AmazonStepFunctionsClientMock.java b/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/AmazonStepFunctionsClientMock.java
new file mode 100644
index 00000000000..3e07a0d8186
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/AmazonStepFunctionsClientMock.java
@@ -0,0 +1,158 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.stepfunctions;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import software.amazon.awssdk.services.sfn.SfnClient;
+import software.amazon.awssdk.services.sfn.model.*;
+
+public class AmazonStepFunctionsClientMock implements SfnClient {
+
+    public AmazonStepFunctionsClientMock() {
+    }
+
+    @Override
+    public CreateActivityResponse createActivity(CreateActivityRequest createActivityRequest) {
+        CreateActivityResponse.Builder result = CreateActivityResponse.builder();
+        result.activityArn("aws:sfn-activity::test:arn");
+        return result.build();
+    }
+
+    @Override
+    public CreateStateMachineResponse createStateMachine(CreateStateMachineRequest createStateMachineRequest) {
+        CreateStateMachineResponse.Builder result = CreateStateMachineResponse.builder();
+        result.stateMachineArn("aws:sfn-state-machine::test:arn");
+        return result.build();
+    }
+
+    @Override
+    public DeleteActivityResponse deleteActivity(DeleteActivityRequest deleteActivityRequest) {
+        DeleteActivityResponse.Builder result = DeleteActivityResponse.builder();
+        return result.build();
+    }
+
+    @Override
+    public DeleteStateMachineResponse deleteStateMachine(DeleteStateMachineRequest deleteStateMachineRequest) {
+        DeleteStateMachineResponse.Builder result = DeleteStateMachineResponse.builder();
+        return result.build();
+    }
+
+    @Override
+    public DescribeActivityResponse describeActivity(DescribeActivityRequest describeActivityRequest) {
+        DescribeActivityResponse.Builder result = DescribeActivityResponse.builder();
+        result.activityArn("aws:sfn-activity::test:arn");
+        return result.build();
+    }
+
+    @Override
+    public DescribeExecutionResponse describeExecution(DescribeExecutionRequest describeExecutionRequest) {
+        DescribeExecutionResponse.Builder result = DescribeExecutionResponse.builder();
+        result.executionArn("aws:sfn-activity::test:arn");
+        return result.build();
+    }
+
+    @Override
+    public DescribeStateMachineResponse describeStateMachine(DescribeStateMachineRequest describeStateMachineRequest) {
+        DescribeStateMachineResponse.Builder result = DescribeStateMachineResponse.builder();
+        result.stateMachineArn("aws:sfn-state-machine::test-arn");
+        return result.build();
+    }
+
+    @Override
+    public GetActivityTaskResponse getActivityTask(GetActivityTaskRequest getActivityTaskRequest) {
+        GetActivityTaskResponse.Builder result = GetActivityTaskResponse.builder();
+        result.input("activity-input");
+        return result.build();
+    }
+
+    @Override
+    public GetExecutionHistoryResponse getExecutionHistory(GetExecutionHistoryRequest getExecutionHistoryRequest) {
+        GetExecutionHistoryResponse.Builder result = GetExecutionHistoryResponse.builder();
+        List<HistoryEvent> events = new ArrayList<>();
+        events.add(HistoryEvent.builder().id(1L).build());
+        result.events(events);
+        return result.build();
+    }
+
+    @Override
+    public ListActivitiesResponse listActivities(ListActivitiesRequest listActivitiesRequest) {
+        ListActivitiesResponse.Builder result = ListActivitiesResponse.builder();
+        List<ActivityListItem> activityListItems = new ArrayList<>();
+        activityListItems.add(ActivityListItem.builder().activityArn("aws:sfn-activity::test:arn").build());
+        result.activities(activityListItems);
+        return result.build();
+    }
+
+    @Override
+    public ListExecutionsResponse listExecutions(ListExecutionsRequest listExecutionsRequest) {
+        ListExecutionsResponse.Builder result = ListExecutionsResponse.builder();
+        List<ExecutionListItem> executionListItems = new ArrayList<>();
+        executionListItems.add(ExecutionListItem.builder().executionArn("aws:sfn-execution::test-arn").build());
+        result.executions(executionListItems);
+        return result.build();
+    }
+
+    @Override
+    public ListStateMachinesResponse listStateMachines(ListStateMachinesRequest listStateMachinesRequest) {
+        ListStateMachinesResponse.Builder result = ListStateMachinesResponse.builder();
+        List<StateMachineListItem> stateMachineListItems = new ArrayList<>();
+        stateMachineListItems.add(StateMachineListItem.builder().stateMachineArn("aws:sfn-state-machine::test-arn").build());
+        result.stateMachines(stateMachineListItems);
+        return result.build();
+    }
+
+    @Override
+    public StartExecutionResponse startExecution(StartExecutionRequest startExecutionRequest) {
+        StartExecutionResponse.Builder result = StartExecutionResponse.builder();
+        result.executionArn("aws:sfn-execution::test:arn");
+        return result.build();
+    }
+
+    @Override
+    public StartSyncExecutionResponse startSyncExecution(StartSyncExecutionRequest startSyncExecutionRequest) {
+        StartSyncExecutionResponse.Builder result = StartSyncExecutionResponse.builder();
+        result.executionArn("aws:sfn-execution::test:arn");
+        return result.build();
+    }
+
+    @Override
+    public StopExecutionResponse stopExecution(StopExecutionRequest stopExecutionRequest) {
+        StopExecutionResponse.Builder result = StopExecutionResponse.builder();
+        result.stopDate(new Date(1691423142).toInstant());
+        return result.build();
+    }
+
+    @Override
+    public UpdateStateMachineResponse updateStateMachine(UpdateStateMachineRequest updateStateMachineRequest) {
+        UpdateStateMachineResponse.Builder result = UpdateStateMachineResponse.builder();
+        result.stateMachineVersionArn("aws:sfn-state-machine:version-2::test:arn");
+        return result.build();
+    }
+
+    @Override
+    public String serviceName() {
+        return SfnClient.SERVICE_NAME;
+    }
+
+    @Override
+    public void close() {
+
+    }
+}
diff --git a/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ClientFactoryTest.java b/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ClientFactoryTest.java
new file mode 100644
index 00000000000..900d2a25d56
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ClientFactoryTest.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.stepfunctions;
+
+import org.apache.camel.component.aws2.stepfunctions.client.StepFunctions2ClientFactory;
+import org.apache.camel.component.aws2.stepfunctions.client.StepFunctions2InternalClient;
+import org.apache.camel.component.aws2.stepfunctions.client.impl.StepFunctions2ClientIAMOptimizedImpl;
+import org.apache.camel.component.aws2.stepfunctions.client.impl.StepFunctions2ClientStandardImpl;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class StepFunctions2ClientFactoryTest {
+
+    @Test
+    public void getStandardSfnClientDefault() {
+        StepFunctions2Configuration sfn2Configuration = new StepFunctions2Configuration();
+        StepFunctions2InternalClient sfnClient = StepFunctions2ClientFactory.getSfnClient(sfn2Configuration);
+        assertTrue(sfnClient instanceof StepFunctions2ClientStandardImpl);
+    }
+
+    @Test
+    public void getStandardSfnClient() {
+        StepFunctions2Configuration sfn2Configuration = new StepFunctions2Configuration();
+        sfn2Configuration.setUseDefaultCredentialsProvider(false);
+        StepFunctions2InternalClient sfnClient = StepFunctions2ClientFactory.getSfnClient(sfn2Configuration);
+        assertTrue(sfnClient instanceof StepFunctions2ClientStandardImpl);
+    }
+
+    @Test
+    public void getIAMOptimizedSfnClient() {
+        StepFunctions2Configuration sfn2Configuration = new StepFunctions2Configuration();
+        sfn2Configuration.setUseDefaultCredentialsProvider(true);
+        StepFunctions2InternalClient sfnClient = StepFunctions2ClientFactory.getSfnClient(sfn2Configuration);
+        assertTrue(sfnClient instanceof StepFunctions2ClientIAMOptimizedImpl);
+    }
+}
diff --git a/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ComponentClientRegistryTest.java b/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ComponentClientRegistryTest.java
new file mode 100644
index 00000000000..f6ab0441304
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ComponentClientRegistryTest.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.stepfunctions;
+
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+public class StepFunctions2ComponentClientRegistryTest extends CamelTestSupport {
+
+    @Test
+    public void createEndpointWithMinimalSfnClientConfiguration() throws Exception {
+
+        AmazonStepFunctionsClientMock clientMock = new AmazonStepFunctionsClientMock();
+        context.getRegistry().bind("amazonSfnClient", clientMock);
+        StepFunctions2Component component = context.getComponent("aws2-step-functions", StepFunctions2Component.class);
+        StepFunctions2Endpoint endpoint = (StepFunctions2Endpoint) component.createEndpoint("aws2-step-functions://TestDomain");
+
+        assertNotNull(endpoint.getConfiguration().getAwsSfnClient());
+    }
+
+    @Test
+    public void createEndpointWithMinimalSfnClientMisconfiguration() {
+
+        StepFunctions2Component component = context.getComponent("aws2-step-functions", StepFunctions2Component.class);
+        assertThrows(IllegalArgumentException.class, () -> {
+            component.createEndpoint("aws2-step-functions://TestDomain");
+        });
+    }
+
+    @Test
+    public void createEndpointWithAutowired() throws Exception {
+
+        AmazonStepFunctionsClientMock clientMock = new AmazonStepFunctionsClientMock();
+        context.getRegistry().bind("awsSfnClient", clientMock);
+        StepFunctions2Component component = context.getComponent("aws2-step-functions", StepFunctions2Component.class);
+        StepFunctions2Endpoint endpoint = (StepFunctions2Endpoint) component
+                .createEndpoint("aws2-step-functions://TestDomain?accessKey=xxx&secretKey=yyy");
+
+        assertSame(clientMock, endpoint.getConfiguration().getAwsSfnClient());
+    }
+}
diff --git a/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ComponentConfigurationTest.java b/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ComponentConfigurationTest.java
new file mode 100644
index 00000000000..b337654b271
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ComponentConfigurationTest.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.stepfunctions;
+
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+import software.amazon.awssdk.core.Protocol;
+import software.amazon.awssdk.regions.Region;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class StepFunctions2ComponentConfigurationTest extends CamelTestSupport {
+
+    @Test
+    public void createEndpointWithComponentElements() throws Exception {
+        StepFunctions2Component component = context.getComponent("aws2-step-functions", StepFunctions2Component.class);
+        component.getConfiguration().setAccessKey("XXX");
+        component.getConfiguration().setSecretKey("YYY");
+        StepFunctions2Endpoint endpoint = (StepFunctions2Endpoint) component.createEndpoint("aws2-step-functions://label");
+
+        assertEquals("XXX", endpoint.getConfiguration().getAccessKey());
+        assertEquals("YYY", endpoint.getConfiguration().getSecretKey());
+    }
+
+    @Test
+    public void createEndpointWithComponentAndEndpointElements() throws Exception {
+        StepFunctions2Component component = context.getComponent("aws2-step-functions", StepFunctions2Component.class);
+        component.getConfiguration().setAccessKey("XXX");
+        component.getConfiguration().setSecretKey("YYY");
+        component.getConfiguration().setRegion(Region.US_WEST_1.toString());
+        StepFunctions2Endpoint endpoint
+                = (StepFunctions2Endpoint) component
+                        .createEndpoint("aws2-step-functions://label?accessKey=xxxxxx&secretKey=yyyyy&region=US_EAST_1");
+
+        assertEquals("xxxxxx", endpoint.getConfiguration().getAccessKey());
+        assertEquals("yyyyy", endpoint.getConfiguration().getSecretKey());
+        assertEquals("US_EAST_1", endpoint.getConfiguration().getRegion());
+    }
+
+    @Test
+    public void createEndpointWithComponentEndpointElementsAndProxy() throws Exception {
+        StepFunctions2Component component = context.getComponent("aws2-step-functions", StepFunctions2Component.class);
+        component.getConfiguration().setAccessKey("XXX");
+        component.getConfiguration().setSecretKey("YYY");
+        component.getConfiguration().setRegion(Region.US_WEST_1.toString());
+        StepFunctions2Endpoint endpoint = (StepFunctions2Endpoint) component
+                .createEndpoint(
+                        "aws2-step-functions://label?accessKey=xxxxxx&secretKey=yyyyy&region=US_EAST_1&proxyHost=localhost&proxyPort=9000&proxyProtocol=HTTP");
+
+        assertEquals("xxxxxx", endpoint.getConfiguration().getAccessKey());
+        assertEquals("yyyyy", endpoint.getConfiguration().getSecretKey());
+        assertEquals("US_EAST_1", endpoint.getConfiguration().getRegion());
+        assertEquals(Protocol.HTTP, endpoint.getConfiguration().getProxyProtocol());
+        assertEquals("localhost", endpoint.getConfiguration().getProxyHost());
+        assertEquals(Integer.valueOf(9000), endpoint.getConfiguration().getProxyPort());
+    }
+
+    @Test
+    public void createEndpointWithOverrideEndpoint() throws Exception {
+        StepFunctions2Component component = context.getComponent("aws2-step-functions", StepFunctions2Component.class);
+        component.getConfiguration().setAccessKey("XXX");
+        component.getConfiguration().setSecretKey("YYY");
+        component.getConfiguration().setRegion(Region.US_WEST_1.toString());
+        StepFunctions2Endpoint endpoint
+                = (StepFunctions2Endpoint) component.createEndpoint(
+                        "aws2-step-functions://label?accessKey=xxxxxx&secretKey=yyyyy&region=US_EAST_1&overrideEndpoint=true&uriEndpointOverride=http://localhost:9090");
+
+        assertEquals("xxxxxx", endpoint.getConfiguration().getAccessKey());
+        assertEquals("yyyyy", endpoint.getConfiguration().getSecretKey());
+        assertEquals("US_EAST_1", endpoint.getConfiguration().getRegion());
+        assertTrue(endpoint.getConfiguration().isOverrideEndpoint());
+        assertEquals("http://localhost:9090", endpoint.getConfiguration().getUriEndpointOverride());
+    }
+}
diff --git a/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerHealthCheckProfileCredsTest.java b/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerHealthCheckProfileCredsTest.java
new file mode 100644
index 00000000000..b2393729f41
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerHealthCheckProfileCredsTest.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.camel.component.aws2.stepfunctions;
+
+import java.util.Collection;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.health.HealthCheck;
+import org.apache.camel.health.HealthCheckHelper;
+import org.apache.camel.health.HealthCheckRegistry;
+import org.apache.camel.health.HealthCheckRepository;
+import org.apache.camel.impl.health.DefaultHealthCheckRegistry;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import static org.testcontainers.shaded.org.awaitility.Awaitility.await;
+
+public class StepFunctions2ProducerHealthCheckProfileCredsTest extends CamelTestSupport {
+
+    CamelContext context;
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        context = super.createCamelContext();
+        context.getPropertiesComponent().setLocation("ref:prop");
+
+        // install health check manually (yes a bit cumbersome)
+        HealthCheckRegistry registry = new DefaultHealthCheckRegistry();
+        registry.setCamelContext(context);
+        Object hc = registry.resolveById("context");
+        registry.register(hc);
+        hc = registry.resolveById("routes");
+        registry.register(hc);
+        hc = registry.resolveById("consumers");
+        registry.register(hc);
+        HealthCheckRepository hcr = (HealthCheckRepository) registry.resolveById("producers");
+        hcr.setEnabled(true);
+        registry.register(hcr);
+        context.getCamelContextExtension().addContextPlugin(HealthCheckRegistry.class, registry);
+
+        return context;
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+
+            @Override
+            public void configure() {
+                from("direct:listStateMachines")
+                        .to("aws2-step-functions://test?operation=listStateMachines&region=l&useDefaultCredentialsProvider=true");
+            }
+        };
+    }
+
+    @Test
+    public void testConnectivity() {
+        Collection<HealthCheck.Result> res = HealthCheckHelper.invokeLiveness(context);
+        boolean up = res.stream().allMatch(r -> r.getState().equals(HealthCheck.State.UP));
+        Assertions.assertTrue(up, "liveness check");
+
+        // health-check readiness should be down
+        await().atMost(20, TimeUnit.SECONDS).untilAsserted(() -> {
+            Collection<HealthCheck.Result> res2 = HealthCheckHelper.invokeReadiness(context);
+            boolean down = res2.stream().allMatch(r -> r.getState().equals(HealthCheck.State.DOWN));
+            boolean containsAws2SfnHealthCheck = res2.stream()
+                    .anyMatch(result -> result.getCheck().getId().startsWith("producer:aws2-step-functions"));
+            boolean hasRegionMessage = res2.stream()
+                    .anyMatch(r -> r.getMessage().stream().anyMatch(msg -> msg.contains("region")));
+            Assertions.assertTrue(down, "liveness check");
+            Assertions.assertTrue(containsAws2SfnHealthCheck, "aws2-step-functions check");
+            Assertions.assertTrue(hasRegionMessage, "aws2-step-functions check error message");
+        });
+
+    }
+}
diff --git a/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerHealthCheckStaticCredsTest.java b/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerHealthCheckStaticCredsTest.java
new file mode 100644
index 00000000000..067f842b5ea
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerHealthCheckStaticCredsTest.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.camel.component.aws2.stepfunctions;
+
+import java.util.Collection;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.health.HealthCheck;
+import org.apache.camel.health.HealthCheckHelper;
+import org.apache.camel.health.HealthCheckRegistry;
+import org.apache.camel.health.HealthCheckRepository;
+import org.apache.camel.impl.health.DefaultHealthCheckRegistry;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import static org.testcontainers.shaded.org.awaitility.Awaitility.await;
+
+public class StepFunctions2ProducerHealthCheckStaticCredsTest extends CamelTestSupport {
+
+    CamelContext context;
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        context = super.createCamelContext();
+        context.getPropertiesComponent().setLocation("ref:prop");
+
+        // install health check manually (yes a bit cumbersome)
+        HealthCheckRegistry registry = new DefaultHealthCheckRegistry();
+        registry.setCamelContext(context);
+        Object hc = registry.resolveById("context");
+        registry.register(hc);
+        hc = registry.resolveById("routes");
+        registry.register(hc);
+        hc = registry.resolveById("consumers");
+        registry.register(hc);
+        HealthCheckRepository hcr = (HealthCheckRepository) registry.resolveById("producers");
+        hcr.setEnabled(true);
+        registry.register(hcr);
+        context.getCamelContextExtension().addContextPlugin(HealthCheckRegistry.class, registry);
+
+        return context;
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+
+            @Override
+            public void configure() {
+                from("direct:listStateMachines")
+                        .to("aws2-step-functions://test?operation=listStateMachines&region=l&secretKey=l&accessKey=k");
+            }
+        };
+    }
+
+    @Test
+    public void testConnectivity() {
+
+        Collection<HealthCheck.Result> res = HealthCheckHelper.invokeLiveness(context);
+        boolean up = res.stream().allMatch(r -> r.getState().equals(HealthCheck.State.UP));
+        Assertions.assertTrue(up, "liveness check");
+
+        // health-check readiness should be down
+        await().atMost(20, TimeUnit.SECONDS).untilAsserted(() -> {
+            Collection<HealthCheck.Result> res2 = HealthCheckHelper.invokeReadiness(context);
+            boolean down = res2.stream().allMatch(r -> r.getState().equals(HealthCheck.State.DOWN));
+            boolean containsAws2SfnHealthCheck = res2.stream()
+                    .anyMatch(result -> result.getCheck().getId().startsWith("producer:aws2-step-functions"));
+            boolean hasRegionMessage = res2.stream()
+                    .anyMatch(r -> r.getMessage().stream().anyMatch(msg -> msg.contains("region")));
+            Assertions.assertTrue(down, "liveness check");
+            Assertions.assertTrue(containsAws2SfnHealthCheck, "aws2-step-functions check");
+            Assertions.assertTrue(hasRegionMessage, "aws2-step-functions check error message");
+        });
+
+    }
+}
diff --git a/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerSpringTest.java b/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerSpringTest.java
new file mode 100644
index 00000000000..2fc21c89979
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerSpringTest.java
@@ -0,0 +1,337 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.stepfunctions;
+
+import java.util.Date;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.spring.junit5.CamelSpringTestSupport;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import software.amazon.awssdk.services.sfn.model.*;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class StepFunctions2ProducerSpringTest extends CamelSpringTestSupport {
+
+    @EndpointInject("mock:result")
+    private MockEndpoint mock;
+
+    @Test
+    public void sfnCreateActivityTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:createActivity", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.createActivity);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        CreateActivityResponse resultGet = (CreateActivityResponse) exchange.getIn().getBody();
+        assertEquals("aws:sfn-activity::test:arn", resultGet.activityArn());
+    }
+
+    @Test
+    public void sfnCreateActivityPojoTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:createPojoActivity", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.createActivity);
+                exchange.getIn().setBody(CreateActivityRequest.builder().name("activity").build());
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        CreateActivityResponse resultGet = (CreateActivityResponse) exchange.getIn().getBody();
+        assertEquals("aws:sfn-activity::test:arn", resultGet.activityArn());
+    }
+
+    @Test
+    public void sfnCreateStateMachineTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:createStateMachine", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.createStateMachine);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        CreateStateMachineResponse resultGet = (CreateStateMachineResponse) exchange.getIn().getBody();
+        assertEquals("aws:sfn-state-machine::test:arn", resultGet.stateMachineArn());
+    }
+
+    @Test
+    public void sfnDeleteStateMachineTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:deleteStateMachine", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.deleteStateMachine);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        DeleteStateMachineResponse resultGet = (DeleteStateMachineResponse) exchange.getIn().getBody();
+        assertNotNull(resultGet);
+    }
+
+    @Test
+    public void sfnUpdateStateMachineTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:updateStateMachine", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.updateStateMachine);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        UpdateStateMachineResponse resultGet = (UpdateStateMachineResponse) exchange.getIn().getBody();
+        assertEquals("aws:sfn-state-machine:version-2::test:arn", resultGet.stateMachineVersionArn());
+    }
+
+    @Test
+    public void sfnDescribeStateMachineTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:describeStateMachine", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.describeStateMachine);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        DescribeStateMachineResponse resultGet = (DescribeStateMachineResponse) exchange.getIn().getBody();
+        assertEquals("aws:sfn-state-machine::test-arn", resultGet.stateMachineArn());
+    }
+
+    @Test
+    public void sfnListStateMachinesTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:listStateMachines", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.listStateMachines);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        ListStateMachinesResponse resultGet = (ListStateMachinesResponse) exchange.getIn().getBody();
+        assertEquals(1, resultGet.stateMachines().size());
+        assertEquals("aws:sfn-state-machine::test-arn", resultGet.stateMachines().get(0).stateMachineArn());
+    }
+
+    @Test
+    public void sfnDeleteActivityTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:deleteActivity", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.deleteActivity);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        DeleteActivityResponse resultGet = (DeleteActivityResponse) exchange.getIn().getBody();
+        assertNotNull(resultGet);
+    }
+
+    @Test
+    public void sfnDescribeActivityTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:describeActivity", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.describeActivity);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        DescribeActivityResponse resultGet = (DescribeActivityResponse) exchange.getIn().getBody();
+        assertEquals("aws:sfn-activity::test:arn", resultGet.activityArn());
+    }
+
+    @Test
+    public void sfnGetActivityTaskTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:getActivityTask", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.getActivityTask);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        GetActivityTaskResponse resultGet = (GetActivityTaskResponse) exchange.getIn().getBody();
+        assertEquals("activity-input", resultGet.input());
+    }
+
+    @Test
+    public void sfnListActivitiesTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:listActivities", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.listActivities);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        ListActivitiesResponse resultGet = (ListActivitiesResponse) exchange.getIn().getBody();
+        assertEquals(1, resultGet.activities().size());
+        assertEquals("aws:sfn-activity::test:arn", resultGet.activities().get(0).activityArn());
+    }
+
+    @Test
+    public void sfnStartExecutionTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:startExecution", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.startExecution);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        StartExecutionResponse resultGet = (StartExecutionResponse) exchange.getIn().getBody();
+        assertEquals("aws:sfn-execution::test:arn", resultGet.executionArn());
+    }
+
+    @Test
+    public void sfnStartSyncExecutionTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:startSyncExecution", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.startSyncExecution);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        StartSyncExecutionResponse resultGet = (StartSyncExecutionResponse) exchange.getIn().getBody();
+        assertEquals("aws:sfn-execution::test:arn", resultGet.executionArn());
+    }
+
+    @Test
+    public void sfnStopExecutionTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:stopExecution", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.stopExecution);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        StopExecutionResponse resultGet = (StopExecutionResponse) exchange.getIn().getBody();
+        assertEquals(new Date(1691423142).toInstant(), resultGet.stopDate());
+    }
+
+    @Test
+    public void sfnDescribeExecutionTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:describeExecution", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.describeExecution);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        DescribeExecutionResponse resultGet = (DescribeExecutionResponse) exchange.getIn().getBody();
+        assertEquals("aws:sfn-activity::test:arn", resultGet.executionArn());
+    }
+
+    @Test
+    public void sfnListExecutionsTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:listExecutions", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.listExecutions);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        ListExecutionsResponse resultGet = (ListExecutionsResponse) exchange.getIn().getBody();
+        assertEquals(1, resultGet.executions().size());
+        assertEquals("aws:sfn-execution::test-arn", resultGet.executions().get(0).executionArn());
+    }
+
+    @Test
+    public void sfnGetExecutionHistoryTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:getExecutionHistory", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.getExecutionHistory);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        GetExecutionHistoryResponse resultGet = (GetExecutionHistoryResponse) exchange.getIn().getBody();
+        assertEquals(1, resultGet.events().size());
+        assertEquals(1L, resultGet.events().get(0).id());
+    }
+
+    @Override
+    protected ClassPathXmlApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext(
+                "org/apache/camel/component/aws2/stepfunctions/StepFunctionsComponentSpringTest-context.xml");
+    }
+}
diff --git a/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerTest.java b/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerTest.java
new file mode 100644
index 00000000000..4e287256893
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/test/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerTest.java
@@ -0,0 +1,397 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.stepfunctions;
+
+import java.util.Date;
+
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+import software.amazon.awssdk.services.sfn.model.*;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class StepFunctions2ProducerTest extends CamelTestSupport {
+
+    @BindToRegistry("awsSfnClient")
+    AmazonStepFunctionsClientMock clientMock = new AmazonStepFunctionsClientMock();
+
+    @EndpointInject("mock:result")
+    private MockEndpoint mock;
+
+    @Test
+    public void sfnCreateActivityTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:createActivity", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.createActivity);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        CreateActivityResponse resultGet = (CreateActivityResponse) exchange.getIn().getBody();
+        assertEquals("aws:sfn-activity::test:arn", resultGet.activityArn());
+    }
+
+    @Test
+    public void sfnCreateActivityPojoTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:createPojoActivity", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.createActivity);
+                exchange.getIn().setBody(CreateActivityRequest.builder().name("activity").build());
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        CreateActivityResponse resultGet = (CreateActivityResponse) exchange.getIn().getBody();
+        assertEquals("aws:sfn-activity::test:arn", resultGet.activityArn());
+    }
+
+    @Test
+    public void sfnCreateStateMachineTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:createStateMachine", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.createStateMachine);
+                exchange.getIn().setHeader(StepFunctions2Constants.STATE_MACHINE_NAME, "state-machine");
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        CreateStateMachineResponse resultGet = (CreateStateMachineResponse) exchange.getIn().getBody();
+        assertEquals("aws:sfn-state-machine::test:arn", resultGet.stateMachineArn());
+    }
+
+    @Test
+    public void sfnDeleteStateMachineTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:deleteStateMachine", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.deleteStateMachine);
+                exchange.getIn().setHeader(StepFunctions2Constants.STATE_MACHINE_ARN, "aws:sfn-state-machine::test:arn");
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        DeleteStateMachineResponse resultGet = (DeleteStateMachineResponse) exchange.getIn().getBody();
+        assertNotNull(resultGet);
+    }
+
+    @Test
+    public void sfnUpdateStateMachineTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:updateStateMachine", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.updateStateMachine);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        UpdateStateMachineResponse resultGet = (UpdateStateMachineResponse) exchange.getIn().getBody();
+        assertEquals("aws:sfn-state-machine:version-2::test:arn", resultGet.stateMachineVersionArn());
+    }
+
+    @Test
+    public void sfnDescribeStateMachineTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:describeStateMachine", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.describeStateMachine);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        DescribeStateMachineResponse resultGet = (DescribeStateMachineResponse) exchange.getIn().getBody();
+        assertEquals("aws:sfn-state-machine::test-arn", resultGet.stateMachineArn());
+    }
+
+    @Test
+    public void sfnListStateMachinesTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:listStateMachines", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.listStateMachines);
+                exchange.getIn().setHeader(StepFunctions2Constants.STATE_MACHINES_MAX_RESULTS, 5);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        ListStateMachinesResponse resultGet = (ListStateMachinesResponse) exchange.getIn().getBody();
+        assertEquals(1, resultGet.stateMachines().size());
+        assertEquals("aws:sfn-state-machine::test-arn", resultGet.stateMachines().get(0).stateMachineArn());
+    }
+
+    @Test
+    public void sfnDeleteActivityTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:deleteActivity", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.deleteActivity);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        DeleteActivityResponse resultGet = (DeleteActivityResponse) exchange.getIn().getBody();
+        assertNotNull(resultGet);
+    }
+
+    @Test
+    public void sfnDescribeActivityTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:describeActivity", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.describeActivity);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        DescribeActivityResponse resultGet = (DescribeActivityResponse) exchange.getIn().getBody();
+        assertEquals("aws:sfn-activity::test:arn", resultGet.activityArn());
+    }
+
+    @Test
+    public void sfnGetActivityTaskTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:getActivityTask", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.getActivityTask);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        GetActivityTaskResponse resultGet = (GetActivityTaskResponse) exchange.getIn().getBody();
+        assertEquals("activity-input", resultGet.input());
+    }
+
+    @Test
+    public void sfnListActivitiesTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:listActivities", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.listActivities);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        ListActivitiesResponse resultGet = (ListActivitiesResponse) exchange.getIn().getBody();
+        assertEquals(1, resultGet.activities().size());
+        assertEquals("aws:sfn-activity::test:arn", resultGet.activities().get(0).activityArn());
+    }
+
+    @Test
+    public void sfnStartExecutionTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:startExecution", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.startExecution);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        StartExecutionResponse resultGet = (StartExecutionResponse) exchange.getIn().getBody();
+        assertEquals("aws:sfn-execution::test:arn", resultGet.executionArn());
+    }
+
+    @Test
+    public void sfnStartSyncExecutionTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:startSyncExecution", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.startSyncExecution);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        StartSyncExecutionResponse resultGet = (StartSyncExecutionResponse) exchange.getIn().getBody();
+        assertEquals("aws:sfn-execution::test:arn", resultGet.executionArn());
+    }
+
+    @Test
+    public void sfnStopExecutionTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:stopExecution", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.stopExecution);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        StopExecutionResponse resultGet = (StopExecutionResponse) exchange.getIn().getBody();
+        assertEquals(new Date(1691423142).toInstant(), resultGet.stopDate());
+    }
+
+    @Test
+    public void sfnDescribeExecutionTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:describeExecution", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.describeExecution);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        DescribeExecutionResponse resultGet = (DescribeExecutionResponse) exchange.getIn().getBody();
+        assertEquals("aws:sfn-activity::test:arn", resultGet.executionArn());
+    }
+
+    @Test
+    public void sfnListExecutionsTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:listExecutions", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.listExecutions);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        ListExecutionsResponse resultGet = (ListExecutionsResponse) exchange.getIn().getBody();
+        assertEquals(1, resultGet.executions().size());
+        assertEquals("aws:sfn-execution::test-arn", resultGet.executions().get(0).executionArn());
+    }
+
+    @Test
+    public void sfnGetExecutionHistoryTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:getExecutionHistory", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(StepFunctions2Constants.OPERATION, StepFunctions2Operations.getExecutionHistory);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        GetExecutionHistoryResponse resultGet = (GetExecutionHistoryResponse) exchange.getIn().getBody();
+        assertEquals(1, resultGet.events().size());
+        assertEquals(1L, resultGet.events().get(0).id());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:createActivity")
+                        .to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=createActivity")
+                        .to("mock:result");
+                from("direct:createPojoActivity")
+                        .to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=createActivity&pojoRequest=true")
+                        .to("mock:result");
+                from("direct:createStateMachine")
+                        .to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=createStateMachine")
+                        .to("mock:result");
+                from("direct:deleteStateMachine")
+                        .to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=deleteStateMachine")
+                        .to("mock:result");
+                from("direct:updateStateMachine")
+                        .to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=updateStateMachine")
+                        .to("mock:result");
+                from("direct:listStateMachines")
+                        .to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=listStateMachines")
+                        .to("mock:result");
+                from("direct:deleteActivity")
+                        .to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=deleteActivity")
+                        .to("mock:result");
+                from("direct:describeActivity")
+                        .to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=describeActivity")
+                        .to("mock:result");
+                from("direct:getActivityTask")
+                        .to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=getActivityTask")
+                        .to("mock:result");
+                from("direct:listActivities")
+                        .to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=listActivities")
+                        .to("mock:result");
+                from("direct:startExecution")
+                        .to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=startExecution")
+                        .to("mock:result");
+                from("direct:startSyncExecution")
+                        .to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=startSyncExecution")
+                        .to("mock:result");
+                from("direct:stopExecution").to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=stopExecution")
+                        .to("mock:result");
+                from("direct:describeExecution")
+                        .to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=describeExecution")
+                        .to("mock:result");
+                from("direct:listExecutions")
+                        .to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=listExecutions")
+                        .to("mock:result");
+                from("direct:getExecutionHistory")
+                        .to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=getExecutionHistory")
+                        .to("mock:result");
+                from("direct:describeStateMachine")
+                        .to("aws2-step-functions://test?awsSfnClient=#awsSfnClient&operation=describeStateMachine")
+                        .to("mock:result");
+            }
+        };
+    }
+}
diff --git a/components/camel-aws/camel-aws2-step-functions/src/test/resources/log4j2.properties b/components/camel-aws/camel-aws2-step-functions/src/test/resources/log4j2.properties
new file mode 100644
index 00000000000..1d68055c385
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/test/resources/log4j2.properties
@@ -0,0 +1,28 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+appender.file.type = File
+appender.file.name = file
+appender.file.fileName = target/camel-aws2-step-functions-test.log
+appender.file.layout.type = PatternLayout
+appender.file.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+appender.out.type = Console
+appender.out.name = out
+appender.out.layout.type = PatternLayout
+appender.out.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+rootLogger.level = INFO
+rootLogger.appenderRef.file.ref = file
diff --git a/components/camel-aws/camel-aws2-step-functions/src/test/resources/org/apache/camel/component/aws2/stepfunctions/StepFunctionsComponentSpringTest-context.xml b/components/camel-aws/camel-aws2-step-functions/src/test/resources/org/apache/camel/component/aws2/stepfunctions/StepFunctionsComponentSpringTest-context.xml
new file mode 100644
index 00000000000..127da848b5c
--- /dev/null
+++ b/components/camel-aws/camel-aws2-step-functions/src/test/resources/org/apache/camel/component/aws2/stepfunctions/StepFunctionsComponentSpringTest-context.xml
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+    http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
+
+    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
+        <route>
+            <from uri="direct:createActivity"/>
+            <to uri="aws2-step-functions://test?awsSfnClient=#awsSfnClient&amp;operation=createActivity"/>
+            <to uri="mock:result"/>
+        </route>
+        <route>
+            <from uri="direct:createPojoActivity"/>
+            <to uri="aws2-step-functions://test?awsSfnClient=#awsSfnClient&amp;operation=createActivity"/>
+            <to uri="mock:result"/>
+        </route>
+        <route>
+            <from uri="direct:createStateMachine"/>
+            <to uri="aws2-step-functions://test?awsSfnClient=#awsSfnClient&amp;operation=createStateMachine"/>
+            <to uri="mock:result"/>
+        </route>
+        <route>
+            <from uri="direct:deleteStateMachine"/>
+            <to uri="aws2-step-functions://test?awsSfnClient=#awsSfnClient&amp;operation=deleteStateMachine"/>
+            <to uri="mock:result"/>
+        </route>
+        <route>
+            <from uri="direct:updateStateMachine"/>
+            <to uri="aws2-step-functions://test?awsSfnClient=#awsSfnClient&amp;operation=updateStateMachine"/>
+            <to uri="mock:result"/>
+        </route>
+        <route>
+            <from uri="direct:describeStateMachine"/>
+            <to uri="aws2-step-functions://test?awsSfnClient=#awsSfnClient&amp;operation=describeStateMachine"/>
+            <to uri="mock:result"/>
+        </route>
+        <route>
+            <from uri="direct:listStateMachines"/>
+            <to uri="aws2-step-functions://test?awsSfnClient=#awsSfnClient&amp;operation=listStateMachines"/>
+            <to uri="mock:result"/>
+        </route>
+        <route>
+            <from uri="direct:deleteActivity"/>
+            <to uri="aws2-step-functions://test?awsSfnClient=#awsSfnClient&amp;operation=deleteActivity"/>
+            <to uri="mock:result"/>
+        </route>
+        <route>
+            <from uri="direct:describeActivity"/>
+            <to uri="aws2-step-functions://test?awsSfnClient=#awsSfnClient&amp;operation=describeActivity"/>
+            <to uri="mock:result"/>
+        </route>
+        <route>
+            <from uri="direct:getActivityTask"/>
+            <to uri="aws2-step-functions://test?awsSfnClient=#awsSfnClient&amp;operation=getActivityTask"/>
+            <to uri="mock:result"/>
+        </route>
+        <route>
+            <from uri="direct:listActivities"/>
+            <to uri="aws2-step-functions://test?awsSfnClient=#awsSfnClient&amp;operation=listActivities"/>
+            <to uri="mock:result"/>
+        </route>
+        <route>
+            <from uri="direct:startExecution"/>
+            <to uri="aws2-step-functions://test?awsSfnClient=#awsSfnClient&amp;operation=startExecution"/>
+            <to uri="mock:result"/>
+        </route>
+        <route>
+            <from uri="direct:startSyncExecution"/>
+            <to uri="aws2-step-functions://test?awsSfnClient=#awsSfnClient&amp;operation=startSyncExecution"/>
+            <to uri="mock:result"/>
+        </route>
+        <route>
+            <from uri="direct:stopExecution"/>
+            <to uri="aws2-step-functions://test?awsSfnClient=#awsSfnClient&amp;operation=stopExecution"/>
+            <to uri="mock:result"/>
+        </route>
+        <route>
+            <from uri="direct:describeExecution"/>
+            <to uri="aws2-step-functions://test?awsSfnClient=#awsSfnClient&amp;operation=describeExecution"/>
+            <to uri="mock:result"/>
+        </route>
+        <route>
+            <from uri="direct:listExecutions"/>
+            <to uri="aws2-step-functions://test?awsSfnClient=#awsSfnClient&amp;operation=listExecutions"/>
+            <to uri="mock:result"/>
+        </route>
+        <route>
+            <from uri="direct:getExecutionHistory"/>
+            <to uri="aws2-step-functions://test?awsSfnClient=#awsSfnClient&amp;operation=getExecutionHistory"/>
+            <to uri="mock:result"/>
+        </route>
+    </camelContext>
+
+    <bean id="awsSfnClient" class="org.apache.camel.component.aws2.stepfunctions.AmazonStepFunctionsClientMock"/>
+</beans>
\ No newline at end of file
diff --git a/components/camel-aws/pom.xml b/components/camel-aws/pom.xml
index c3d238d4d4a..b373de81af4 100644
--- a/components/camel-aws/pom.xml
+++ b/components/camel-aws/pom.xml
@@ -58,6 +58,7 @@
         <module>camel-aws2-ses</module>
         <module>camel-aws2-sns</module>
         <module>camel-aws2-sqs</module>
+        <module>camel-aws2-step-functions</module>
         <module>camel-aws2-sts</module>
         <module>camel-aws2-translate</module>
         <module>camel-aws-xray</module>
diff --git a/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties b/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties
index d7ffb452357..75a7ac2930b 100644
--- a/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties
+++ b/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties
@@ -27,6 +27,7 @@ aws2-s3
 aws2-ses
 aws2-sns
 aws2-sqs
+aws2-step-functions
 aws2-sts
 aws2-translate
 azure-cosmosdb
diff --git a/docs/components/modules/ROOT/examples/json/aws2-step-functions.json b/docs/components/modules/ROOT/examples/json/aws2-step-functions.json
new file mode 120000
index 00000000000..e2cd260e543
--- /dev/null
+++ b/docs/components/modules/ROOT/examples/json/aws2-step-functions.json
@@ -0,0 +1 @@
+../../../../../../components/camel-aws/camel-aws2-step-functions/src/generated/resources/org/apache/camel/component/aws2/stepfunctions/aws2-step-functions.json
\ No newline at end of file
diff --git a/docs/components/modules/ROOT/nav.adoc b/docs/components/modules/ROOT/nav.adoc
index cefb086c1f0..4a42be3934f 100644
--- a/docs/components/modules/ROOT/nav.adoc
+++ b/docs/components/modules/ROOT/nav.adoc
@@ -33,6 +33,7 @@
 *** xref:aws2-ses-component.adoc[AWS Simple Email Service (SES)]
 *** xref:aws2-sns-component.adoc[AWS Simple Notification System (SNS)]
 *** xref:aws2-sqs-component.adoc[AWS Simple Queue Service (SQS)]
+*** xref:aws2-step-functions-component.adoc[AWS StepFunctions]
 *** xref:aws2-translate-component.adoc[AWS Translate]
 ** xref:azure-summary.adoc[Azure]
 *** xref:azure-cosmosdb-component.adoc[Azure CosmosDB]
diff --git a/docs/components/modules/ROOT/pages/aws2-step-functions-component.adoc b/docs/components/modules/ROOT/pages/aws2-step-functions-component.adoc
new file mode 120000
index 00000000000..bd70d4aa408
--- /dev/null
+++ b/docs/components/modules/ROOT/pages/aws2-step-functions-component.adoc
@@ -0,0 +1 @@
+../../../../../components/camel-aws/camel-aws2-step-functions/src/main/docs/aws2-step-functions-component.adoc
\ No newline at end of file
diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
index c9473e48dd5..391422dfcf8 100644
--- a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
+++ b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
@@ -428,6 +428,19 @@ public interface ComponentsBuilderFactory {
     static org.apache.camel.builder.component.dsl.Aws2SqsComponentBuilderFactory.Aws2SqsComponentBuilder aws2Sqs() {
         return org.apache.camel.builder.component.dsl.Aws2SqsComponentBuilderFactory.aws2Sqs();
     }
+    /**
+     * AWS StepFunctions (camel-aws2-step-functions)
+     * Manage and invoke AWS Step functions using AWS SDK version 2.x.
+     * 
+     * Category: cloud,serverless
+     * Since: 4.0
+     * Maven coordinates: org.apache.camel:camel-aws2-step-functions
+     * 
+     * @return the dsl builder
+     */
+    static org.apache.camel.builder.component.dsl.Aws2StepFunctionsComponentBuilderFactory.Aws2StepFunctionsComponentBuilder aws2StepFunctions() {
+        return org.apache.camel.builder.component.dsl.Aws2StepFunctionsComponentBuilderFactory.aws2StepFunctions();
+    }
     /**
      * AWS Security Token Service (STS) (camel-aws2-sts)
      * Manage AWS STS cluster instances using AWS SDK version 2.x.
diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Aws2StepFunctionsComponentBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Aws2StepFunctionsComponentBuilderFactory.java
new file mode 100644
index 00000000000..478a7f834dd
--- /dev/null
+++ b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Aws2StepFunctionsComponentBuilderFactory.java
@@ -0,0 +1,443 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.builder.component.dsl;
+
+import javax.annotation.processing.Generated;
+import org.apache.camel.Component;
+import org.apache.camel.builder.component.AbstractComponentBuilder;
+import org.apache.camel.builder.component.ComponentBuilder;
+import org.apache.camel.component.aws2.stepfunctions.StepFunctions2Component;
+
+/**
+ * Manage and invoke AWS Step functions using AWS SDK version 2.x.
+ * 
+ * Generated by camel-package-maven-plugin - do not edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.ComponentDslMojo")
+public interface Aws2StepFunctionsComponentBuilderFactory {
+
+    /**
+     * AWS StepFunctions (camel-aws2-step-functions)
+     * Manage and invoke AWS Step functions using AWS SDK version 2.x.
+     * 
+     * Category: cloud,serverless
+     * Since: 4.0
+     * Maven coordinates: org.apache.camel:camel-aws2-step-functions
+     * 
+     * @return the dsl builder
+     */
+    static Aws2StepFunctionsComponentBuilder aws2StepFunctions() {
+        return new Aws2StepFunctionsComponentBuilderImpl();
+    }
+
+    /**
+     * Builder for the AWS StepFunctions component.
+     */
+    interface Aws2StepFunctionsComponentBuilder
+            extends
+                ComponentBuilder<StepFunctions2Component> {
+        /**
+         * Component configuration.
+         * 
+         * The option is a:
+         * &lt;code&gt;org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration&lt;/code&gt; type.
+         * 
+         * Group: producer
+         * 
+         * @param configuration the value to set
+         * @return the dsl builder
+         */
+        default Aws2StepFunctionsComponentBuilder configuration(
+                org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration configuration) {
+            doSetProperty("configuration", configuration);
+            return this;
+        }
+        /**
+         * Whether the producer should be started lazy (on the first message).
+         * By starting lazy you can use this to allow CamelContext and routes to
+         * startup in situations where a producer may otherwise fail during
+         * starting and cause the route to fail being started. By deferring this
+         * startup to be lazy then the startup failure can be handled during
+         * routing messages via Camel's routing error handlers. Beware that when
+         * the first message is processed then creating and starting the
+         * producer may take a little time and prolong the total processing time
+         * of the processing.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @param lazyStartProducer the value to set
+         * @return the dsl builder
+         */
+        default Aws2StepFunctionsComponentBuilder lazyStartProducer(
+                boolean lazyStartProducer) {
+            doSetProperty("lazyStartProducer", lazyStartProducer);
+            return this;
+        }
+        /**
+         * The operation to perform. It can be listFunctions, getFunction,
+         * createFunction, deleteFunction or invokeFunction.
+         * 
+         * The option is a:
+         * &lt;code&gt;org.apache.camel.component.aws2.stepfunctions.StepFunctions2Operations&lt;/code&gt; type.
+         * 
+         * Group: producer
+         * 
+         * @param operation the value to set
+         * @return the dsl builder
+         */
+        default Aws2StepFunctionsComponentBuilder operation(
+                org.apache.camel.component.aws2.stepfunctions.StepFunctions2Operations operation) {
+            doSetProperty("operation", operation);
+            return this;
+        }
+        /**
+         * Set the need for overidding the endpoint. This option needs to be
+         * used in combination with uriEndpointOverride option.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @param overrideEndpoint the value to set
+         * @return the dsl builder
+         */
+        default Aws2StepFunctionsComponentBuilder overrideEndpoint(
+                boolean overrideEndpoint) {
+            doSetProperty("overrideEndpoint", overrideEndpoint);
+            return this;
+        }
+        /**
+         * If we want to use a POJO request as body or not.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @param pojoRequest the value to set
+         * @return the dsl builder
+         */
+        default Aws2StepFunctionsComponentBuilder pojoRequest(
+                boolean pojoRequest) {
+            doSetProperty("pojoRequest", pojoRequest);
+            return this;
+        }
+        /**
+         * If using a profile credentials provider this parameter will set the
+         * profile name.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: producer
+         * 
+         * @param profileCredentialsName the value to set
+         * @return the dsl builder
+         */
+        default Aws2StepFunctionsComponentBuilder profileCredentialsName(
+                java.lang.String profileCredentialsName) {
+            doSetProperty("profileCredentialsName", profileCredentialsName);
+            return this;
+        }
+        /**
+         * The region in which StepFunctions client needs to work. When using
+         * this parameter, the configuration will expect the lowercase name of
+         * the region (for example ap-east-1) You'll need to use the name
+         * Region.EU_WEST_1.id().
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: producer
+         * 
+         * @param region the value to set
+         * @return the dsl builder
+         */
+        default Aws2StepFunctionsComponentBuilder region(java.lang.String region) {
+            doSetProperty("region", region);
+            return this;
+        }
+        /**
+         * If we want to trust all certificates in case of overriding the
+         * endpoint.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @param trustAllCertificates the value to set
+         * @return the dsl builder
+         */
+        default Aws2StepFunctionsComponentBuilder trustAllCertificates(
+                boolean trustAllCertificates) {
+            doSetProperty("trustAllCertificates", trustAllCertificates);
+            return this;
+        }
+        /**
+         * Set the overriding uri endpoint. This option needs to be used in
+         * combination with overrideEndpoint option.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: producer
+         * 
+         * @param uriEndpointOverride the value to set
+         * @return the dsl builder
+         */
+        default Aws2StepFunctionsComponentBuilder uriEndpointOverride(
+                java.lang.String uriEndpointOverride) {
+            doSetProperty("uriEndpointOverride", uriEndpointOverride);
+            return this;
+        }
+        /**
+         * Set whether the StepFunctions client should expect to load
+         * credentials through a default credentials provider or to expect
+         * static credentials to be passed in.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @param useDefaultCredentialsProvider the value to set
+         * @return the dsl builder
+         */
+        default Aws2StepFunctionsComponentBuilder useDefaultCredentialsProvider(
+                boolean useDefaultCredentialsProvider) {
+            doSetProperty("useDefaultCredentialsProvider", useDefaultCredentialsProvider);
+            return this;
+        }
+        /**
+         * Set whether the StepFunctions client should expect to load
+         * credentials through a profile credentials provider.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @param useProfileCredentialsProvider the value to set
+         * @return the dsl builder
+         */
+        default Aws2StepFunctionsComponentBuilder useProfileCredentialsProvider(
+                boolean useProfileCredentialsProvider) {
+            doSetProperty("useProfileCredentialsProvider", useProfileCredentialsProvider);
+            return this;
+        }
+        /**
+         * Whether autowiring is enabled. This is used for automatic autowiring
+         * options (the option must be marked as autowired) by looking up in the
+         * registry to find if there is a single instance of matching type,
+         * which then gets configured on the component. This can be used for
+         * automatic configuring JDBC data sources, JMS connection factories,
+         * AWS Clients, etc.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: true
+         * Group: advanced
+         * 
+         * @param autowiredEnabled the value to set
+         * @return the dsl builder
+         */
+        default Aws2StepFunctionsComponentBuilder autowiredEnabled(
+                boolean autowiredEnabled) {
+            doSetProperty("autowiredEnabled", autowiredEnabled);
+            return this;
+        }
+        /**
+         * To use a existing configured AwsStepFunctionsClient as client.
+         * 
+         * The option is a:
+         * &lt;code&gt;software.amazon.awssdk.services.sfn.SfnClient&lt;/code&gt; type.
+         * 
+         * Group: advanced
+         * 
+         * @param awsSfnClient the value to set
+         * @return the dsl builder
+         */
+        default Aws2StepFunctionsComponentBuilder awsSfnClient(
+                software.amazon.awssdk.services.sfn.SfnClient awsSfnClient) {
+            doSetProperty("awsSfnClient", awsSfnClient);
+            return this;
+        }
+        /**
+         * Used for enabling or disabling all consumer based health checks from
+         * this component.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: true
+         * Group: health
+         * 
+         * @param healthCheckConsumerEnabled the value to set
+         * @return the dsl builder
+         */
+        default Aws2StepFunctionsComponentBuilder healthCheckConsumerEnabled(
+                boolean healthCheckConsumerEnabled) {
+            doSetProperty("healthCheckConsumerEnabled", healthCheckConsumerEnabled);
+            return this;
+        }
+        /**
+         * Used for enabling or disabling all producer based health checks from
+         * this component. Notice: Camel has by default disabled all producer
+         * based health-checks. You can turn on producer checks globally by
+         * setting camel.health.producersEnabled=true.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: true
+         * Group: health
+         * 
+         * @param healthCheckProducerEnabled the value to set
+         * @return the dsl builder
+         */
+        default Aws2StepFunctionsComponentBuilder healthCheckProducerEnabled(
+                boolean healthCheckProducerEnabled) {
+            doSetProperty("healthCheckProducerEnabled", healthCheckProducerEnabled);
+            return this;
+        }
+        /**
+         * To define a proxy host when instantiating the StepFunctions client.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: proxy
+         * 
+         * @param proxyHost the value to set
+         * @return the dsl builder
+         */
+        default Aws2StepFunctionsComponentBuilder proxyHost(
+                java.lang.String proxyHost) {
+            doSetProperty("proxyHost", proxyHost);
+            return this;
+        }
+        /**
+         * To define a proxy port when instantiating the StepFunctions client.
+         * 
+         * The option is a: &lt;code&gt;java.lang.Integer&lt;/code&gt; type.
+         * 
+         * Group: proxy
+         * 
+         * @param proxyPort the value to set
+         * @return the dsl builder
+         */
+        default Aws2StepFunctionsComponentBuilder proxyPort(
+                java.lang.Integer proxyPort) {
+            doSetProperty("proxyPort", proxyPort);
+            return this;
+        }
+        /**
+         * To define a proxy protocol when instantiating the StepFunctions
+         * client.
+         * 
+         * The option is a:
+         * &lt;code&gt;software.amazon.awssdk.core.Protocol&lt;/code&gt; type.
+         * 
+         * Default: HTTPS
+         * Group: proxy
+         * 
+         * @param proxyProtocol the value to set
+         * @return the dsl builder
+         */
+        default Aws2StepFunctionsComponentBuilder proxyProtocol(
+                software.amazon.awssdk.core.Protocol proxyProtocol) {
+            doSetProperty("proxyProtocol", proxyProtocol);
+            return this;
+        }
+        /**
+         * Amazon AWS Access Key.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: security
+         * 
+         * @param accessKey the value to set
+         * @return the dsl builder
+         */
+        default Aws2StepFunctionsComponentBuilder accessKey(
+                java.lang.String accessKey) {
+            doSetProperty("accessKey", accessKey);
+            return this;
+        }
+        /**
+         * Amazon AWS Secret Key.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: security
+         * 
+         * @param secretKey the value to set
+         * @return the dsl builder
+         */
+        default Aws2StepFunctionsComponentBuilder secretKey(
+                java.lang.String secretKey) {
+            doSetProperty("secretKey", secretKey);
+            return this;
+        }
+    }
+
+    class Aws2StepFunctionsComponentBuilderImpl
+            extends
+                AbstractComponentBuilder<StepFunctions2Component>
+            implements
+                Aws2StepFunctionsComponentBuilder {
+        @Override
+        protected StepFunctions2Component buildConcreteComponent() {
+            return new StepFunctions2Component();
+        }
+        private org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration getOrCreateConfiguration(
+                org.apache.camel.component.aws2.stepfunctions.StepFunctions2Component component) {
+            if (component.getConfiguration() == null) {
+                component.setConfiguration(new org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration());
+            }
+            return component.getConfiguration();
+        }
+        @Override
+        protected boolean setPropertyOnComponent(
+                Component component,
+                String name,
+                Object value) {
+            switch (name) {
+            case "configuration": ((StepFunctions2Component) component).setConfiguration((org.apache.camel.component.aws2.stepfunctions.StepFunctions2Configuration) value); return true;
+            case "lazyStartProducer": ((StepFunctions2Component) component).setLazyStartProducer((boolean) value); return true;
+            case "operation": getOrCreateConfiguration((StepFunctions2Component) component).setOperation((org.apache.camel.component.aws2.stepfunctions.StepFunctions2Operations) value); return true;
+            case "overrideEndpoint": getOrCreateConfiguration((StepFunctions2Component) component).setOverrideEndpoint((boolean) value); return true;
+            case "pojoRequest": getOrCreateConfiguration((StepFunctions2Component) component).setPojoRequest((boolean) value); return true;
+            case "profileCredentialsName": getOrCreateConfiguration((StepFunctions2Component) component).setProfileCredentialsName((java.lang.String) value); return true;
+            case "region": getOrCreateConfiguration((StepFunctions2Component) component).setRegion((java.lang.String) value); return true;
+            case "trustAllCertificates": getOrCreateConfiguration((StepFunctions2Component) component).setTrustAllCertificates((boolean) value); return true;
+            case "uriEndpointOverride": getOrCreateConfiguration((StepFunctions2Component) component).setUriEndpointOverride((java.lang.String) value); return true;
+            case "useDefaultCredentialsProvider": getOrCreateConfiguration((StepFunctions2Component) component).setUseDefaultCredentialsProvider((boolean) value); return true;
+            case "useProfileCredentialsProvider": getOrCreateConfiguration((StepFunctions2Component) component).setUseProfileCredentialsProvider((boolean) value); return true;
+            case "autowiredEnabled": ((StepFunctions2Component) component).setAutowiredEnabled((boolean) value); return true;
+            case "awsSfnClient": getOrCreateConfiguration((StepFunctions2Component) component).setAwsSfnClient((software.amazon.awssdk.services.sfn.SfnClient) value); return true;
+            case "healthCheckConsumerEnabled": ((StepFunctions2Component) component).setHealthCheckConsumerEnabled((boolean) value); return true;
+            case "healthCheckProducerEnabled": ((StepFunctions2Component) component).setHealthCheckProducerEnabled((boolean) value); return true;
+            case "proxyHost": getOrCreateConfiguration((StepFunctions2Component) component).setProxyHost((java.lang.String) value); return true;
+            case "proxyPort": getOrCreateConfiguration((StepFunctions2Component) component).setProxyPort((java.lang.Integer) value); return true;
+            case "proxyProtocol": getOrCreateConfiguration((StepFunctions2Component) component).setProxyProtocol((software.amazon.awssdk.core.Protocol) value); return true;
+            case "accessKey": getOrCreateConfiguration((StepFunctions2Component) component).setAccessKey((java.lang.String) value); return true;
+            case "secretKey": getOrCreateConfiguration((StepFunctions2Component) component).setSecretKey((java.lang.String) value); return true;
+            default: return false;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/dsl/camel-componentdsl/src/generated/resources/metadata.json b/dsl/camel-componentdsl/src/generated/resources/metadata.json
index 9406f52dbb9..370d782b0a8 100644
--- a/dsl/camel-componentdsl/src/generated/resources/metadata.json
+++ b/dsl/camel-componentdsl/src/generated/resources/metadata.json
@@ -596,6 +596,28 @@
     "producerOnly": false,
     "lenientProperties": false
   },
+  "Aws2StepFunctionsComponentBuilderFactory": {
+    "kind": "component",
+    "name": "aws2-step-functions",
+    "title": "AWS StepFunctions",
+    "description": "Manage and invoke AWS Step functions using AWS SDK version 2.x.",
+    "deprecated": false,
+    "firstVersion": "4.0.0",
+    "label": "cloud,serverless",
+    "javaType": "org.apache.camel.component.aws2.stepfunctions.StepFunctions2Component",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-aws2-step-functions",
+    "version": "4.0.0-SNAPSHOT",
+    "scheme": "aws2-step-functions",
+    "extendsScheme": "",
+    "syntax": "aws2-step-functions:label",
+    "async": false,
+    "api": false,
+    "consumerOnly": false,
+    "producerOnly": true,
+    "lenientProperties": false
+  },
   "Aws2StsComponentBuilderFactory": {
     "kind": "component",
     "name": "aws2-sts",
diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
index cf13b4f992e..f09034f5f87 100644
--- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
+++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
@@ -302,6 +302,7 @@ public interface EndpointBuilderFactory
             org.apache.camel.builder.endpoint.dsl.Sqs2EndpointBuilderFactory.Sqs2Builders,
             org.apache.camel.builder.endpoint.dsl.SshEndpointBuilderFactory.SshBuilders,
             org.apache.camel.builder.endpoint.dsl.StAXEndpointBuilderFactory.StAXBuilders,
+            org.apache.camel.builder.endpoint.dsl.StepFunctions2EndpointBuilderFactory.StepFunctions2Builders,
             org.apache.camel.builder.endpoint.dsl.StitchEndpointBuilderFactory.StitchBuilders,
             org.apache.camel.builder.endpoint.dsl.StompEndpointBuilderFactory.StompBuilders,
             org.apache.camel.builder.endpoint.dsl.StreamEndpointBuilderFactory.StreamBuilders,
diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilders.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
index f8aeb2d08c6..ae14a8f4e33 100644
--- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
+++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
@@ -299,6 +299,7 @@ public interface EndpointBuilders
             org.apache.camel.builder.endpoint.dsl.Sqs2EndpointBuilderFactory,
             org.apache.camel.builder.endpoint.dsl.SshEndpointBuilderFactory,
             org.apache.camel.builder.endpoint.dsl.StAXEndpointBuilderFactory,
+            org.apache.camel.builder.endpoint.dsl.StepFunctions2EndpointBuilderFactory,
             org.apache.camel.builder.endpoint.dsl.StitchEndpointBuilderFactory,
             org.apache.camel.builder.endpoint.dsl.StompEndpointBuilderFactory,
             org.apache.camel.builder.endpoint.dsl.StreamEndpointBuilderFactory,
diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
index 16adeb315d3..38df8bb6c2c 100644
--- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
+++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
@@ -1253,6 +1253,49 @@ public class StaticEndpointBuilders {
             String path) {
         return org.apache.camel.builder.endpoint.dsl.Sqs2EndpointBuilderFactory.endpointBuilder(componentName, path);
     }
+    /**
+     * AWS StepFunctions (camel-aws2-step-functions)
+     * Manage and invoke AWS Step functions using AWS SDK version 2.x.
+     * 
+     * Category: cloud,serverless
+     * Since: 4.0
+     * Maven coordinates: org.apache.camel:camel-aws2-step-functions
+     * 
+     * Syntax: <code>aws2-step-functions:label</code>
+     * 
+     * Path parameter: label (required)
+     * Logical name
+     * 
+     * @param path label
+     * @return the dsl builder
+     */
+    public static org.apache.camel.builder.endpoint.dsl.StepFunctions2EndpointBuilderFactory.StepFunctions2EndpointBuilder aws2StepFunctions(
+            String path) {
+        return org.apache.camel.builder.endpoint.dsl.StepFunctions2EndpointBuilderFactory.endpointBuilder("aws2-step-functions", path);
+    }
+    /**
+     * AWS StepFunctions (camel-aws2-step-functions)
+     * Manage and invoke AWS Step functions using AWS SDK version 2.x.
+     * 
+     * Category: cloud,serverless
+     * Since: 4.0
+     * Maven coordinates: org.apache.camel:camel-aws2-step-functions
+     * 
+     * Syntax: <code>aws2-step-functions:label</code>
+     * 
+     * Path parameter: label (required)
+     * Logical name
+     * 
+     * @param componentName to use a custom component name for the endpoint
+     * instead of the default name
+     * @param path label
+     * @return the dsl builder
+     */
+    public static org.apache.camel.builder.endpoint.dsl.StepFunctions2EndpointBuilderFactory.StepFunctions2EndpointBuilder aws2StepFunctions(
+            String componentName,
+            String path) {
+        return org.apache.camel.builder.endpoint.dsl.StepFunctions2EndpointBuilderFactory.endpointBuilder(componentName, path);
+    }
     /**
      * AWS Security Token Service (STS) (camel-aws2-sts)
      * Manage AWS STS cluster instances using AWS SDK version 2.x.
diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/StepFunctions2EndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/StepFunctions2EndpointBuilderFactory.java
new file mode 100644
index 00000000000..3030ff52f08
--- /dev/null
+++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/StepFunctions2EndpointBuilderFactory.java
@@ -0,0 +1,830 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.builder.endpoint.dsl;
+
+import java.util.*;
+import java.util.concurrent.*;
+import java.util.function.*;
+import java.util.stream.*;
+import javax.annotation.processing.Generated;
+import org.apache.camel.builder.EndpointConsumerBuilder;
+import org.apache.camel.builder.EndpointProducerBuilder;
+import org.apache.camel.builder.endpoint.AbstractEndpointBuilder;
+
+/**
+ * Manage and invoke AWS Step functions using AWS SDK version 2.x.
+ * 
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.EndpointDslMojo")
+public interface StepFunctions2EndpointBuilderFactory {
+
+
+    /**
+     * Builder for endpoint for the AWS StepFunctions component.
+     */
+    public interface StepFunctions2EndpointBuilder
+            extends
+                EndpointProducerBuilder {
+        default AdvancedStepFunctions2EndpointBuilder advanced() {
+            return (AdvancedStepFunctions2EndpointBuilder) this;
+        }
+        /**
+         * The operation to perform. It can be listFunctions, getFunction,
+         * createFunction, deleteFunction or invokeFunction.
+         * 
+         * The option is a:
+         * &lt;code&gt;org.apache.camel.component.aws2.stepfunctions.StepFunctions2Operations&lt;/code&gt; type.
+         * 
+         * Required: true
+         * Group: producer
+         * 
+         * @param operation the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder operation(
+                org.apache.camel.component.aws2.stepfunctions.StepFunctions2Operations operation) {
+            doSetProperty("operation", operation);
+            return this;
+        }
+        /**
+         * The operation to perform. It can be listFunctions, getFunction,
+         * createFunction, deleteFunction or invokeFunction.
+         * 
+         * The option will be converted to a
+         * &lt;code&gt;org.apache.camel.component.aws2.stepfunctions.StepFunctions2Operations&lt;/code&gt; type.
+         * 
+         * Required: true
+         * Group: producer
+         * 
+         * @param operation the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder operation(String operation) {
+            doSetProperty("operation", operation);
+            return this;
+        }
+        /**
+         * Set the need for overidding the endpoint. This option needs to be
+         * used in combination with uriEndpointOverride option.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @param overrideEndpoint the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder overrideEndpoint(
+                boolean overrideEndpoint) {
+            doSetProperty("overrideEndpoint", overrideEndpoint);
+            return this;
+        }
+        /**
+         * Set the need for overidding the endpoint. This option needs to be
+         * used in combination with uriEndpointOverride option.
+         * 
+         * The option will be converted to a &lt;code&gt;boolean&lt;/code&gt;
+         * type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @param overrideEndpoint the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder overrideEndpoint(
+                String overrideEndpoint) {
+            doSetProperty("overrideEndpoint", overrideEndpoint);
+            return this;
+        }
+        /**
+         * If we want to use a POJO request as body or not.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @param pojoRequest the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder pojoRequest(boolean pojoRequest) {
+            doSetProperty("pojoRequest", pojoRequest);
+            return this;
+        }
+        /**
+         * If we want to use a POJO request as body or not.
+         * 
+         * The option will be converted to a &lt;code&gt;boolean&lt;/code&gt;
+         * type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @param pojoRequest the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder pojoRequest(String pojoRequest) {
+            doSetProperty("pojoRequest", pojoRequest);
+            return this;
+        }
+        /**
+         * If using a profile credentials provider this parameter will set the
+         * profile name.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: producer
+         * 
+         * @param profileCredentialsName the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder profileCredentialsName(
+                String profileCredentialsName) {
+            doSetProperty("profileCredentialsName", profileCredentialsName);
+            return this;
+        }
+        /**
+         * The region in which StepFunctions client needs to work. When using
+         * this parameter, the configuration will expect the lowercase name of
+         * the region (for example ap-east-1) You'll need to use the name
+         * Region.EU_WEST_1.id().
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: producer
+         * 
+         * @param region the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder region(String region) {
+            doSetProperty("region", region);
+            return this;
+        }
+        /**
+         * If we want to trust all certificates in case of overriding the
+         * endpoint.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @param trustAllCertificates the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder trustAllCertificates(
+                boolean trustAllCertificates) {
+            doSetProperty("trustAllCertificates", trustAllCertificates);
+            return this;
+        }
+        /**
+         * If we want to trust all certificates in case of overriding the
+         * endpoint.
+         * 
+         * The option will be converted to a &lt;code&gt;boolean&lt;/code&gt;
+         * type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @param trustAllCertificates the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder trustAllCertificates(
+                String trustAllCertificates) {
+            doSetProperty("trustAllCertificates", trustAllCertificates);
+            return this;
+        }
+        /**
+         * Set the overriding uri endpoint. This option needs to be used in
+         * combination with overrideEndpoint option.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: producer
+         * 
+         * @param uriEndpointOverride the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder uriEndpointOverride(
+                String uriEndpointOverride) {
+            doSetProperty("uriEndpointOverride", uriEndpointOverride);
+            return this;
+        }
+        /**
+         * Set whether the StepFunctions client should expect to load
+         * credentials through a default credentials provider or to expect
+         * static credentials to be passed in.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @param useDefaultCredentialsProvider the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder useDefaultCredentialsProvider(
+                boolean useDefaultCredentialsProvider) {
+            doSetProperty("useDefaultCredentialsProvider", useDefaultCredentialsProvider);
+            return this;
+        }
+        /**
+         * Set whether the StepFunctions client should expect to load
+         * credentials through a default credentials provider or to expect
+         * static credentials to be passed in.
+         * 
+         * The option will be converted to a &lt;code&gt;boolean&lt;/code&gt;
+         * type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @param useDefaultCredentialsProvider the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder useDefaultCredentialsProvider(
+                String useDefaultCredentialsProvider) {
+            doSetProperty("useDefaultCredentialsProvider", useDefaultCredentialsProvider);
+            return this;
+        }
+        /**
+         * Set whether the StepFunctions client should expect to load
+         * credentials through a profile credentials provider.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @param useProfileCredentialsProvider the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder useProfileCredentialsProvider(
+                boolean useProfileCredentialsProvider) {
+            doSetProperty("useProfileCredentialsProvider", useProfileCredentialsProvider);
+            return this;
+        }
+        /**
+         * Set whether the StepFunctions client should expect to load
+         * credentials through a profile credentials provider.
+         * 
+         * The option will be converted to a &lt;code&gt;boolean&lt;/code&gt;
+         * type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @param useProfileCredentialsProvider the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder useProfileCredentialsProvider(
+                String useProfileCredentialsProvider) {
+            doSetProperty("useProfileCredentialsProvider", useProfileCredentialsProvider);
+            return this;
+        }
+        /**
+         * To define a proxy host when instantiating the StepFunctions client.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: proxy
+         * 
+         * @param proxyHost the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder proxyHost(String proxyHost) {
+            doSetProperty("proxyHost", proxyHost);
+            return this;
+        }
+        /**
+         * To define a proxy port when instantiating the StepFunctions client.
+         * 
+         * The option is a: &lt;code&gt;java.lang.Integer&lt;/code&gt; type.
+         * 
+         * Group: proxy
+         * 
+         * @param proxyPort the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder proxyPort(Integer proxyPort) {
+            doSetProperty("proxyPort", proxyPort);
+            return this;
+        }
+        /**
+         * To define a proxy port when instantiating the StepFunctions client.
+         * 
+         * The option will be converted to a
+         * &lt;code&gt;java.lang.Integer&lt;/code&gt; type.
+         * 
+         * Group: proxy
+         * 
+         * @param proxyPort the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder proxyPort(String proxyPort) {
+            doSetProperty("proxyPort", proxyPort);
+            return this;
+        }
+        /**
+         * To define a proxy protocol when instantiating the StepFunctions
+         * client.
+         * 
+         * The option is a:
+         * &lt;code&gt;software.amazon.awssdk.core.Protocol&lt;/code&gt; type.
+         * 
+         * Default: HTTPS
+         * Group: proxy
+         * 
+         * @param proxyProtocol the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder proxyProtocol(
+                software.amazon.awssdk.core.Protocol proxyProtocol) {
+            doSetProperty("proxyProtocol", proxyProtocol);
+            return this;
+        }
+        /**
+         * To define a proxy protocol when instantiating the StepFunctions
+         * client.
+         * 
+         * The option will be converted to a
+         * &lt;code&gt;software.amazon.awssdk.core.Protocol&lt;/code&gt; type.
+         * 
+         * Default: HTTPS
+         * Group: proxy
+         * 
+         * @param proxyProtocol the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder proxyProtocol(String proxyProtocol) {
+            doSetProperty("proxyProtocol", proxyProtocol);
+            return this;
+        }
+        /**
+         * Amazon AWS Access Key.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: security
+         * 
+         * @param accessKey the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder accessKey(String accessKey) {
+            doSetProperty("accessKey", accessKey);
+            return this;
+        }
+        /**
+         * Amazon AWS Secret Key.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: security
+         * 
+         * @param secretKey the value to set
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder secretKey(String secretKey) {
+            doSetProperty("secretKey", secretKey);
+            return this;
+        }
+    }
+
+    /**
+     * Advanced builder for endpoint for the AWS StepFunctions component.
+     */
+    public interface AdvancedStepFunctions2EndpointBuilder
+            extends
+                EndpointProducerBuilder {
+        default StepFunctions2EndpointBuilder basic() {
+            return (StepFunctions2EndpointBuilder) this;
+        }
+        /**
+         * Whether the producer should be started lazy (on the first message).
+         * By starting lazy you can use this to allow CamelContext and routes to
+         * startup in situations where a producer may otherwise fail during
+         * starting and cause the route to fail being started. By deferring this
+         * startup to be lazy then the startup failure can be handled during
+         * routing messages via Camel's routing error handlers. Beware that when
+         * the first message is processed then creating and starting the
+         * producer may take a little time and prolong the total processing time
+         * of the processing.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: producer (advanced)
+         * 
+         * @param lazyStartProducer the value to set
+         * @return the dsl builder
+         */
+        default AdvancedStepFunctions2EndpointBuilder lazyStartProducer(
+                boolean lazyStartProducer) {
+            doSetProperty("lazyStartProducer", lazyStartProducer);
+            return this;
+        }
+        /**
+         * Whether the producer should be started lazy (on the first message).
+         * By starting lazy you can use this to allow CamelContext and routes to
+         * startup in situations where a producer may otherwise fail during
+         * starting and cause the route to fail being started. By deferring this
+         * startup to be lazy then the startup failure can be handled during
+         * routing messages via Camel's routing error handlers. Beware that when
+         * the first message is processed then creating and starting the
+         * producer may take a little time and prolong the total processing time
+         * of the processing.
+         * 
+         * The option will be converted to a &lt;code&gt;boolean&lt;/code&gt;
+         * type.
+         * 
+         * Default: false
+         * Group: producer (advanced)
+         * 
+         * @param lazyStartProducer the value to set
+         * @return the dsl builder
+         */
+        default AdvancedStepFunctions2EndpointBuilder lazyStartProducer(
+                String lazyStartProducer) {
+            doSetProperty("lazyStartProducer", lazyStartProducer);
+            return this;
+        }
+        /**
+         * To use a existing configured AwsStepFunctionsClient as client.
+         * 
+         * The option is a:
+         * &lt;code&gt;software.amazon.awssdk.services.sfn.SfnClient&lt;/code&gt; type.
+         * 
+         * Group: advanced
+         * 
+         * @param awsSfnClient the value to set
+         * @return the dsl builder
+         */
+        default AdvancedStepFunctions2EndpointBuilder awsSfnClient(
+                software.amazon.awssdk.services.sfn.SfnClient awsSfnClient) {
+            doSetProperty("awsSfnClient", awsSfnClient);
+            return this;
+        }
+        /**
+         * To use a existing configured AwsStepFunctionsClient as client.
+         * 
+         * The option will be converted to a
+         * &lt;code&gt;software.amazon.awssdk.services.sfn.SfnClient&lt;/code&gt; type.
+         * 
+         * Group: advanced
+         * 
+         * @param awsSfnClient the value to set
+         * @return the dsl builder
+         */
+        default AdvancedStepFunctions2EndpointBuilder awsSfnClient(
+                String awsSfnClient) {
+            doSetProperty("awsSfnClient", awsSfnClient);
+            return this;
+        }
+    }
+
+    public interface StepFunctions2Builders {
+        /**
+         * AWS StepFunctions (camel-aws2-step-functions)
+         * Manage and invoke AWS Step functions using AWS SDK version 2.x.
+         * 
+         * Category: cloud,serverless
+         * Since: 4.0
+         * Maven coordinates: org.apache.camel:camel-aws2-step-functions
+         * 
+         * @return the dsl builder for the headers' name.
+         */
+        default StepFunctions2HeaderNameBuilder aws2StepFunctions() {
+            return StepFunctions2HeaderNameBuilder.INSTANCE;
+        }
+        /**
+         * AWS StepFunctions (camel-aws2-step-functions)
+         * Manage and invoke AWS Step functions using AWS SDK version 2.x.
+         * 
+         * Category: cloud,serverless
+         * Since: 4.0
+         * Maven coordinates: org.apache.camel:camel-aws2-step-functions
+         * 
+         * Syntax: <code>aws2-step-functions:label</code>
+         * 
+         * Path parameter: label (required)
+         * Logical name
+         * 
+         * @param path label
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder aws2StepFunctions(String path) {
+            return StepFunctions2EndpointBuilderFactory.endpointBuilder("aws2-step-functions", path);
+        }
+        /**
+         * AWS StepFunctions (camel-aws2-step-functions)
+         * Manage and invoke AWS Step functions using AWS SDK version 2.x.
+         * 
+         * Category: cloud,serverless
+         * Since: 4.0
+         * Maven coordinates: org.apache.camel:camel-aws2-step-functions
+         * 
+         * Syntax: <code>aws2-step-functions:label</code>
+         * 
+         * Path parameter: label (required)
+         * Logical name
+         * 
+         * @param componentName to use a custom component name for the endpoint
+         * instead of the default name
+         * @param path label
+         * @return the dsl builder
+         */
+        default StepFunctions2EndpointBuilder aws2StepFunctions(
+                String componentName,
+                String path) {
+            return StepFunctions2EndpointBuilderFactory.endpointBuilder(componentName, path);
+        }
+    }
+
+    /**
+     * The builder of headers' name for the AWS StepFunctions component.
+     */
+    public static class StepFunctions2HeaderNameBuilder {
+        /**
+         * The internal instance of the builder used to access to all the
+         * methods representing the name of headers.
+         */
+        private static final StepFunctions2HeaderNameBuilder INSTANCE = new StepFunctions2HeaderNameBuilder();
+
+        /**
+         * The operation we want to perform.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsStateMachineOperation}.
+         */
+        public String awsStateMachineOperation() {
+            return "AwsStateMachineOperation";
+        }
+
+        /**
+         * The name of the state machine.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code
+         * AwsStepFunctionsStateMachineName}.
+         */
+        public String awsStepFunctionsStateMachineName() {
+            return "AwsStepFunctionsStateMachineName";
+        }
+
+        /**
+         * The Amazon States Language definition of the state machine.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code
+         * AwsStepFunctionsStateMachineDefinition}.
+         */
+        public String awsStepFunctionsStateMachineDefinition() {
+            return "AwsStepFunctionsStateMachineDefinition";
+        }
+
+        /**
+         * Determines whether a Standard or Express state machine is created.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code
+         * AwsStepFunctionsStateMachineType}.
+         */
+        public String awsStepFunctionsStateMachineType() {
+            return "AwsStepFunctionsStateMachineType";
+        }
+
+        /**
+         * The Amazon Resource Name (ARN) of the IAM role to use for this state
+         * machine.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code
+         * AwsStepFunctionsStateMachineRoleArn}.
+         */
+        public String awsStepFunctionsStateMachineRoleArn() {
+            return "AwsStepFunctionsStateMachineRoleArn";
+        }
+
+        /**
+         * The Amazon Resource Name (ARN) of state machine.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code
+         * AwsStepFunctionsStateMachineArn}.
+         */
+        public String awsStepFunctionsStateMachineArn() {
+            return "AwsStepFunctionsStateMachineArn";
+        }
+
+        /**
+         * The limit number of results while listing state machines.
+         * 
+         * The option is a: {@code Integer} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsStateMachinesMaxResults}.
+         */
+        public String awsStateMachinesMaxResults() {
+            return "AwsStateMachinesMaxResults";
+        }
+
+        /**
+         * The name of the state machine activity.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code
+         * AwsStepFunctionsStateMachineActivityName}.
+         */
+        public String awsStepFunctionsStateMachineActivityName() {
+            return "AwsStepFunctionsStateMachineActivityName";
+        }
+
+        /**
+         * The ARN of the state machine activity.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code
+         * AwsStepFunctionsStateMachineActivityArn}.
+         */
+        public String awsStepFunctionsStateMachineActivityArn() {
+            return "AwsStepFunctionsStateMachineActivityArn";
+        }
+
+        /**
+         * The limit number of results while listing state machines.
+         * 
+         * The option is a: {@code Integer} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code
+         * AwsStateMachineActivitiesMaxResults}.
+         */
+        public String awsStateMachineActivitiesMaxResults() {
+            return "AwsStateMachineActivitiesMaxResults";
+        }
+
+        /**
+         * The Amazon Resource Name (ARN) of the execution.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsStateMachineExecutionArn}.
+         */
+        public String awsStateMachineExecutionArn() {
+            return "AwsStateMachineExecutionArn";
+        }
+
+        /**
+         * Optional name of the execution.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsStateMachineExecutionName}.
+         */
+        public String awsStateMachineExecutionName() {
+            return "AwsStateMachineExecutionName";
+        }
+
+        /**
+         * The string that contains the JSON input data for the execution.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsStateMachineExecutionInput}.
+         */
+        public String awsStateMachineExecutionInput() {
+            return "AwsStateMachineExecutionInput";
+        }
+
+        /**
+         * Passes the X-Ray trace header.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code
+         * AwsStateMachineExecutionTraceHeader}.
+         */
+        public String awsStateMachineExecutionTraceHeader() {
+            return "AwsStateMachineExecutionTraceHeader";
+        }
+
+        /**
+         * The limit number of results while listing execution history.
+         * 
+         * The option is a: {@code Integer} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code
+         * AwsStateMachineExecutionHistoryMaxResults}.
+         */
+        public String awsStateMachineExecutionHistoryMaxResults() {
+            return "AwsStateMachineExecutionHistoryMaxResults";
+        }
+
+        /**
+         * You can select whether execution data (input or output of a history
+         * event) is returned.
+         * 
+         * The option is a: {@code Boolean} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code
+         * AwsStateMachineExecutionHistoryIncludeExecutionData}.
+         */
+        public String awsStateMachineExecutionHistoryIncludeExecutionData() {
+            return "AwsStateMachineExecutionHistoryIncludeExecutionData";
+        }
+
+        /**
+         * Lists events in descending order of their timeStamp.
+         * 
+         * The option is a: {@code Boolean} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code
+         * AwsStateMachineExecutionHistoryReverseOrder}.
+         */
+        public String awsStateMachineExecutionHistoryReverseOrder() {
+            return "AwsStateMachineExecutionHistoryReverseOrder";
+        }
+
+        /**
+         * The limit number of results while listing executions.
+         * 
+         * The option is a: {@code Integer} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code
+         * AwsStateMachineExecutionMaxResults}.
+         */
+        public String awsStateMachineExecutionMaxResults() {
+            return "AwsStateMachineExecutionMaxResults";
+        }
+    }
+    static StepFunctions2EndpointBuilder endpointBuilder(
+            String componentName,
+            String path) {
+        class StepFunctions2EndpointBuilderImpl extends AbstractEndpointBuilder implements StepFunctions2EndpointBuilder, AdvancedStepFunctions2EndpointBuilder {
+            public StepFunctions2EndpointBuilderImpl(String path) {
+                super(componentName, path);
+            }
+        }
+        return new StepFunctions2EndpointBuilderImpl(path);
+    }
+}
\ No newline at end of file
diff --git a/dsl/camel-kamelet-main/src/generated/resources/camel-component-known-dependencies.properties b/dsl/camel-kamelet-main/src/generated/resources/camel-component-known-dependencies.properties
index d473d9e0d16..fa5aca8ff22 100644
--- a/dsl/camel-kamelet-main/src/generated/resources/camel-component-known-dependencies.properties
+++ b/dsl/camel-kamelet-main/src/generated/resources/camel-component-known-dependencies.properties
@@ -46,6 +46,7 @@ org.apache.camel.component.aws2.s3.AWS2S3Component=camel:aws2-s3
 org.apache.camel.component.aws2.ses.Ses2Component=camel:aws2-ses
 org.apache.camel.component.aws2.sns.Sns2Component=camel:aws2-sns
 org.apache.camel.component.aws2.sqs.Sqs2Component=camel:aws2-sqs
+org.apache.camel.component.aws2.stepfunctions.StepFunctions2Component=camel:aws2-step-functions
 org.apache.camel.component.aws2.sts.STS2Component=camel:aws2-sts
 org.apache.camel.component.aws2.translate.Translate2Component=camel:aws2-translate
 org.apache.camel.component.azure.cosmosdb.CosmosDbComponent=camel:azure-cosmosdb
diff --git a/parent/pom.xml b/parent/pom.xml
index d0ad3ea9634..e8f17fe7342 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -814,6 +814,11 @@
                 <artifactId>camel-aws2-sqs</artifactId>
                 <version>${project.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-aws2-step-functions</artifactId>
+                <version>${project.version}</version>
+            </dependency>
             <dependency>
                 <groupId>org.apache.camel</groupId>
                 <artifactId>camel-aws2-sts</artifactId>
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MojoHelper.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MojoHelper.java
index b02bdccbc33..6d0be19d013 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MojoHelper.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MojoHelper.java
@@ -83,7 +83,8 @@ public final class MojoHelper {
                         dir.resolve("camel-aws2-mq"),
                         dir.resolve("camel-aws2-msk"), dir.resolve("camel-aws2-s3"), dir.resolve("camel-aws2-ses"),
                         dir.resolve("camel-aws2-sns"),
-                        dir.resolve("camel-aws2-sqs"), dir.resolve("camel-aws2-sts"), dir.resolve("camel-aws2-translate"),
+                        dir.resolve("camel-aws2-sqs"), dir.resolve("camel-aws2-step-functions"),
+                        dir.resolve("camel-aws2-sts"), dir.resolve("camel-aws2-translate"),
                         dir.resolve("camel-aws-xray"), dir.resolve("camel-aws-secrets-manager"),
                         dir.resolve("camel-aws-cloudtrail"));
             case "camel-vertx":