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

acosentino 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 adfa1c152253 CAMEL-22804 - Camel-AWS-IAM: Support more operations 
based on the API available (#20938)
adfa1c152253 is described below

commit adfa1c1522532996db407b013f7a3d1fb692cfed
Author: Andrea Cosentino <[email protected]>
AuthorDate: Tue Jan 20 15:04:08 2026 +0100

    CAMEL-22804 - Camel-AWS-IAM: Support more operations based on the API 
available (#20938)
    
    Signed-off-by: Andrea Cosentino <[email protected]>
---
 .../apache/camel/catalog/components/aws2-iam.json  |  22 +-
 .../apache/camel/component/aws2/iam/aws2-iam.json  |  22 +-
 .../src/main/docs/aws2-iam-component.adoc          | 215 +++++++++
 .../camel/component/aws2/iam/IAM2Constants.java    |  38 ++
 .../camel/component/aws2/iam/IAM2Operations.java   |  26 +-
 .../camel/component/aws2/iam/IAM2Producer.java     | 516 +++++++++++++++++++++
 .../component/aws2/iam/AmazonIAMClientMock.java    | 222 +++++++++
 .../camel/component/aws2/iam/IAMProducerTest.java  | 394 ++++++++++++++++
 .../endpoint/dsl/IAM2EndpointBuilderFactory.java   | 193 ++++++++
 9 files changed, 1641 insertions(+), 7 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-iam.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-iam.json
index c1d3d6027367..2f837b11dace 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-iam.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-iam.json
@@ -27,7 +27,7 @@
     "configuration": { "index": 0, "kind": "property", "displayName": 
"Configuration", "group": "producer", "label": "", "required": false, "type": 
"object", "javaType": "org.apache.camel.component.aws2.iam.IAM2Configuration", 
"deprecated": false, "autowired": false, "secret": false, "description": 
"Component configuration" },
     "iamClient": { "index": 1, "kind": "property", "displayName": "Iam 
Client", "group": "producer", "label": "", "required": false, "type": "object", 
"javaType": "software.amazon.awssdk.services.iam.IamClient", "deprecated": 
false, "deprecationNote": "", "autowired": true, "secret": false, 
"configurationClass": "org.apache.camel.component.aws2.iam.IAM2Configuration", 
"configurationField": "configuration", "description": "To use an existing 
configured AWS IAM client" },
     "lazyStartProducer": { "index": 2, "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": 3, "kind": "property", "displayName": "Operation", 
"group": "producer", "label": "", "required": false, "type": "enum", 
"javaType": "org.apache.camel.component.aws2.iam.IAM2Operations", "enum": [ 
"listAccessKeys", "createUser", "deleteUser", "getUser", "listUsers", 
"createAccessKey", "deleteAccessKey", "updateAccessKey", "createGroup", 
"deleteGroup", "listGroups", "addUserToGroup", "removeUserFromGroup" ], 
"deprecated": false, "autowired": false, "secret": fal [...]
+    "operation": { "index": 3, "kind": "property", "displayName": "Operation", 
"group": "producer", "label": "", "required": false, "type": "enum", 
"javaType": "org.apache.camel.component.aws2.iam.IAM2Operations", "enum": [ 
"listAccessKeys", "createUser", "deleteUser", "getUser", "listUsers", 
"createAccessKey", "deleteAccessKey", "updateAccessKey", "createGroup", 
"deleteGroup", "listGroups", "addUserToGroup", "removeUserFromGroup", 
"createRole", "deleteRole", "getRole", "listRoles", "cre [...]
     "overrideEndpoint": { "index": 4, "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.iam.IAM2Configuration", "configurationField": 
"configuration", "description": "Set the need for overriding the endpoint. This 
option needs to be used in combination wi [...]
     "pojoRequest": { "index": 5, "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.iam.IAM2Configuration", "configurationField": 
"configuration", "description": "If we want to use a POJO request as body or 
not" },
     "region": { "index": 6, "kind": "property", "displayName": "Region", 
"group": "producer", "label": "", "required": false, "type": "enum", 
"javaType": "java.lang.String", "enum": [ "ap-south-2", "ap-south-1", 
"eu-south-1", "eu-south-2", "us-gov-east-1", "me-central-1", "il-central-1", 
"ca-central-1", "eu-central-1", "us-iso-west-1", "eu-central-2", "us-west-1", 
"us-west-2", "af-south-1", "eu-north-1", "eu-west-3", "eu-west-2", "eu-west-1", 
"ap-northeast-3", "ap-northeast-2", "ap-north [...]
@@ -61,12 +61,28 @@
     "CamelAwsIAMUserArn": { "index": 10, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ARN of the created or retrieved user", 
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#USER_ARN" },
     "CamelAwsIAMUserId": { "index": 11, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ID of the created or retrieved user", 
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#USER_ID" },
     "CamelAwsIAMGroupArn": { "index": 12, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ARN of the created or retrieved group", 
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#GROUP_ARN" },
-    "CamelAwsIAMGroupId": { "index": 13, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ID of the created or retrieved group", 
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#GROUP_ID" }
+    "CamelAwsIAMGroupId": { "index": 13, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ID of the created or retrieved group", 
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#GROUP_ID" },
+    "CamelAwsIAMRoleName": { "index": 14, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The name of an AWS IAM Role", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#ROLE_NAME" },
+    "CamelAwsIAMRolePath": { "index": 15, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The path of an AWS IAM Role", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#ROLE_PATH" },
+    "CamelAwsIAMAssumeRolePolicyDocument": { "index": 16, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The assume role policy document for the 
role", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#ASSUME_ROLE_POLICY_DOCUMENT" 
},
+    "CamelAwsIAMRoleArn": { "index": 17, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ARN of the created or retrieved role", 
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#ROLE_ARN" },
+    "CamelAwsIAMRoleId": { "index": 18, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ID of the created or retrieved role", 
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#ROLE_ID" },
+    "CamelAwsIAMRoleDescription": { "index": 19, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The description of an AWS IAM Role", 
"constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#ROLE_DESCRIPTION" },
+    "CamelAwsIAMPolicyName": { "index": 20, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The name of an AWS IAM Policy", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_NAME" },
+    "CamelAwsIAMPolicyPath": { "index": 21, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The path of an AWS IAM Policy", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_PATH" },
+    "CamelAwsIAMPolicyDocument": { "index": 22, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The policy document", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_DOCUMENT" },
+    "CamelAwsIAMPolicyArn": { "index": 23, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ARN of an AWS IAM Policy", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_ARN" },
+    "CamelAwsIAMPolicyId": { "index": 24, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ID of an AWS IAM Policy", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_ID" },
+    "CamelAwsIAMPolicyDescription": { "index": 25, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The description of an AWS IAM Policy", 
"constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_DESCRIPTION" },
+    "CamelAwsIAMInstanceProfileName": { "index": 26, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The name of an AWS IAM Instance 
Profile", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#INSTANCE_PROFILE_NAME" },
+    "CamelAwsIAMInstanceProfilePath": { "index": 27, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The path of an AWS IAM Instance 
Profile", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#INSTANCE_PROFILE_PATH" },
+    "CamelAwsIAMInstanceProfileArn": { "index": 28, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The ARN of an AWS IAM Instance 
Profile", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#INSTANCE_PROFILE_ARN" },
+    "CamelAwsIAMInstanceProfileId": { "index": 29, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The ID of an AWS IAM Instance Profile", 
"constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#INSTANCE_PROFILE_ID" }
   },
   "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.iam.IAM2Configuration", "configurationField": 
"configuration", "description": "Logical name" },
     "iamClient": { "index": 1, "kind": "parameter", "displayName": "Iam 
Client", "group": "producer", "label": "", "required": false, "type": "object", 
"javaType": "software.amazon.awssdk.services.iam.IamClient", "deprecated": 
false, "deprecationNote": "", "autowired": true, "secret": false, 
"configurationClass": "org.apache.camel.component.aws2.iam.IAM2Configuration", 
"configurationField": "configuration", "description": "To use an existing 
configured AWS IAM client" },
-    "operation": { "index": 2, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": false, "type": 
"enum", "javaType": "org.apache.camel.component.aws2.iam.IAM2Operations", 
"enum": [ "listAccessKeys", "createUser", "deleteUser", "getUser", "listUsers", 
"createAccessKey", "deleteAccessKey", "updateAccessKey", "createGroup", 
"deleteGroup", "listGroups", "addUserToGroup", "removeUserFromGroup" ], 
"deprecated": false, "autowired": false, "secret": fa [...]
+    "operation": { "index": 2, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": false, "type": 
"enum", "javaType": "org.apache.camel.component.aws2.iam.IAM2Operations", 
"enum": [ "listAccessKeys", "createUser", "deleteUser", "getUser", "listUsers", 
"createAccessKey", "deleteAccessKey", "updateAccessKey", "createGroup", 
"deleteGroup", "listGroups", "addUserToGroup", "removeUserFromGroup", 
"createRole", "deleteRole", "getRole", "listRoles", "cr [...]
     "overrideEndpoint": { "index": 3, "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.iam.IAM2Configuration", "configurationField": 
"configuration", "description": "Set the need for overriding the endpoint. This 
option needs to be used in combination w [...]
     "pojoRequest": { "index": 4, "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.iam.IAM2Configuration", "configurationField": 
"configuration", "description": "If we want to use a POJO request as body or 
not" },
     "region": { "index": 5, "kind": "parameter", "displayName": "Region", 
"group": "producer", "label": "", "required": false, "type": "enum", 
"javaType": "java.lang.String", "enum": [ "ap-south-2", "ap-south-1", 
"eu-south-1", "eu-south-2", "us-gov-east-1", "me-central-1", "il-central-1", 
"ca-central-1", "eu-central-1", "us-iso-west-1", "eu-central-2", "us-west-1", 
"us-west-2", "af-south-1", "eu-north-1", "eu-west-3", "eu-west-2", "eu-west-1", 
"ap-northeast-3", "ap-northeast-2", "ap-nort [...]
diff --git 
a/components/camel-aws/camel-aws2-iam/src/generated/resources/META-INF/org/apache/camel/component/aws2/iam/aws2-iam.json
 
b/components/camel-aws/camel-aws2-iam/src/generated/resources/META-INF/org/apache/camel/component/aws2/iam/aws2-iam.json
index c1d3d6027367..2f837b11dace 100644
--- 
a/components/camel-aws/camel-aws2-iam/src/generated/resources/META-INF/org/apache/camel/component/aws2/iam/aws2-iam.json
+++ 
b/components/camel-aws/camel-aws2-iam/src/generated/resources/META-INF/org/apache/camel/component/aws2/iam/aws2-iam.json
@@ -27,7 +27,7 @@
     "configuration": { "index": 0, "kind": "property", "displayName": 
"Configuration", "group": "producer", "label": "", "required": false, "type": 
"object", "javaType": "org.apache.camel.component.aws2.iam.IAM2Configuration", 
"deprecated": false, "autowired": false, "secret": false, "description": 
"Component configuration" },
     "iamClient": { "index": 1, "kind": "property", "displayName": "Iam 
Client", "group": "producer", "label": "", "required": false, "type": "object", 
"javaType": "software.amazon.awssdk.services.iam.IamClient", "deprecated": 
false, "deprecationNote": "", "autowired": true, "secret": false, 
"configurationClass": "org.apache.camel.component.aws2.iam.IAM2Configuration", 
"configurationField": "configuration", "description": "To use an existing 
configured AWS IAM client" },
     "lazyStartProducer": { "index": 2, "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": 3, "kind": "property", "displayName": "Operation", 
"group": "producer", "label": "", "required": false, "type": "enum", 
"javaType": "org.apache.camel.component.aws2.iam.IAM2Operations", "enum": [ 
"listAccessKeys", "createUser", "deleteUser", "getUser", "listUsers", 
"createAccessKey", "deleteAccessKey", "updateAccessKey", "createGroup", 
"deleteGroup", "listGroups", "addUserToGroup", "removeUserFromGroup" ], 
"deprecated": false, "autowired": false, "secret": fal [...]
+    "operation": { "index": 3, "kind": "property", "displayName": "Operation", 
"group": "producer", "label": "", "required": false, "type": "enum", 
"javaType": "org.apache.camel.component.aws2.iam.IAM2Operations", "enum": [ 
"listAccessKeys", "createUser", "deleteUser", "getUser", "listUsers", 
"createAccessKey", "deleteAccessKey", "updateAccessKey", "createGroup", 
"deleteGroup", "listGroups", "addUserToGroup", "removeUserFromGroup", 
"createRole", "deleteRole", "getRole", "listRoles", "cre [...]
     "overrideEndpoint": { "index": 4, "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.iam.IAM2Configuration", "configurationField": 
"configuration", "description": "Set the need for overriding the endpoint. This 
option needs to be used in combination wi [...]
     "pojoRequest": { "index": 5, "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.iam.IAM2Configuration", "configurationField": 
"configuration", "description": "If we want to use a POJO request as body or 
not" },
     "region": { "index": 6, "kind": "property", "displayName": "Region", 
"group": "producer", "label": "", "required": false, "type": "enum", 
"javaType": "java.lang.String", "enum": [ "ap-south-2", "ap-south-1", 
"eu-south-1", "eu-south-2", "us-gov-east-1", "me-central-1", "il-central-1", 
"ca-central-1", "eu-central-1", "us-iso-west-1", "eu-central-2", "us-west-1", 
"us-west-2", "af-south-1", "eu-north-1", "eu-west-3", "eu-west-2", "eu-west-1", 
"ap-northeast-3", "ap-northeast-2", "ap-north [...]
@@ -61,12 +61,28 @@
     "CamelAwsIAMUserArn": { "index": 10, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ARN of the created or retrieved user", 
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#USER_ARN" },
     "CamelAwsIAMUserId": { "index": 11, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ID of the created or retrieved user", 
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#USER_ID" },
     "CamelAwsIAMGroupArn": { "index": 12, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ARN of the created or retrieved group", 
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#GROUP_ARN" },
-    "CamelAwsIAMGroupId": { "index": 13, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ID of the created or retrieved group", 
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#GROUP_ID" }
+    "CamelAwsIAMGroupId": { "index": 13, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ID of the created or retrieved group", 
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#GROUP_ID" },
+    "CamelAwsIAMRoleName": { "index": 14, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The name of an AWS IAM Role", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#ROLE_NAME" },
+    "CamelAwsIAMRolePath": { "index": 15, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The path of an AWS IAM Role", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#ROLE_PATH" },
+    "CamelAwsIAMAssumeRolePolicyDocument": { "index": 16, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The assume role policy document for the 
role", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#ASSUME_ROLE_POLICY_DOCUMENT" 
},
+    "CamelAwsIAMRoleArn": { "index": 17, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ARN of the created or retrieved role", 
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#ROLE_ARN" },
+    "CamelAwsIAMRoleId": { "index": 18, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ID of the created or retrieved role", 
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#ROLE_ID" },
+    "CamelAwsIAMRoleDescription": { "index": 19, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The description of an AWS IAM Role", 
"constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#ROLE_DESCRIPTION" },
+    "CamelAwsIAMPolicyName": { "index": 20, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The name of an AWS IAM Policy", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_NAME" },
+    "CamelAwsIAMPolicyPath": { "index": 21, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The path of an AWS IAM Policy", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_PATH" },
+    "CamelAwsIAMPolicyDocument": { "index": 22, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The policy document", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_DOCUMENT" },
+    "CamelAwsIAMPolicyArn": { "index": 23, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ARN of an AWS IAM Policy", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_ARN" },
+    "CamelAwsIAMPolicyId": { "index": 24, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The ID of an AWS IAM Policy", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_ID" },
+    "CamelAwsIAMPolicyDescription": { "index": 25, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The description of an AWS IAM Policy", 
"constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_DESCRIPTION" },
+    "CamelAwsIAMInstanceProfileName": { "index": 26, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The name of an AWS IAM Instance 
Profile", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#INSTANCE_PROFILE_NAME" },
+    "CamelAwsIAMInstanceProfilePath": { "index": 27, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The path of an AWS IAM Instance 
Profile", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#INSTANCE_PROFILE_PATH" },
+    "CamelAwsIAMInstanceProfileArn": { "index": 28, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The ARN of an AWS IAM Instance 
Profile", "constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#INSTANCE_PROFILE_ARN" },
+    "CamelAwsIAMInstanceProfileId": { "index": 29, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The ID of an AWS IAM Instance Profile", 
"constantName": 
"org.apache.camel.component.aws2.iam.IAM2Constants#INSTANCE_PROFILE_ID" }
   },
   "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.iam.IAM2Configuration", "configurationField": 
"configuration", "description": "Logical name" },
     "iamClient": { "index": 1, "kind": "parameter", "displayName": "Iam 
Client", "group": "producer", "label": "", "required": false, "type": "object", 
"javaType": "software.amazon.awssdk.services.iam.IamClient", "deprecated": 
false, "deprecationNote": "", "autowired": true, "secret": false, 
"configurationClass": "org.apache.camel.component.aws2.iam.IAM2Configuration", 
"configurationField": "configuration", "description": "To use an existing 
configured AWS IAM client" },
-    "operation": { "index": 2, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": false, "type": 
"enum", "javaType": "org.apache.camel.component.aws2.iam.IAM2Operations", 
"enum": [ "listAccessKeys", "createUser", "deleteUser", "getUser", "listUsers", 
"createAccessKey", "deleteAccessKey", "updateAccessKey", "createGroup", 
"deleteGroup", "listGroups", "addUserToGroup", "removeUserFromGroup" ], 
"deprecated": false, "autowired": false, "secret": fa [...]
+    "operation": { "index": 2, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": false, "type": 
"enum", "javaType": "org.apache.camel.component.aws2.iam.IAM2Operations", 
"enum": [ "listAccessKeys", "createUser", "deleteUser", "getUser", "listUsers", 
"createAccessKey", "deleteAccessKey", "updateAccessKey", "createGroup", 
"deleteGroup", "listGroups", "addUserToGroup", "removeUserFromGroup", 
"createRole", "deleteRole", "getRole", "listRoles", "cr [...]
     "overrideEndpoint": { "index": 3, "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.iam.IAM2Configuration", "configurationField": 
"configuration", "description": "Set the need for overriding the endpoint. This 
option needs to be used in combination w [...]
     "pojoRequest": { "index": 4, "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.iam.IAM2Configuration", "configurationField": 
"configuration", "description": "If we want to use a POJO request as body or 
not" },
     "region": { "index": 5, "kind": "parameter", "displayName": "Region", 
"group": "producer", "label": "", "required": false, "type": "enum", 
"javaType": "java.lang.String", "enum": [ "ap-south-2", "ap-south-1", 
"eu-south-1", "eu-south-2", "us-gov-east-1", "me-central-1", "il-central-1", 
"ca-central-1", "eu-central-1", "us-iso-west-1", "eu-central-2", "us-west-1", 
"us-west-2", "af-south-1", "eu-north-1", "eu-west-3", "eu-west-2", "eu-west-1", 
"ap-northeast-3", "ap-northeast-2", "ap-nort [...]
diff --git 
a/components/camel-aws/camel-aws2-iam/src/main/docs/aws2-iam-component.adoc 
b/components/camel-aws/camel-aws2-iam/src/main/docs/aws2-iam-component.adoc
index 98023eefa54d..5c0e173f3f49 100644
--- a/components/camel-aws/camel-aws2-iam/src/main/docs/aws2-iam-component.adoc
+++ b/components/camel-aws/camel-aws2-iam/src/main/docs/aws2-iam-component.adoc
@@ -92,6 +92,26 @@ Camel-AWS2 IAM component provides the following operation on 
the producer side:
 - listGroups
 - addUserToGroup
 - removeUserFromGroup
+- createRole
+- deleteRole
+- getRole
+- listRoles
+- createPolicy
+- deletePolicy
+- getPolicy
+- listPolicies
+- attachUserPolicy
+- detachUserPolicy
+- attachGroupPolicy
+- detachGroupPolicy
+- attachRolePolicy
+- detachRolePolicy
+- createInstanceProfile
+- deleteInstanceProfile
+- getInstanceProfile
+- listInstanceProfiles
+- addRoleToInstanceProfile
+- removeRoleFromInstanceProfile
 
 == Examples
 
@@ -149,6 +169,201 @@ from("direct:listUsers")
     .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=listGroups")
 
--------------------------------------------------------------------------------
 
+==== Role Operations
+
+- createRole: this operation will create a role in IAM
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:createRole")
+    .setHeader(IAM2Constants.ROLE_NAME, constant("myRole"))
+    .setHeader(IAM2Constants.ASSUME_ROLE_POLICY_DOCUMENT, constant("{...}"))
+    .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=createRole")
+--------------------------------------------------------------------------------
+
+- deleteRole: this operation will delete a role in IAM
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:deleteRole")
+    .setHeader(IAM2Constants.ROLE_NAME, constant("myRole"))
+    .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=deleteRole")
+--------------------------------------------------------------------------------
+
+- getRole: this operation will get a role in IAM
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:getRole")
+    .setHeader(IAM2Constants.ROLE_NAME, constant("myRole"))
+    .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=getRole")
+--------------------------------------------------------------------------------
+
+- listRoles: this operation will list the roles in IAM
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:listRoles")
+    .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=listRoles")
+--------------------------------------------------------------------------------
+
+==== Policy Operations
+
+- createPolicy: this operation will create a policy in IAM
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:createPolicy")
+    .setHeader(IAM2Constants.POLICY_NAME, constant("myPolicy"))
+    .setHeader(IAM2Constants.POLICY_DOCUMENT, constant("{...}"))
+    .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=createPolicy")
+--------------------------------------------------------------------------------
+
+- deletePolicy: this operation will delete a policy in IAM
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:deletePolicy")
+    .setHeader(IAM2Constants.POLICY_ARN, 
constant("arn:aws:iam::123456789012:policy/myPolicy"))
+    .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=deletePolicy")
+--------------------------------------------------------------------------------
+
+- getPolicy: this operation will get a policy in IAM
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:getPolicy")
+    .setHeader(IAM2Constants.POLICY_ARN, 
constant("arn:aws:iam::123456789012:policy/myPolicy"))
+    .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=getPolicy")
+--------------------------------------------------------------------------------
+
+- listPolicies: this operation will list the policies in IAM
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:listPolicies")
+    .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=listPolicies")
+--------------------------------------------------------------------------------
+
+==== Policy Attachment Operations
+
+- attachUserPolicy: this operation will attach a policy to a user
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:attachUserPolicy")
+    .setHeader(IAM2Constants.USERNAME, constant("camel"))
+    .setHeader(IAM2Constants.POLICY_ARN, 
constant("arn:aws:iam::123456789012:policy/myPolicy"))
+    
.to("aws2-iam://test?iamClient=#amazonIAMClient&operation=attachUserPolicy")
+--------------------------------------------------------------------------------
+
+- detachUserPolicy: this operation will detach a policy from a user
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:detachUserPolicy")
+    .setHeader(IAM2Constants.USERNAME, constant("camel"))
+    .setHeader(IAM2Constants.POLICY_ARN, 
constant("arn:aws:iam::123456789012:policy/myPolicy"))
+    
.to("aws2-iam://test?iamClient=#amazonIAMClient&operation=detachUserPolicy")
+--------------------------------------------------------------------------------
+
+- attachGroupPolicy: this operation will attach a policy to a group
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:attachGroupPolicy")
+    .setHeader(IAM2Constants.GROUP_NAME, constant("myGroup"))
+    .setHeader(IAM2Constants.POLICY_ARN, 
constant("arn:aws:iam::123456789012:policy/myPolicy"))
+    
.to("aws2-iam://test?iamClient=#amazonIAMClient&operation=attachGroupPolicy")
+--------------------------------------------------------------------------------
+
+- detachGroupPolicy: this operation will detach a policy from a group
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:detachGroupPolicy")
+    .setHeader(IAM2Constants.GROUP_NAME, constant("myGroup"))
+    .setHeader(IAM2Constants.POLICY_ARN, 
constant("arn:aws:iam::123456789012:policy/myPolicy"))
+    
.to("aws2-iam://test?iamClient=#amazonIAMClient&operation=detachGroupPolicy")
+--------------------------------------------------------------------------------
+
+- attachRolePolicy: this operation will attach a policy to a role
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:attachRolePolicy")
+    .setHeader(IAM2Constants.ROLE_NAME, constant("myRole"))
+    .setHeader(IAM2Constants.POLICY_ARN, 
constant("arn:aws:iam::123456789012:policy/myPolicy"))
+    
.to("aws2-iam://test?iamClient=#amazonIAMClient&operation=attachRolePolicy")
+--------------------------------------------------------------------------------
+
+- detachRolePolicy: this operation will detach a policy from a role
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:detachRolePolicy")
+    .setHeader(IAM2Constants.ROLE_NAME, constant("myRole"))
+    .setHeader(IAM2Constants.POLICY_ARN, 
constant("arn:aws:iam::123456789012:policy/myPolicy"))
+    
.to("aws2-iam://test?iamClient=#amazonIAMClient&operation=detachRolePolicy")
+--------------------------------------------------------------------------------
+
+==== Instance Profile Operations
+
+- createInstanceProfile: this operation will create an instance profile in IAM
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:createInstanceProfile")
+    .setHeader(IAM2Constants.INSTANCE_PROFILE_NAME, 
constant("myInstanceProfile"))
+    
.to("aws2-iam://test?iamClient=#amazonIAMClient&operation=createInstanceProfile")
+--------------------------------------------------------------------------------
+
+- deleteInstanceProfile: this operation will delete an instance profile in IAM
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:deleteInstanceProfile")
+    .setHeader(IAM2Constants.INSTANCE_PROFILE_NAME, 
constant("myInstanceProfile"))
+    
.to("aws2-iam://test?iamClient=#amazonIAMClient&operation=deleteInstanceProfile")
+--------------------------------------------------------------------------------
+
+- getInstanceProfile: this operation will get an instance profile in IAM
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:getInstanceProfile")
+    .setHeader(IAM2Constants.INSTANCE_PROFILE_NAME, 
constant("myInstanceProfile"))
+    
.to("aws2-iam://test?iamClient=#amazonIAMClient&operation=getInstanceProfile")
+--------------------------------------------------------------------------------
+
+- listInstanceProfiles: this operation will list the instance profiles in IAM
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:listInstanceProfiles")
+    
.to("aws2-iam://test?iamClient=#amazonIAMClient&operation=listInstanceProfiles")
+--------------------------------------------------------------------------------
+
+- addRoleToInstanceProfile: this operation will add a role to an instance 
profile
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:addRoleToInstanceProfile")
+    .setHeader(IAM2Constants.INSTANCE_PROFILE_NAME, 
constant("myInstanceProfile"))
+    .setHeader(IAM2Constants.ROLE_NAME, constant("myRole"))
+    
.to("aws2-iam://test?iamClient=#amazonIAMClient&operation=addRoleToInstanceProfile")
+--------------------------------------------------------------------------------
+
+- removeRoleFromInstanceProfile: this operation will remove a role from an 
instance profile
+
+[source,java]
+--------------------------------------------------------------------------------
+from("direct:removeRoleFromInstanceProfile")
+    .setHeader(IAM2Constants.INSTANCE_PROFILE_NAME, 
constant("myInstanceProfile"))
+    .setHeader(IAM2Constants.ROLE_NAME, constant("myRole"))
+    
.to("aws2-iam://test?iamClient=#amazonIAMClient&operation=removeRoleFromInstanceProfile")
+--------------------------------------------------------------------------------
+
 === Using a POJO as body
 
 Sometimes building an AWS Request can be complex because of multiple options. 
We introduce the possibility to use a POJO as a body.
diff --git 
a/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Constants.java
 
b/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Constants.java
index 6acc42d5ff41..298ca9026143 100644
--- 
a/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Constants.java
+++ 
b/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Constants.java
@@ -55,4 +55,42 @@ public interface IAM2Constants {
     String GROUP_ARN = "CamelAwsIAMGroupArn";
     @Metadata(description = "The ID of the created or retrieved group", 
javaType = "String")
     String GROUP_ID = "CamelAwsIAMGroupId";
+
+    // Role constants
+    @Metadata(description = "The name of an AWS IAM Role", javaType = "String")
+    String ROLE_NAME = "CamelAwsIAMRoleName";
+    @Metadata(description = "The path of an AWS IAM Role", javaType = "String")
+    String ROLE_PATH = "CamelAwsIAMRolePath";
+    @Metadata(description = "The assume role policy document for the role", 
javaType = "String")
+    String ASSUME_ROLE_POLICY_DOCUMENT = "CamelAwsIAMAssumeRolePolicyDocument";
+    @Metadata(description = "The ARN of the created or retrieved role", 
javaType = "String")
+    String ROLE_ARN = "CamelAwsIAMRoleArn";
+    @Metadata(description = "The ID of the created or retrieved role", 
javaType = "String")
+    String ROLE_ID = "CamelAwsIAMRoleId";
+    @Metadata(description = "The description of an AWS IAM Role", javaType = 
"String")
+    String ROLE_DESCRIPTION = "CamelAwsIAMRoleDescription";
+
+    // Policy constants
+    @Metadata(description = "The name of an AWS IAM Policy", javaType = 
"String")
+    String POLICY_NAME = "CamelAwsIAMPolicyName";
+    @Metadata(description = "The path of an AWS IAM Policy", javaType = 
"String")
+    String POLICY_PATH = "CamelAwsIAMPolicyPath";
+    @Metadata(description = "The policy document", javaType = "String")
+    String POLICY_DOCUMENT = "CamelAwsIAMPolicyDocument";
+    @Metadata(description = "The ARN of an AWS IAM Policy", javaType = 
"String")
+    String POLICY_ARN = "CamelAwsIAMPolicyArn";
+    @Metadata(description = "The ID of an AWS IAM Policy", javaType = "String")
+    String POLICY_ID = "CamelAwsIAMPolicyId";
+    @Metadata(description = "The description of an AWS IAM Policy", javaType = 
"String")
+    String POLICY_DESCRIPTION = "CamelAwsIAMPolicyDescription";
+
+    // Instance profile constants
+    @Metadata(description = "The name of an AWS IAM Instance Profile", 
javaType = "String")
+    String INSTANCE_PROFILE_NAME = "CamelAwsIAMInstanceProfileName";
+    @Metadata(description = "The path of an AWS IAM Instance Profile", 
javaType = "String")
+    String INSTANCE_PROFILE_PATH = "CamelAwsIAMInstanceProfilePath";
+    @Metadata(description = "The ARN of an AWS IAM Instance Profile", javaType 
= "String")
+    String INSTANCE_PROFILE_ARN = "CamelAwsIAMInstanceProfileArn";
+    @Metadata(description = "The ID of an AWS IAM Instance Profile", javaType 
= "String")
+    String INSTANCE_PROFILE_ID = "CamelAwsIAMInstanceProfileId";
 }
diff --git 
a/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Operations.java
 
b/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Operations.java
index 048bb0d4ec6d..122dd60ef399 100644
--- 
a/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Operations.java
+++ 
b/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Operations.java
@@ -30,5 +30,29 @@ public enum IAM2Operations {
     deleteGroup,
     listGroups,
     addUserToGroup,
-    removeUserFromGroup
+    removeUserFromGroup,
+    // Role operations
+    createRole,
+    deleteRole,
+    getRole,
+    listRoles,
+    // Policy operations
+    createPolicy,
+    deletePolicy,
+    getPolicy,
+    listPolicies,
+    // Policy attachment operations
+    attachUserPolicy,
+    detachUserPolicy,
+    attachGroupPolicy,
+    detachGroupPolicy,
+    attachRolePolicy,
+    detachRolePolicy,
+    // Instance profile operations
+    createInstanceProfile,
+    deleteInstanceProfile,
+    getInstanceProfile,
+    listInstanceProfiles,
+    addRoleToInstanceProfile,
+    removeRoleFromInstanceProfile
 }
diff --git 
a/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Producer.java
 
b/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Producer.java
index dcebdf013988..70c83b665750 100644
--- 
a/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Producer.java
+++ 
b/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Producer.java
@@ -34,23 +34,52 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import software.amazon.awssdk.awscore.exception.AwsServiceException;
 import software.amazon.awssdk.services.iam.IamClient;
+import 
software.amazon.awssdk.services.iam.model.AddRoleToInstanceProfileRequest;
 import software.amazon.awssdk.services.iam.model.AddUserToGroupRequest;
+import software.amazon.awssdk.services.iam.model.AttachGroupPolicyRequest;
+import software.amazon.awssdk.services.iam.model.AttachRolePolicyRequest;
+import software.amazon.awssdk.services.iam.model.AttachUserPolicyRequest;
 import software.amazon.awssdk.services.iam.model.CreateAccessKeyRequest;
 import software.amazon.awssdk.services.iam.model.CreateGroupRequest;
 import software.amazon.awssdk.services.iam.model.CreateGroupResponse;
+import software.amazon.awssdk.services.iam.model.CreateInstanceProfileRequest;
+import software.amazon.awssdk.services.iam.model.CreateInstanceProfileResponse;
+import software.amazon.awssdk.services.iam.model.CreatePolicyRequest;
+import software.amazon.awssdk.services.iam.model.CreatePolicyResponse;
+import software.amazon.awssdk.services.iam.model.CreateRoleRequest;
+import software.amazon.awssdk.services.iam.model.CreateRoleResponse;
 import software.amazon.awssdk.services.iam.model.CreateUserRequest;
 import software.amazon.awssdk.services.iam.model.CreateUserResponse;
 import software.amazon.awssdk.services.iam.model.DeleteAccessKeyRequest;
 import software.amazon.awssdk.services.iam.model.DeleteGroupRequest;
+import software.amazon.awssdk.services.iam.model.DeleteInstanceProfileRequest;
+import software.amazon.awssdk.services.iam.model.DeletePolicyRequest;
+import software.amazon.awssdk.services.iam.model.DeleteRoleRequest;
 import software.amazon.awssdk.services.iam.model.DeleteUserRequest;
+import software.amazon.awssdk.services.iam.model.DetachGroupPolicyRequest;
+import software.amazon.awssdk.services.iam.model.DetachRolePolicyRequest;
+import software.amazon.awssdk.services.iam.model.DetachUserPolicyRequest;
+import software.amazon.awssdk.services.iam.model.GetInstanceProfileRequest;
+import software.amazon.awssdk.services.iam.model.GetInstanceProfileResponse;
+import software.amazon.awssdk.services.iam.model.GetPolicyRequest;
+import software.amazon.awssdk.services.iam.model.GetPolicyResponse;
+import software.amazon.awssdk.services.iam.model.GetRoleRequest;
+import software.amazon.awssdk.services.iam.model.GetRoleResponse;
 import software.amazon.awssdk.services.iam.model.GetUserRequest;
 import software.amazon.awssdk.services.iam.model.GetUserResponse;
 import software.amazon.awssdk.services.iam.model.ListAccessKeysRequest;
 import software.amazon.awssdk.services.iam.model.ListAccessKeysResponse;
 import software.amazon.awssdk.services.iam.model.ListGroupsRequest;
 import software.amazon.awssdk.services.iam.model.ListGroupsResponse;
+import software.amazon.awssdk.services.iam.model.ListInstanceProfilesRequest;
+import software.amazon.awssdk.services.iam.model.ListInstanceProfilesResponse;
+import software.amazon.awssdk.services.iam.model.ListPoliciesRequest;
+import software.amazon.awssdk.services.iam.model.ListPoliciesResponse;
+import software.amazon.awssdk.services.iam.model.ListRolesRequest;
+import software.amazon.awssdk.services.iam.model.ListRolesResponse;
 import software.amazon.awssdk.services.iam.model.ListUsersRequest;
 import software.amazon.awssdk.services.iam.model.ListUsersResponse;
+import 
software.amazon.awssdk.services.iam.model.RemoveRoleFromInstanceProfileRequest;
 import software.amazon.awssdk.services.iam.model.RemoveUserFromGroupRequest;
 import software.amazon.awssdk.services.iam.model.StatusType;
 import software.amazon.awssdk.services.iam.model.UpdateAccessKeyRequest;
@@ -63,6 +92,12 @@ public class IAM2Producer extends DefaultProducer {
     private static final Logger LOG = 
LoggerFactory.getLogger(IAM2Producer.class);
     public static final String MISSING_GROUP_NAME = "Group Name must be 
specified";
     public static final String MISSING_USER_NAME = "User Name must be 
specified";
+    public static final String MISSING_ROLE_NAME = "Role Name must be 
specified";
+    public static final String MISSING_POLICY_ARN = "Policy ARN must be 
specified";
+    public static final String MISSING_POLICY_NAME = "Policy Name must be 
specified";
+    public static final String MISSING_POLICY_DOCUMENT = "Policy Document must 
be specified";
+    public static final String MISSING_ASSUME_ROLE_POLICY_DOCUMENT = "Assume 
Role Policy Document must be specified";
+    public static final String MISSING_INSTANCE_PROFILE_NAME = "Instance 
Profile Name must be specified";
     private transient String iamProducerToString;
     private HealthCheck producerHealthCheck;
     private WritableHealthCheckRepository healthCheckRepository;
@@ -118,6 +153,70 @@ public class IAM2Producer extends DefaultProducer {
             case removeUserFromGroup:
                 removeUserFromGroup(getEndpoint().getIamClient(), exchange);
                 break;
+            // Role operations
+            case createRole:
+                createRole(getEndpoint().getIamClient(), exchange);
+                break;
+            case deleteRole:
+                deleteRole(getEndpoint().getIamClient(), exchange);
+                break;
+            case getRole:
+                getRole(getEndpoint().getIamClient(), exchange);
+                break;
+            case listRoles:
+                listRoles(getEndpoint().getIamClient(), exchange);
+                break;
+            // Policy operations
+            case createPolicy:
+                createPolicy(getEndpoint().getIamClient(), exchange);
+                break;
+            case deletePolicy:
+                deletePolicy(getEndpoint().getIamClient(), exchange);
+                break;
+            case getPolicy:
+                getPolicy(getEndpoint().getIamClient(), exchange);
+                break;
+            case listPolicies:
+                listPolicies(getEndpoint().getIamClient(), exchange);
+                break;
+            // Policy attachment operations
+            case attachUserPolicy:
+                attachUserPolicy(getEndpoint().getIamClient(), exchange);
+                break;
+            case detachUserPolicy:
+                detachUserPolicy(getEndpoint().getIamClient(), exchange);
+                break;
+            case attachGroupPolicy:
+                attachGroupPolicy(getEndpoint().getIamClient(), exchange);
+                break;
+            case detachGroupPolicy:
+                detachGroupPolicy(getEndpoint().getIamClient(), exchange);
+                break;
+            case attachRolePolicy:
+                attachRolePolicy(getEndpoint().getIamClient(), exchange);
+                break;
+            case detachRolePolicy:
+                detachRolePolicy(getEndpoint().getIamClient(), exchange);
+                break;
+            // Instance profile operations
+            case createInstanceProfile:
+                createInstanceProfile(getEndpoint().getIamClient(), exchange);
+                break;
+            case deleteInstanceProfile:
+                deleteInstanceProfile(getEndpoint().getIamClient(), exchange);
+                break;
+            case getInstanceProfile:
+                getInstanceProfile(getEndpoint().getIamClient(), exchange);
+                break;
+            case listInstanceProfiles:
+                listInstanceProfiles(getEndpoint().getIamClient(), exchange);
+                break;
+            case addRoleToInstanceProfile:
+                addRoleToInstanceProfile(getEndpoint().getIamClient(), 
exchange);
+                break;
+            case removeRoleFromInstanceProfile:
+                removeRoleFromInstanceProfile(getEndpoint().getIamClient(), 
exchange);
+                break;
             default:
                 throw new IllegalArgumentException("Unsupported operation: " + 
operation);
         }
@@ -401,6 +500,423 @@ public class IAM2Producer extends DefaultProducer {
                 "Remove User From Group");
     }
 
+    // Role operations
+
+    private void createRole(IamClient iamClient, Exchange exchange) throws 
InvalidPayloadException {
+        executeOperation(
+                exchange,
+                CreateRoleRequest.class,
+                iamClient::createRole,
+                () -> {
+                    String roleName
+                            = getRequiredHeader(exchange, 
IAM2Constants.ROLE_NAME, String.class, MISSING_ROLE_NAME);
+                    String assumeRolePolicyDocument = 
getRequiredHeader(exchange,
+                            IAM2Constants.ASSUME_ROLE_POLICY_DOCUMENT, 
String.class, MISSING_ASSUME_ROLE_POLICY_DOCUMENT);
+                    CreateRoleRequest.Builder builder = 
CreateRoleRequest.builder()
+                            .roleName(roleName)
+                            
.assumeRolePolicyDocument(assumeRolePolicyDocument);
+                    String rolePath = getOptionalHeader(exchange, 
IAM2Constants.ROLE_PATH, String.class);
+                    if (rolePath != null) {
+                        builder.path(rolePath);
+                    }
+                    String description = getOptionalHeader(exchange, 
IAM2Constants.ROLE_DESCRIPTION, String.class);
+                    if (description != null) {
+                        builder.description(description);
+                    }
+                    return iamClient.createRole(builder.build());
+                },
+                "Create Role",
+                (CreateRoleResponse response, Message message) -> {
+                    if (response.role() != null) {
+                        message.setHeader(IAM2Constants.ROLE_ARN, 
response.role().arn());
+                        message.setHeader(IAM2Constants.ROLE_ID, 
response.role().roleId());
+                    }
+                });
+    }
+
+    private void deleteRole(IamClient iamClient, Exchange exchange) throws 
InvalidPayloadException {
+        executeOperation(
+                exchange,
+                DeleteRoleRequest.class,
+                iamClient::deleteRole,
+                () -> {
+                    String roleName
+                            = getRequiredHeader(exchange, 
IAM2Constants.ROLE_NAME, String.class, MISSING_ROLE_NAME);
+                    return 
iamClient.deleteRole(DeleteRoleRequest.builder().roleName(roleName).build());
+                },
+                "Delete Role");
+    }
+
+    private void getRole(IamClient iamClient, Exchange exchange) throws 
InvalidPayloadException {
+        executeOperation(
+                exchange,
+                GetRoleRequest.class,
+                iamClient::getRole,
+                () -> {
+                    String roleName
+                            = getRequiredHeader(exchange, 
IAM2Constants.ROLE_NAME, String.class, MISSING_ROLE_NAME);
+                    return 
iamClient.getRole(GetRoleRequest.builder().roleName(roleName).build());
+                },
+                "Get Role",
+                (GetRoleResponse response, Message message) -> {
+                    if (response.role() != null) {
+                        message.setHeader(IAM2Constants.ROLE_ARN, 
response.role().arn());
+                        message.setHeader(IAM2Constants.ROLE_ID, 
response.role().roleId());
+                    }
+                });
+    }
+
+    private void listRoles(IamClient iamClient, Exchange exchange) throws 
InvalidPayloadException {
+        executeOperation(
+                exchange,
+                ListRolesRequest.class,
+                iamClient::listRoles,
+                () -> {
+                    ListRolesRequest.Builder builder = 
ListRolesRequest.builder();
+                    String marker = getOptionalHeader(exchange, 
IAM2Constants.MARKER, String.class);
+                    if (marker != null) {
+                        builder.marker(marker);
+                    }
+                    Integer maxItems = getOptionalHeader(exchange, 
IAM2Constants.MAX_ITEMS, Integer.class);
+                    if (maxItems != null) {
+                        builder.maxItems(maxItems);
+                    }
+                    return iamClient.listRoles(builder.build());
+                },
+                "List Roles",
+                (ListRolesResponse response, Message message) -> {
+                    message.setHeader(IAM2Constants.IS_TRUNCATED, 
response.isTruncated());
+                    if (response.marker() != null) {
+                        message.setHeader(IAM2Constants.NEXT_MARKER, 
response.marker());
+                    }
+                });
+    }
+
+    // Policy operations
+
+    private void createPolicy(IamClient iamClient, Exchange exchange) throws 
InvalidPayloadException {
+        executeOperation(
+                exchange,
+                CreatePolicyRequest.class,
+                iamClient::createPolicy,
+                () -> {
+                    String policyName
+                            = getRequiredHeader(exchange, 
IAM2Constants.POLICY_NAME, String.class, MISSING_POLICY_NAME);
+                    String policyDocument
+                            = getRequiredHeader(exchange, 
IAM2Constants.POLICY_DOCUMENT, String.class, MISSING_POLICY_DOCUMENT);
+                    CreatePolicyRequest.Builder builder = 
CreatePolicyRequest.builder()
+                            .policyName(policyName)
+                            .policyDocument(policyDocument);
+                    String policyPath = getOptionalHeader(exchange, 
IAM2Constants.POLICY_PATH, String.class);
+                    if (policyPath != null) {
+                        builder.path(policyPath);
+                    }
+                    String description = getOptionalHeader(exchange, 
IAM2Constants.POLICY_DESCRIPTION, String.class);
+                    if (description != null) {
+                        builder.description(description);
+                    }
+                    return iamClient.createPolicy(builder.build());
+                },
+                "Create Policy",
+                (CreatePolicyResponse response, Message message) -> {
+                    if (response.policy() != null) {
+                        message.setHeader(IAM2Constants.POLICY_ARN, 
response.policy().arn());
+                        message.setHeader(IAM2Constants.POLICY_ID, 
response.policy().policyId());
+                    }
+                });
+    }
+
+    private void deletePolicy(IamClient iamClient, Exchange exchange) throws 
InvalidPayloadException {
+        executeOperation(
+                exchange,
+                DeletePolicyRequest.class,
+                iamClient::deletePolicy,
+                () -> {
+                    String policyArn
+                            = getRequiredHeader(exchange, 
IAM2Constants.POLICY_ARN, String.class, MISSING_POLICY_ARN);
+                    return 
iamClient.deletePolicy(DeletePolicyRequest.builder().policyArn(policyArn).build());
+                },
+                "Delete Policy");
+    }
+
+    private void getPolicy(IamClient iamClient, Exchange exchange) throws 
InvalidPayloadException {
+        executeOperation(
+                exchange,
+                GetPolicyRequest.class,
+                iamClient::getPolicy,
+                () -> {
+                    String policyArn
+                            = getRequiredHeader(exchange, 
IAM2Constants.POLICY_ARN, String.class, MISSING_POLICY_ARN);
+                    return 
iamClient.getPolicy(GetPolicyRequest.builder().policyArn(policyArn).build());
+                },
+                "Get Policy",
+                (GetPolicyResponse response, Message message) -> {
+                    if (response.policy() != null) {
+                        message.setHeader(IAM2Constants.POLICY_ARN, 
response.policy().arn());
+                        message.setHeader(IAM2Constants.POLICY_ID, 
response.policy().policyId());
+                    }
+                });
+    }
+
+    private void listPolicies(IamClient iamClient, Exchange exchange) throws 
InvalidPayloadException {
+        executeOperation(
+                exchange,
+                ListPoliciesRequest.class,
+                iamClient::listPolicies,
+                () -> {
+                    ListPoliciesRequest.Builder builder = 
ListPoliciesRequest.builder();
+                    String marker = getOptionalHeader(exchange, 
IAM2Constants.MARKER, String.class);
+                    if (marker != null) {
+                        builder.marker(marker);
+                    }
+                    Integer maxItems = getOptionalHeader(exchange, 
IAM2Constants.MAX_ITEMS, Integer.class);
+                    if (maxItems != null) {
+                        builder.maxItems(maxItems);
+                    }
+                    return iamClient.listPolicies(builder.build());
+                },
+                "List Policies",
+                (ListPoliciesResponse response, Message message) -> {
+                    message.setHeader(IAM2Constants.IS_TRUNCATED, 
response.isTruncated());
+                    if (response.marker() != null) {
+                        message.setHeader(IAM2Constants.NEXT_MARKER, 
response.marker());
+                    }
+                });
+    }
+
+    // Policy attachment operations
+
+    private void attachUserPolicy(IamClient iamClient, Exchange exchange) 
throws InvalidPayloadException {
+        executeOperation(
+                exchange,
+                AttachUserPolicyRequest.class,
+                iamClient::attachUserPolicy,
+                () -> {
+                    String userName
+                            = getRequiredHeader(exchange, 
IAM2Constants.USERNAME, String.class, MISSING_USER_NAME);
+                    String policyArn
+                            = getRequiredHeader(exchange, 
IAM2Constants.POLICY_ARN, String.class, MISSING_POLICY_ARN);
+                    return 
iamClient.attachUserPolicy(AttachUserPolicyRequest.builder()
+                            .userName(userName)
+                            .policyArn(policyArn)
+                            .build());
+                },
+                "Attach User Policy");
+    }
+
+    private void detachUserPolicy(IamClient iamClient, Exchange exchange) 
throws InvalidPayloadException {
+        executeOperation(
+                exchange,
+                DetachUserPolicyRequest.class,
+                iamClient::detachUserPolicy,
+                () -> {
+                    String userName
+                            = getRequiredHeader(exchange, 
IAM2Constants.USERNAME, String.class, MISSING_USER_NAME);
+                    String policyArn
+                            = getRequiredHeader(exchange, 
IAM2Constants.POLICY_ARN, String.class, MISSING_POLICY_ARN);
+                    return 
iamClient.detachUserPolicy(DetachUserPolicyRequest.builder()
+                            .userName(userName)
+                            .policyArn(policyArn)
+                            .build());
+                },
+                "Detach User Policy");
+    }
+
+    private void attachGroupPolicy(IamClient iamClient, Exchange exchange) 
throws InvalidPayloadException {
+        executeOperation(
+                exchange,
+                AttachGroupPolicyRequest.class,
+                iamClient::attachGroupPolicy,
+                () -> {
+                    String groupName
+                            = getRequiredHeader(exchange, 
IAM2Constants.GROUP_NAME, String.class, MISSING_GROUP_NAME);
+                    String policyArn
+                            = getRequiredHeader(exchange, 
IAM2Constants.POLICY_ARN, String.class, MISSING_POLICY_ARN);
+                    return 
iamClient.attachGroupPolicy(AttachGroupPolicyRequest.builder()
+                            .groupName(groupName)
+                            .policyArn(policyArn)
+                            .build());
+                },
+                "Attach Group Policy");
+    }
+
+    private void detachGroupPolicy(IamClient iamClient, Exchange exchange) 
throws InvalidPayloadException {
+        executeOperation(
+                exchange,
+                DetachGroupPolicyRequest.class,
+                iamClient::detachGroupPolicy,
+                () -> {
+                    String groupName
+                            = getRequiredHeader(exchange, 
IAM2Constants.GROUP_NAME, String.class, MISSING_GROUP_NAME);
+                    String policyArn
+                            = getRequiredHeader(exchange, 
IAM2Constants.POLICY_ARN, String.class, MISSING_POLICY_ARN);
+                    return 
iamClient.detachGroupPolicy(DetachGroupPolicyRequest.builder()
+                            .groupName(groupName)
+                            .policyArn(policyArn)
+                            .build());
+                },
+                "Detach Group Policy");
+    }
+
+    private void attachRolePolicy(IamClient iamClient, Exchange exchange) 
throws InvalidPayloadException {
+        executeOperation(
+                exchange,
+                AttachRolePolicyRequest.class,
+                iamClient::attachRolePolicy,
+                () -> {
+                    String roleName
+                            = getRequiredHeader(exchange, 
IAM2Constants.ROLE_NAME, String.class, MISSING_ROLE_NAME);
+                    String policyArn
+                            = getRequiredHeader(exchange, 
IAM2Constants.POLICY_ARN, String.class, MISSING_POLICY_ARN);
+                    return 
iamClient.attachRolePolicy(AttachRolePolicyRequest.builder()
+                            .roleName(roleName)
+                            .policyArn(policyArn)
+                            .build());
+                },
+                "Attach Role Policy");
+    }
+
+    private void detachRolePolicy(IamClient iamClient, Exchange exchange) 
throws InvalidPayloadException {
+        executeOperation(
+                exchange,
+                DetachRolePolicyRequest.class,
+                iamClient::detachRolePolicy,
+                () -> {
+                    String roleName
+                            = getRequiredHeader(exchange, 
IAM2Constants.ROLE_NAME, String.class, MISSING_ROLE_NAME);
+                    String policyArn
+                            = getRequiredHeader(exchange, 
IAM2Constants.POLICY_ARN, String.class, MISSING_POLICY_ARN);
+                    return 
iamClient.detachRolePolicy(DetachRolePolicyRequest.builder()
+                            .roleName(roleName)
+                            .policyArn(policyArn)
+                            .build());
+                },
+                "Detach Role Policy");
+    }
+
+    // Instance profile operations
+
+    private void createInstanceProfile(IamClient iamClient, Exchange exchange) 
throws InvalidPayloadException {
+        executeOperation(
+                exchange,
+                CreateInstanceProfileRequest.class,
+                iamClient::createInstanceProfile,
+                () -> {
+                    String instanceProfileName = getRequiredHeader(exchange,
+                            IAM2Constants.INSTANCE_PROFILE_NAME, String.class, 
MISSING_INSTANCE_PROFILE_NAME);
+                    CreateInstanceProfileRequest.Builder builder
+                            = 
CreateInstanceProfileRequest.builder().instanceProfileName(instanceProfileName);
+                    String path = getOptionalHeader(exchange, 
IAM2Constants.INSTANCE_PROFILE_PATH, String.class);
+                    if (path != null) {
+                        builder.path(path);
+                    }
+                    return iamClient.createInstanceProfile(builder.build());
+                },
+                "Create Instance Profile",
+                (CreateInstanceProfileResponse response, Message message) -> {
+                    if (response.instanceProfile() != null) {
+                        message.setHeader(IAM2Constants.INSTANCE_PROFILE_ARN, 
response.instanceProfile().arn());
+                        message.setHeader(IAM2Constants.INSTANCE_PROFILE_ID, 
response.instanceProfile().instanceProfileId());
+                    }
+                });
+    }
+
+    private void deleteInstanceProfile(IamClient iamClient, Exchange exchange) 
throws InvalidPayloadException {
+        executeOperation(
+                exchange,
+                DeleteInstanceProfileRequest.class,
+                iamClient::deleteInstanceProfile,
+                () -> {
+                    String instanceProfileName = getRequiredHeader(exchange,
+                            IAM2Constants.INSTANCE_PROFILE_NAME, String.class, 
MISSING_INSTANCE_PROFILE_NAME);
+                    return iamClient.deleteInstanceProfile(
+                            
DeleteInstanceProfileRequest.builder().instanceProfileName(instanceProfileName).build());
+                },
+                "Delete Instance Profile");
+    }
+
+    private void getInstanceProfile(IamClient iamClient, Exchange exchange) 
throws InvalidPayloadException {
+        executeOperation(
+                exchange,
+                GetInstanceProfileRequest.class,
+                iamClient::getInstanceProfile,
+                () -> {
+                    String instanceProfileName = getRequiredHeader(exchange,
+                            IAM2Constants.INSTANCE_PROFILE_NAME, String.class, 
MISSING_INSTANCE_PROFILE_NAME);
+                    return iamClient.getInstanceProfile(
+                            
GetInstanceProfileRequest.builder().instanceProfileName(instanceProfileName).build());
+                },
+                "Get Instance Profile",
+                (GetInstanceProfileResponse response, Message message) -> {
+                    if (response.instanceProfile() != null) {
+                        message.setHeader(IAM2Constants.INSTANCE_PROFILE_ARN, 
response.instanceProfile().arn());
+                        message.setHeader(IAM2Constants.INSTANCE_PROFILE_ID, 
response.instanceProfile().instanceProfileId());
+                    }
+                });
+    }
+
+    private void listInstanceProfiles(IamClient iamClient, Exchange exchange) 
throws InvalidPayloadException {
+        executeOperation(
+                exchange,
+                ListInstanceProfilesRequest.class,
+                iamClient::listInstanceProfiles,
+                () -> {
+                    ListInstanceProfilesRequest.Builder builder = 
ListInstanceProfilesRequest.builder();
+                    String marker = getOptionalHeader(exchange, 
IAM2Constants.MARKER, String.class);
+                    if (marker != null) {
+                        builder.marker(marker);
+                    }
+                    Integer maxItems = getOptionalHeader(exchange, 
IAM2Constants.MAX_ITEMS, Integer.class);
+                    if (maxItems != null) {
+                        builder.maxItems(maxItems);
+                    }
+                    return iamClient.listInstanceProfiles(builder.build());
+                },
+                "List Instance Profiles",
+                (ListInstanceProfilesResponse response, Message message) -> {
+                    message.setHeader(IAM2Constants.IS_TRUNCATED, 
response.isTruncated());
+                    if (response.marker() != null) {
+                        message.setHeader(IAM2Constants.NEXT_MARKER, 
response.marker());
+                    }
+                });
+    }
+
+    private void addRoleToInstanceProfile(IamClient iamClient, Exchange 
exchange) throws InvalidPayloadException {
+        executeOperation(
+                exchange,
+                AddRoleToInstanceProfileRequest.class,
+                iamClient::addRoleToInstanceProfile,
+                () -> {
+                    String instanceProfileName = getRequiredHeader(exchange,
+                            IAM2Constants.INSTANCE_PROFILE_NAME, String.class, 
MISSING_INSTANCE_PROFILE_NAME);
+                    String roleName
+                            = getRequiredHeader(exchange, 
IAM2Constants.ROLE_NAME, String.class, MISSING_ROLE_NAME);
+                    return 
iamClient.addRoleToInstanceProfile(AddRoleToInstanceProfileRequest.builder()
+                            .instanceProfileName(instanceProfileName)
+                            .roleName(roleName)
+                            .build());
+                },
+                "Add Role To Instance Profile");
+    }
+
+    private void removeRoleFromInstanceProfile(IamClient iamClient, Exchange 
exchange) throws InvalidPayloadException {
+        executeOperation(
+                exchange,
+                RemoveRoleFromInstanceProfileRequest.class,
+                iamClient::removeRoleFromInstanceProfile,
+                () -> {
+                    String instanceProfileName = getRequiredHeader(exchange,
+                            IAM2Constants.INSTANCE_PROFILE_NAME, String.class, 
MISSING_INSTANCE_PROFILE_NAME);
+                    String roleName
+                            = getRequiredHeader(exchange, 
IAM2Constants.ROLE_NAME, String.class, MISSING_ROLE_NAME);
+                    return 
iamClient.removeRoleFromInstanceProfile(RemoveRoleFromInstanceProfileRequest.builder()
+                            .instanceProfileName(instanceProfileName)
+                            .roleName(roleName)
+                            .build());
+                },
+                "Remove Role From Instance Profile");
+    }
+
     public static Message getMessageForResponse(final Exchange exchange) {
         return exchange.getMessage();
     }
diff --git 
a/components/camel-aws/camel-aws2-iam/src/test/java/org/apache/camel/component/aws2/iam/AmazonIAMClientMock.java
 
b/components/camel-aws/camel-aws2-iam/src/test/java/org/apache/camel/component/aws2/iam/AmazonIAMClientMock.java
index 9e08029537c2..94e735324829 100644
--- 
a/components/camel-aws/camel-aws2-iam/src/test/java/org/apache/camel/component/aws2/iam/AmazonIAMClientMock.java
+++ 
b/components/camel-aws/camel-aws2-iam/src/test/java/org/apache/camel/component/aws2/iam/AmazonIAMClientMock.java
@@ -26,29 +26,72 @@ import software.amazon.awssdk.services.iam.IamClient;
 import software.amazon.awssdk.services.iam.IamServiceClientConfiguration;
 import software.amazon.awssdk.services.iam.model.AccessKey;
 import software.amazon.awssdk.services.iam.model.AccessKeyMetadata;
+import 
software.amazon.awssdk.services.iam.model.AddRoleToInstanceProfileRequest;
+import 
software.amazon.awssdk.services.iam.model.AddRoleToInstanceProfileResponse;
+import software.amazon.awssdk.services.iam.model.AttachGroupPolicyRequest;
+import software.amazon.awssdk.services.iam.model.AttachGroupPolicyResponse;
+import software.amazon.awssdk.services.iam.model.AttachRolePolicyRequest;
+import software.amazon.awssdk.services.iam.model.AttachRolePolicyResponse;
+import software.amazon.awssdk.services.iam.model.AttachUserPolicyRequest;
+import software.amazon.awssdk.services.iam.model.AttachUserPolicyResponse;
 import software.amazon.awssdk.services.iam.model.CreateAccessKeyRequest;
 import software.amazon.awssdk.services.iam.model.CreateAccessKeyResponse;
 import software.amazon.awssdk.services.iam.model.CreateGroupRequest;
 import software.amazon.awssdk.services.iam.model.CreateGroupResponse;
+import software.amazon.awssdk.services.iam.model.CreateInstanceProfileRequest;
+import software.amazon.awssdk.services.iam.model.CreateInstanceProfileResponse;
+import software.amazon.awssdk.services.iam.model.CreatePolicyRequest;
+import software.amazon.awssdk.services.iam.model.CreatePolicyResponse;
+import software.amazon.awssdk.services.iam.model.CreateRoleRequest;
+import software.amazon.awssdk.services.iam.model.CreateRoleResponse;
 import software.amazon.awssdk.services.iam.model.CreateUserRequest;
 import software.amazon.awssdk.services.iam.model.CreateUserResponse;
 import software.amazon.awssdk.services.iam.model.DeleteAccessKeyRequest;
 import software.amazon.awssdk.services.iam.model.DeleteAccessKeyResponse;
 import software.amazon.awssdk.services.iam.model.DeleteGroupRequest;
 import software.amazon.awssdk.services.iam.model.DeleteGroupResponse;
+import software.amazon.awssdk.services.iam.model.DeleteInstanceProfileRequest;
+import software.amazon.awssdk.services.iam.model.DeleteInstanceProfileResponse;
+import software.amazon.awssdk.services.iam.model.DeletePolicyRequest;
+import software.amazon.awssdk.services.iam.model.DeletePolicyResponse;
+import software.amazon.awssdk.services.iam.model.DeleteRoleRequest;
+import software.amazon.awssdk.services.iam.model.DeleteRoleResponse;
 import software.amazon.awssdk.services.iam.model.DeleteUserRequest;
 import software.amazon.awssdk.services.iam.model.DeleteUserResponse;
+import software.amazon.awssdk.services.iam.model.DetachGroupPolicyRequest;
+import software.amazon.awssdk.services.iam.model.DetachGroupPolicyResponse;
+import software.amazon.awssdk.services.iam.model.DetachRolePolicyRequest;
+import software.amazon.awssdk.services.iam.model.DetachRolePolicyResponse;
+import software.amazon.awssdk.services.iam.model.DetachUserPolicyRequest;
+import software.amazon.awssdk.services.iam.model.DetachUserPolicyResponse;
+import software.amazon.awssdk.services.iam.model.GetInstanceProfileRequest;
+import software.amazon.awssdk.services.iam.model.GetInstanceProfileResponse;
+import software.amazon.awssdk.services.iam.model.GetPolicyRequest;
+import software.amazon.awssdk.services.iam.model.GetPolicyResponse;
+import software.amazon.awssdk.services.iam.model.GetRoleRequest;
+import software.amazon.awssdk.services.iam.model.GetRoleResponse;
 import software.amazon.awssdk.services.iam.model.GetUserRequest;
 import software.amazon.awssdk.services.iam.model.GetUserResponse;
 import software.amazon.awssdk.services.iam.model.Group;
+import software.amazon.awssdk.services.iam.model.InstanceProfile;
 import software.amazon.awssdk.services.iam.model.ListAccessKeysRequest;
 import software.amazon.awssdk.services.iam.model.ListAccessKeysResponse;
 import software.amazon.awssdk.services.iam.model.ListGroupsRequest;
 import software.amazon.awssdk.services.iam.model.ListGroupsResponse;
+import software.amazon.awssdk.services.iam.model.ListInstanceProfilesRequest;
+import software.amazon.awssdk.services.iam.model.ListInstanceProfilesResponse;
+import software.amazon.awssdk.services.iam.model.ListPoliciesRequest;
+import software.amazon.awssdk.services.iam.model.ListPoliciesResponse;
+import software.amazon.awssdk.services.iam.model.ListRolesRequest;
+import software.amazon.awssdk.services.iam.model.ListRolesResponse;
 import software.amazon.awssdk.services.iam.model.ListUsersRequest;
 import software.amazon.awssdk.services.iam.model.ListUsersResponse;
+import software.amazon.awssdk.services.iam.model.Policy;
+import 
software.amazon.awssdk.services.iam.model.RemoveRoleFromInstanceProfileRequest;
+import 
software.amazon.awssdk.services.iam.model.RemoveRoleFromInstanceProfileResponse;
 import software.amazon.awssdk.services.iam.model.RemoveUserFromGroupRequest;
 import software.amazon.awssdk.services.iam.model.RemoveUserFromGroupResponse;
+import software.amazon.awssdk.services.iam.model.Role;
 import software.amazon.awssdk.services.iam.model.StatusType;
 import software.amazon.awssdk.services.iam.model.UpdateAccessKeyRequest;
 import software.amazon.awssdk.services.iam.model.UpdateAccessKeyResponse;
@@ -175,6 +218,185 @@ public class AmazonIAMClientMock implements IamClient {
         return result;
     }
 
+    // Role operations
+
+    @Override
+    public CreateRoleResponse createRole(CreateRoleRequest createRoleRequest) {
+        CreateRoleResponse.Builder result = CreateRoleResponse.builder();
+        Role.Builder role = Role.builder();
+        role.roleName(createRoleRequest.roleName());
+        role.roleId("TestRoleId");
+        role.arn("arn:aws:iam::123456789012:role/" + 
createRoleRequest.roleName());
+        if (createRoleRequest.path() != null) {
+            role.path(createRoleRequest.path());
+        }
+        result.role(role.build());
+        return result.build();
+    }
+
+    @Override
+    public DeleteRoleResponse deleteRole(DeleteRoleRequest deleteRoleRequest) {
+        return DeleteRoleResponse.builder().build();
+    }
+
+    @Override
+    public GetRoleResponse getRole(GetRoleRequest getRoleRequest) {
+        GetRoleResponse.Builder result = GetRoleResponse.builder();
+        Role.Builder role = Role.builder();
+        role.roleName(getRoleRequest.roleName());
+        role.roleId("TestRoleId");
+        role.arn("arn:aws:iam::123456789012:role/" + 
getRoleRequest.roleName());
+        result.role(role.build());
+        return result.build();
+    }
+
+    @Override
+    public ListRolesResponse listRoles(ListRolesRequest listRolesRequest) {
+        Role.Builder role = Role.builder();
+        role.roleId("TestRoleId");
+        role.roleName("TestRole");
+        role.arn("arn:aws:iam::123456789012:role/TestRole");
+        ListRolesResponse.Builder res = ListRolesResponse.builder();
+        res.roles(Collections.singleton(role.build()));
+        res.isTruncated(false);
+        return res.build();
+    }
+
+    // Policy operations
+
+    @Override
+    public CreatePolicyResponse createPolicy(CreatePolicyRequest 
createPolicyRequest) {
+        CreatePolicyResponse.Builder result = CreatePolicyResponse.builder();
+        Policy.Builder policy = Policy.builder();
+        policy.policyName(createPolicyRequest.policyName());
+        policy.policyId("TestPolicyId");
+        policy.arn("arn:aws:iam::123456789012:policy/" + 
createPolicyRequest.policyName());
+        if (createPolicyRequest.path() != null) {
+            policy.path(createPolicyRequest.path());
+        }
+        result.policy(policy.build());
+        return result.build();
+    }
+
+    @Override
+    public DeletePolicyResponse deletePolicy(DeletePolicyRequest 
deletePolicyRequest) {
+        return DeletePolicyResponse.builder().build();
+    }
+
+    @Override
+    public GetPolicyResponse getPolicy(GetPolicyRequest getPolicyRequest) {
+        GetPolicyResponse.Builder result = GetPolicyResponse.builder();
+        Policy.Builder policy = Policy.builder();
+        policy.policyName("TestPolicy");
+        policy.policyId("TestPolicyId");
+        policy.arn(getPolicyRequest.policyArn());
+        result.policy(policy.build());
+        return result.build();
+    }
+
+    @Override
+    public ListPoliciesResponse listPolicies(ListPoliciesRequest 
listPoliciesRequest) {
+        Policy.Builder policy = Policy.builder();
+        policy.policyId("TestPolicyId");
+        policy.policyName("TestPolicy");
+        policy.arn("arn:aws:iam::123456789012:policy/TestPolicy");
+        ListPoliciesResponse.Builder res = ListPoliciesResponse.builder();
+        res.policies(Collections.singleton(policy.build()));
+        res.isTruncated(false);
+        return res.build();
+    }
+
+    // Policy attachment operations
+
+    @Override
+    public AttachUserPolicyResponse attachUserPolicy(AttachUserPolicyRequest 
attachUserPolicyRequest) {
+        return AttachUserPolicyResponse.builder().build();
+    }
+
+    @Override
+    public DetachUserPolicyResponse detachUserPolicy(DetachUserPolicyRequest 
detachUserPolicyRequest) {
+        return DetachUserPolicyResponse.builder().build();
+    }
+
+    @Override
+    public AttachGroupPolicyResponse 
attachGroupPolicy(AttachGroupPolicyRequest attachGroupPolicyRequest) {
+        return AttachGroupPolicyResponse.builder().build();
+    }
+
+    @Override
+    public DetachGroupPolicyResponse 
detachGroupPolicy(DetachGroupPolicyRequest detachGroupPolicyRequest) {
+        return DetachGroupPolicyResponse.builder().build();
+    }
+
+    @Override
+    public AttachRolePolicyResponse attachRolePolicy(AttachRolePolicyRequest 
attachRolePolicyRequest) {
+        return AttachRolePolicyResponse.builder().build();
+    }
+
+    @Override
+    public DetachRolePolicyResponse detachRolePolicy(DetachRolePolicyRequest 
detachRolePolicyRequest) {
+        return DetachRolePolicyResponse.builder().build();
+    }
+
+    // Instance profile operations
+
+    @Override
+    public CreateInstanceProfileResponse 
createInstanceProfile(CreateInstanceProfileRequest 
createInstanceProfileRequest) {
+        CreateInstanceProfileResponse.Builder result = 
CreateInstanceProfileResponse.builder();
+        InstanceProfile.Builder instanceProfile = InstanceProfile.builder();
+        
instanceProfile.instanceProfileName(createInstanceProfileRequest.instanceProfileName());
+        instanceProfile.instanceProfileId("TestInstanceProfileId");
+        instanceProfile.arn("arn:aws:iam::123456789012:instance-profile/" + 
createInstanceProfileRequest.instanceProfileName());
+        if (createInstanceProfileRequest.path() != null) {
+            instanceProfile.path(createInstanceProfileRequest.path());
+        }
+        instanceProfile.createDate(Instant.now());
+        result.instanceProfile(instanceProfile.build());
+        return result.build();
+    }
+
+    @Override
+    public DeleteInstanceProfileResponse 
deleteInstanceProfile(DeleteInstanceProfileRequest 
deleteInstanceProfileRequest) {
+        return DeleteInstanceProfileResponse.builder().build();
+    }
+
+    @Override
+    public GetInstanceProfileResponse 
getInstanceProfile(GetInstanceProfileRequest getInstanceProfileRequest) {
+        GetInstanceProfileResponse.Builder result = 
GetInstanceProfileResponse.builder();
+        InstanceProfile.Builder instanceProfile = InstanceProfile.builder();
+        
instanceProfile.instanceProfileName(getInstanceProfileRequest.instanceProfileName());
+        instanceProfile.instanceProfileId("TestInstanceProfileId");
+        instanceProfile.arn("arn:aws:iam::123456789012:instance-profile/" + 
getInstanceProfileRequest.instanceProfileName());
+        instanceProfile.createDate(Instant.now());
+        result.instanceProfile(instanceProfile.build());
+        return result.build();
+    }
+
+    @Override
+    public ListInstanceProfilesResponse 
listInstanceProfiles(ListInstanceProfilesRequest listInstanceProfilesRequest) {
+        InstanceProfile.Builder instanceProfile = InstanceProfile.builder();
+        instanceProfile.instanceProfileId("TestInstanceProfileId");
+        instanceProfile.instanceProfileName("TestInstanceProfile");
+        
instanceProfile.arn("arn:aws:iam::123456789012:instance-profile/TestInstanceProfile");
+        instanceProfile.createDate(Instant.now());
+        ListInstanceProfilesResponse.Builder res = 
ListInstanceProfilesResponse.builder();
+        res.instanceProfiles(Collections.singleton(instanceProfile.build()));
+        res.isTruncated(false);
+        return res.build();
+    }
+
+    @Override
+    public AddRoleToInstanceProfileResponse addRoleToInstanceProfile(
+            AddRoleToInstanceProfileRequest addRoleToInstanceProfileRequest) {
+        return AddRoleToInstanceProfileResponse.builder().build();
+    }
+
+    @Override
+    public RemoveRoleFromInstanceProfileResponse removeRoleFromInstanceProfile(
+            RemoveRoleFromInstanceProfileRequest 
removeRoleFromInstanceProfileRequest) {
+        return RemoveRoleFromInstanceProfileResponse.builder().build();
+    }
+
     @Override
     public IamServiceClientConfiguration serviceClientConfiguration() {
         return null;
diff --git 
a/components/camel-aws/camel-aws2-iam/src/test/java/org/apache/camel/component/aws2/iam/IAMProducerTest.java
 
b/components/camel-aws/camel-aws2-iam/src/test/java/org/apache/camel/component/aws2/iam/IAMProducerTest.java
index 9cb0c6028003..8d059d0b981f 100644
--- 
a/components/camel-aws/camel-aws2-iam/src/test/java/org/apache/camel/component/aws2/iam/IAMProducerTest.java
+++ 
b/components/camel-aws/camel-aws2-iam/src/test/java/org/apache/camel/component/aws2/iam/IAMProducerTest.java
@@ -24,18 +24,38 @@ 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.iam.model.AddRoleToInstanceProfileResponse;
 import software.amazon.awssdk.services.iam.model.AddUserToGroupResponse;
+import software.amazon.awssdk.services.iam.model.AttachGroupPolicyResponse;
+import software.amazon.awssdk.services.iam.model.AttachRolePolicyResponse;
+import software.amazon.awssdk.services.iam.model.AttachUserPolicyResponse;
 import software.amazon.awssdk.services.iam.model.CreateAccessKeyResponse;
 import software.amazon.awssdk.services.iam.model.CreateGroupResponse;
+import software.amazon.awssdk.services.iam.model.CreateInstanceProfileResponse;
+import software.amazon.awssdk.services.iam.model.CreatePolicyResponse;
+import software.amazon.awssdk.services.iam.model.CreateRoleResponse;
 import software.amazon.awssdk.services.iam.model.CreateUserRequest;
 import software.amazon.awssdk.services.iam.model.CreateUserResponse;
 import software.amazon.awssdk.services.iam.model.DeleteAccessKeyResponse;
 import software.amazon.awssdk.services.iam.model.DeleteGroupResponse;
+import software.amazon.awssdk.services.iam.model.DeleteInstanceProfileResponse;
+import software.amazon.awssdk.services.iam.model.DeletePolicyResponse;
+import software.amazon.awssdk.services.iam.model.DeleteRoleResponse;
 import software.amazon.awssdk.services.iam.model.DeleteUserResponse;
+import software.amazon.awssdk.services.iam.model.DetachGroupPolicyResponse;
+import software.amazon.awssdk.services.iam.model.DetachRolePolicyResponse;
+import software.amazon.awssdk.services.iam.model.DetachUserPolicyResponse;
+import software.amazon.awssdk.services.iam.model.GetInstanceProfileResponse;
+import software.amazon.awssdk.services.iam.model.GetPolicyResponse;
+import software.amazon.awssdk.services.iam.model.GetRoleResponse;
 import software.amazon.awssdk.services.iam.model.GetUserResponse;
 import software.amazon.awssdk.services.iam.model.ListAccessKeysResponse;
 import software.amazon.awssdk.services.iam.model.ListGroupsResponse;
+import software.amazon.awssdk.services.iam.model.ListInstanceProfilesResponse;
+import software.amazon.awssdk.services.iam.model.ListPoliciesResponse;
+import software.amazon.awssdk.services.iam.model.ListRolesResponse;
 import software.amazon.awssdk.services.iam.model.ListUsersResponse;
+import 
software.amazon.awssdk.services.iam.model.RemoveRoleFromInstanceProfileResponse;
 import software.amazon.awssdk.services.iam.model.RemoveUserFromGroupResponse;
 import software.amazon.awssdk.services.iam.model.StatusType;
 import software.amazon.awssdk.services.iam.model.UpdateAccessKeyResponse;
@@ -308,6 +328,335 @@ public class IAMProducerTest extends CamelTestSupport {
         assertNotNull(resultGet);
     }
 
+    // Role operations tests
+
+    @Test
+    public void iamCreateRoleTest() throws Exception {
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:createRole", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(IAM2Constants.OPERATION, 
IAM2Operations.createRole);
+                exchange.getIn().setHeader(IAM2Constants.ROLE_NAME, 
"TestRole");
+                
exchange.getIn().setHeader(IAM2Constants.ASSUME_ROLE_POLICY_DOCUMENT,
+                        "{\"Version\":\"2012-10-17\",\"Statement\":[]}");
+            }
+        });
+        MockEndpoint.assertIsSatisfied(context);
+        CreateRoleResponse resultGet = (CreateRoleResponse) 
exchange.getIn().getBody();
+        assertNotNull(resultGet);
+        assertEquals("TestRole", resultGet.role().roleName());
+    }
+
+    @Test
+    public void iamDeleteRoleTest() throws Exception {
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:deleteRole", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(IAM2Constants.OPERATION, 
IAM2Operations.deleteRole);
+                exchange.getIn().setHeader(IAM2Constants.ROLE_NAME, 
"TestRole");
+            }
+        });
+        MockEndpoint.assertIsSatisfied(context);
+        DeleteRoleResponse resultGet = (DeleteRoleResponse) 
exchange.getIn().getBody();
+        assertNotNull(resultGet);
+    }
+
+    @Test
+    public void iamGetRoleTest() throws Exception {
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:getRole", new Processor() 
{
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(IAM2Constants.OPERATION, 
IAM2Operations.getRole);
+                exchange.getIn().setHeader(IAM2Constants.ROLE_NAME, 
"TestRole");
+            }
+        });
+        MockEndpoint.assertIsSatisfied(context);
+        GetRoleResponse resultGet = (GetRoleResponse) 
exchange.getIn().getBody();
+        assertNotNull(resultGet);
+        assertEquals("TestRole", resultGet.role().roleName());
+    }
+
+    @Test
+    public void iamListRolesTest() throws Exception {
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:listRoles", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(IAM2Constants.OPERATION, 
IAM2Operations.listRoles);
+            }
+        });
+        MockEndpoint.assertIsSatisfied(context);
+        ListRolesResponse resultGet = (ListRolesResponse) 
exchange.getIn().getBody();
+        assertNotNull(resultGet);
+        assertEquals(1, resultGet.roles().size());
+        assertEquals("TestRole", resultGet.roles().get(0).roleName());
+    }
+
+    // Policy operations tests
+
+    @Test
+    public void iamCreatePolicyTest() throws Exception {
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:createPolicy", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(IAM2Constants.OPERATION, 
IAM2Operations.createPolicy);
+                exchange.getIn().setHeader(IAM2Constants.POLICY_NAME, 
"TestPolicy");
+                exchange.getIn().setHeader(IAM2Constants.POLICY_DOCUMENT,
+                        "{\"Version\":\"2012-10-17\",\"Statement\":[]}");
+            }
+        });
+        MockEndpoint.assertIsSatisfied(context);
+        CreatePolicyResponse resultGet = (CreatePolicyResponse) 
exchange.getIn().getBody();
+        assertNotNull(resultGet);
+        assertEquals("TestPolicy", resultGet.policy().policyName());
+    }
+
+    @Test
+    public void iamDeletePolicyTest() throws Exception {
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:deletePolicy", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(IAM2Constants.OPERATION, 
IAM2Operations.deletePolicy);
+                exchange.getIn().setHeader(IAM2Constants.POLICY_ARN, 
"arn:aws:iam::123456789012:policy/TestPolicy");
+            }
+        });
+        MockEndpoint.assertIsSatisfied(context);
+        DeletePolicyResponse resultGet = (DeletePolicyResponse) 
exchange.getIn().getBody();
+        assertNotNull(resultGet);
+    }
+
+    @Test
+    public void iamGetPolicyTest() throws Exception {
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:getPolicy", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(IAM2Constants.OPERATION, 
IAM2Operations.getPolicy);
+                exchange.getIn().setHeader(IAM2Constants.POLICY_ARN, 
"arn:aws:iam::123456789012:policy/TestPolicy");
+            }
+        });
+        MockEndpoint.assertIsSatisfied(context);
+        GetPolicyResponse resultGet = (GetPolicyResponse) 
exchange.getIn().getBody();
+        assertNotNull(resultGet);
+        assertEquals("TestPolicy", resultGet.policy().policyName());
+    }
+
+    @Test
+    public void iamListPoliciesTest() throws Exception {
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:listPolicies", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(IAM2Constants.OPERATION, 
IAM2Operations.listPolicies);
+            }
+        });
+        MockEndpoint.assertIsSatisfied(context);
+        ListPoliciesResponse resultGet = (ListPoliciesResponse) 
exchange.getIn().getBody();
+        assertNotNull(resultGet);
+        assertEquals(1, resultGet.policies().size());
+        assertEquals("TestPolicy", resultGet.policies().get(0).policyName());
+    }
+
+    // Policy attachment operations tests
+
+    @Test
+    public void iamAttachUserPolicyTest() throws Exception {
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:attachUserPolicy", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(IAM2Constants.OPERATION, 
IAM2Operations.attachUserPolicy);
+                exchange.getIn().setHeader(IAM2Constants.USERNAME, "test");
+                exchange.getIn().setHeader(IAM2Constants.POLICY_ARN, 
"arn:aws:iam::123456789012:policy/TestPolicy");
+            }
+        });
+        MockEndpoint.assertIsSatisfied(context);
+        AttachUserPolicyResponse resultGet = (AttachUserPolicyResponse) 
exchange.getIn().getBody();
+        assertNotNull(resultGet);
+    }
+
+    @Test
+    public void iamDetachUserPolicyTest() throws Exception {
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:detachUserPolicy", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(IAM2Constants.OPERATION, 
IAM2Operations.detachUserPolicy);
+                exchange.getIn().setHeader(IAM2Constants.USERNAME, "test");
+                exchange.getIn().setHeader(IAM2Constants.POLICY_ARN, 
"arn:aws:iam::123456789012:policy/TestPolicy");
+            }
+        });
+        MockEndpoint.assertIsSatisfied(context);
+        DetachUserPolicyResponse resultGet = (DetachUserPolicyResponse) 
exchange.getIn().getBody();
+        assertNotNull(resultGet);
+    }
+
+    @Test
+    public void iamAttachGroupPolicyTest() throws Exception {
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:attachGroupPolicy", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(IAM2Constants.OPERATION, 
IAM2Operations.attachGroupPolicy);
+                exchange.getIn().setHeader(IAM2Constants.GROUP_NAME, "Test");
+                exchange.getIn().setHeader(IAM2Constants.POLICY_ARN, 
"arn:aws:iam::123456789012:policy/TestPolicy");
+            }
+        });
+        MockEndpoint.assertIsSatisfied(context);
+        AttachGroupPolicyResponse resultGet = (AttachGroupPolicyResponse) 
exchange.getIn().getBody();
+        assertNotNull(resultGet);
+    }
+
+    @Test
+    public void iamDetachGroupPolicyTest() throws Exception {
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:detachGroupPolicy", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(IAM2Constants.OPERATION, 
IAM2Operations.detachGroupPolicy);
+                exchange.getIn().setHeader(IAM2Constants.GROUP_NAME, "Test");
+                exchange.getIn().setHeader(IAM2Constants.POLICY_ARN, 
"arn:aws:iam::123456789012:policy/TestPolicy");
+            }
+        });
+        MockEndpoint.assertIsSatisfied(context);
+        DetachGroupPolicyResponse resultGet = (DetachGroupPolicyResponse) 
exchange.getIn().getBody();
+        assertNotNull(resultGet);
+    }
+
+    @Test
+    public void iamAttachRolePolicyTest() throws Exception {
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:attachRolePolicy", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(IAM2Constants.OPERATION, 
IAM2Operations.attachRolePolicy);
+                exchange.getIn().setHeader(IAM2Constants.ROLE_NAME, 
"TestRole");
+                exchange.getIn().setHeader(IAM2Constants.POLICY_ARN, 
"arn:aws:iam::123456789012:policy/TestPolicy");
+            }
+        });
+        MockEndpoint.assertIsSatisfied(context);
+        AttachRolePolicyResponse resultGet = (AttachRolePolicyResponse) 
exchange.getIn().getBody();
+        assertNotNull(resultGet);
+    }
+
+    @Test
+    public void iamDetachRolePolicyTest() throws Exception {
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:detachRolePolicy", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(IAM2Constants.OPERATION, 
IAM2Operations.detachRolePolicy);
+                exchange.getIn().setHeader(IAM2Constants.ROLE_NAME, 
"TestRole");
+                exchange.getIn().setHeader(IAM2Constants.POLICY_ARN, 
"arn:aws:iam::123456789012:policy/TestPolicy");
+            }
+        });
+        MockEndpoint.assertIsSatisfied(context);
+        DetachRolePolicyResponse resultGet = (DetachRolePolicyResponse) 
exchange.getIn().getBody();
+        assertNotNull(resultGet);
+    }
+
+    // Instance profile operations tests
+
+    @Test
+    public void iamCreateInstanceProfileTest() throws Exception {
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:createInstanceProfile", 
new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(IAM2Constants.OPERATION, 
IAM2Operations.createInstanceProfile);
+                
exchange.getIn().setHeader(IAM2Constants.INSTANCE_PROFILE_NAME, 
"TestInstanceProfile");
+            }
+        });
+        MockEndpoint.assertIsSatisfied(context);
+        CreateInstanceProfileResponse resultGet = 
(CreateInstanceProfileResponse) exchange.getIn().getBody();
+        assertNotNull(resultGet);
+        assertEquals("TestInstanceProfile", 
resultGet.instanceProfile().instanceProfileName());
+    }
+
+    @Test
+    public void iamDeleteInstanceProfileTest() throws Exception {
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:deleteInstanceProfile", 
new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(IAM2Constants.OPERATION, 
IAM2Operations.deleteInstanceProfile);
+                
exchange.getIn().setHeader(IAM2Constants.INSTANCE_PROFILE_NAME, 
"TestInstanceProfile");
+            }
+        });
+        MockEndpoint.assertIsSatisfied(context);
+        DeleteInstanceProfileResponse resultGet = 
(DeleteInstanceProfileResponse) exchange.getIn().getBody();
+        assertNotNull(resultGet);
+    }
+
+    @Test
+    public void iamGetInstanceProfileTest() throws Exception {
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:getInstanceProfile", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(IAM2Constants.OPERATION, 
IAM2Operations.getInstanceProfile);
+                
exchange.getIn().setHeader(IAM2Constants.INSTANCE_PROFILE_NAME, 
"TestInstanceProfile");
+            }
+        });
+        MockEndpoint.assertIsSatisfied(context);
+        GetInstanceProfileResponse resultGet = (GetInstanceProfileResponse) 
exchange.getIn().getBody();
+        assertNotNull(resultGet);
+        assertEquals("TestInstanceProfile", 
resultGet.instanceProfile().instanceProfileName());
+    }
+
+    @Test
+    public void iamListInstanceProfilesTest() throws Exception {
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:listInstanceProfiles", 
new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(IAM2Constants.OPERATION, 
IAM2Operations.listInstanceProfiles);
+            }
+        });
+        MockEndpoint.assertIsSatisfied(context);
+        ListInstanceProfilesResponse resultGet = 
(ListInstanceProfilesResponse) exchange.getIn().getBody();
+        assertNotNull(resultGet);
+        assertEquals(1, resultGet.instanceProfiles().size());
+        assertEquals("TestInstanceProfile", 
resultGet.instanceProfiles().get(0).instanceProfileName());
+    }
+
+    @Test
+    public void iamAddRoleToInstanceProfileTest() throws Exception {
+        mock.expectedMessageCount(1);
+        Exchange exchange = 
template.request("direct:addRoleToInstanceProfile", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(IAM2Constants.OPERATION, 
IAM2Operations.addRoleToInstanceProfile);
+                
exchange.getIn().setHeader(IAM2Constants.INSTANCE_PROFILE_NAME, 
"TestInstanceProfile");
+                exchange.getIn().setHeader(IAM2Constants.ROLE_NAME, 
"TestRole");
+            }
+        });
+        MockEndpoint.assertIsSatisfied(context);
+        AddRoleToInstanceProfileResponse resultGet = 
(AddRoleToInstanceProfileResponse) exchange.getIn().getBody();
+        assertNotNull(resultGet);
+    }
+
+    @Test
+    public void iamRemoveRoleFromInstanceProfileTest() throws Exception {
+        mock.expectedMessageCount(1);
+        Exchange exchange = 
template.request("direct:removeRoleFromInstanceProfile", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(IAM2Constants.OPERATION, 
IAM2Operations.removeRoleFromInstanceProfile);
+                
exchange.getIn().setHeader(IAM2Constants.INSTANCE_PROFILE_NAME, 
"TestInstanceProfile");
+                exchange.getIn().setHeader(IAM2Constants.ROLE_NAME, 
"TestRole");
+            }
+        });
+        MockEndpoint.assertIsSatisfied(context);
+        RemoveRoleFromInstanceProfileResponse resultGet = 
(RemoveRoleFromInstanceProfileResponse) exchange.getIn().getBody();
+        assertNotNull(resultGet);
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
@@ -340,6 +689,51 @@ public class IAMProducerTest extends CamelTestSupport {
                         .to("mock:result");
                 from("direct:removeUserFromGroup")
                         
.to("aws2-iam://test?iamClient=#amazonIAMClient&operation=removeUserFromGroup").to("mock:result");
+                // Role operations
+                
from("direct:createRole").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=createRole")
+                        .to("mock:result");
+                
from("direct:deleteRole").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=deleteRole")
+                        .to("mock:result");
+                
from("direct:getRole").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=getRole")
+                        .to("mock:result");
+                
from("direct:listRoles").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=listRoles")
+                        .to("mock:result");
+                // Policy operations
+                
from("direct:createPolicy").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=createPolicy")
+                        .to("mock:result");
+                
from("direct:deletePolicy").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=deletePolicy")
+                        .to("mock:result");
+                
from("direct:getPolicy").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=getPolicy")
+                        .to("mock:result");
+                
from("direct:listPolicies").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=listPolicies")
+                        .to("mock:result");
+                // Policy attachment operations
+                
from("direct:attachUserPolicy").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=attachUserPolicy")
+                        .to("mock:result");
+                
from("direct:detachUserPolicy").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=detachUserPolicy")
+                        .to("mock:result");
+                
from("direct:attachGroupPolicy").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=attachGroupPolicy")
+                        .to("mock:result");
+                
from("direct:detachGroupPolicy").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=detachGroupPolicy")
+                        .to("mock:result");
+                
from("direct:attachRolePolicy").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=attachRolePolicy")
+                        .to("mock:result");
+                
from("direct:detachRolePolicy").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=detachRolePolicy")
+                        .to("mock:result");
+                // Instance profile operations
+                from("direct:createInstanceProfile")
+                        
.to("aws2-iam://test?iamClient=#amazonIAMClient&operation=createInstanceProfile").to("mock:result");
+                from("direct:deleteInstanceProfile")
+                        
.to("aws2-iam://test?iamClient=#amazonIAMClient&operation=deleteInstanceProfile").to("mock:result");
+                from("direct:getInstanceProfile")
+                        
.to("aws2-iam://test?iamClient=#amazonIAMClient&operation=getInstanceProfile").to("mock:result");
+                from("direct:listInstanceProfiles")
+                        
.to("aws2-iam://test?iamClient=#amazonIAMClient&operation=listInstanceProfiles").to("mock:result");
+                from("direct:addRoleToInstanceProfile")
+                        
.to("aws2-iam://test?iamClient=#amazonIAMClient&operation=addRoleToInstanceProfile").to("mock:result");
+                from("direct:removeRoleFromInstanceProfile")
+                        
.to("aws2-iam://test?iamClient=#amazonIAMClient&operation=removeRoleFromInstanceProfile")
+                        .to("mock:result");
             }
         };
     }
diff --git 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/IAM2EndpointBuilderFactory.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/IAM2EndpointBuilderFactory.java
index 6880ada43b72..6b7f0c66554b 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/IAM2EndpointBuilderFactory.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/IAM2EndpointBuilderFactory.java
@@ -763,6 +763,199 @@ public interface IAM2EndpointBuilderFactory {
         public String awsIAMGroupId() {
             return "CamelAwsIAMGroupId";
         }
+        /**
+         * The name of an AWS IAM Role.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsIAMRoleName}.
+         */
+        public String awsIAMRoleName() {
+            return "CamelAwsIAMRoleName";
+        }
+        /**
+         * The path of an AWS IAM Role.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsIAMRolePath}.
+         */
+        public String awsIAMRolePath() {
+            return "CamelAwsIAMRolePath";
+        }
+        /**
+         * The assume role policy document for the role.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code
+         * AwsIAMAssumeRolePolicyDocument}.
+         */
+        public String awsIAMAssumeRolePolicyDocument() {
+            return "CamelAwsIAMAssumeRolePolicyDocument";
+        }
+        /**
+         * The ARN of the created or retrieved role.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsIAMRoleArn}.
+         */
+        public String awsIAMRoleArn() {
+            return "CamelAwsIAMRoleArn";
+        }
+        /**
+         * The ID of the created or retrieved role.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsIAMRoleId}.
+         */
+        public String awsIAMRoleId() {
+            return "CamelAwsIAMRoleId";
+        }
+        /**
+         * The description of an AWS IAM Role.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsIAMRoleDescription}.
+         */
+        public String awsIAMRoleDescription() {
+            return "CamelAwsIAMRoleDescription";
+        }
+        /**
+         * The name of an AWS IAM Policy.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsIAMPolicyName}.
+         */
+        public String awsIAMPolicyName() {
+            return "CamelAwsIAMPolicyName";
+        }
+        /**
+         * The path of an AWS IAM Policy.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsIAMPolicyPath}.
+         */
+        public String awsIAMPolicyPath() {
+            return "CamelAwsIAMPolicyPath";
+        }
+        /**
+         * The policy document.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsIAMPolicyDocument}.
+         */
+        public String awsIAMPolicyDocument() {
+            return "CamelAwsIAMPolicyDocument";
+        }
+        /**
+         * The ARN of an AWS IAM Policy.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsIAMPolicyArn}.
+         */
+        public String awsIAMPolicyArn() {
+            return "CamelAwsIAMPolicyArn";
+        }
+        /**
+         * The ID of an AWS IAM Policy.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsIAMPolicyId}.
+         */
+        public String awsIAMPolicyId() {
+            return "CamelAwsIAMPolicyId";
+        }
+        /**
+         * The description of an AWS IAM Policy.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsIAMPolicyDescription}.
+         */
+        public String awsIAMPolicyDescription() {
+            return "CamelAwsIAMPolicyDescription";
+        }
+        /**
+         * The name of an AWS IAM Instance Profile.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsIAMInstanceProfileName}.
+         */
+        public String awsIAMInstanceProfileName() {
+            return "CamelAwsIAMInstanceProfileName";
+        }
+        /**
+         * The path of an AWS IAM Instance Profile.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsIAMInstanceProfilePath}.
+         */
+        public String awsIAMInstanceProfilePath() {
+            return "CamelAwsIAMInstanceProfilePath";
+        }
+        /**
+         * The ARN of an AWS IAM Instance Profile.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsIAMInstanceProfileArn}.
+         */
+        public String awsIAMInstanceProfileArn() {
+            return "CamelAwsIAMInstanceProfileArn";
+        }
+        /**
+         * The ID of an AWS IAM Instance Profile.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsIAMInstanceProfileId}.
+         */
+        public String awsIAMInstanceProfileId() {
+            return "CamelAwsIAMInstanceProfileId";
+        }
     }
     static IAM2EndpointBuilder endpointBuilder(String componentName, String 
path) {
         class IAM2EndpointBuilderImpl extends AbstractEndpointBuilder 
implements IAM2EndpointBuilder, AdvancedIAM2EndpointBuilder {

Reply via email to