= AWS Identity and Access Management (IAM) Component
:doctitle: AWS Identity and Access Management (IAM)
:shortname: aws2-iam
:artifactid: camel-aws2-iam
:description: Manage AWS IAM instances using AWS SDK version 2.x.
:since: 3.1
:supportlevel: Stable
:component-header: Only producer is supported
//Manually maintained attributes
:group: AWS
:camel-spring-boot-name: aws2-iam

*Since Camel {since}*

*{component-header}*

The AWS2 IAM component supports create, run, start, stop and terminate
https://aws.amazon.com/iam/[AWS IAM] instances.

Prerequisites

You must have a valid Amazon Web Services developer account, and be
signed up to use Amazon IAM. More information is available at
https://aws.amazon.com/iam/[Amazon IAM].


== URI Format

-------------------------
aws2-iam://label[?options]
-------------------------

You can append query options to the URI in the following format,
?options=value&option2=value&...

[NOTE]
====
The AWS2 IAM component works on the aws-global region and it has aws-global as default region
====


// component-configure options: START

// component-configure options: END

// component options: START
include::partial$component-configure-options.adoc[]
include::partial$component-endpoint-options.adoc[]
// component options: END

// endpoint options: START

// endpoint options: END


Required IAM component options

You have to provide the amazonKmsClient in the
Registry or your accessKey and secretKey to access
the https://aws.amazon.com/iam/[Amazon IAM] service.

== Usage

=== Message headers evaluated by the IAM producer

[width="100%",cols="10%,10%,80%",options="header",]
|=======================================================================
|Header |Type |Description

|`CamelAwsIAMOperation` |`String` |The operation we want to perform

|`CamelAwsIAMUsername` |`String` |The username for the user you want to manage

|`CamelAwsIAMAccessKeyID` |`String` |The accessKey you want to manage

|`CamelAwsIAMAccessKeyStatus` |`String` |The Status of the AccessKey you want to set, possible value are active and inactive

|`CamelAwsIAMGroupName` |`String` |The name of an AWS IAM Group

|`CamelAwsIAMGroupPath` |`String` |The path of an AWS IAM Group
|=======================================================================


=== Static credentials vs Default Credential Provider

You have the possibility of avoiding the usage of explicit static credentials, by specifying the useDefaultCredentialsProvider option and set it to true.

 - Java system properties - aws.accessKeyId and aws.secretKey
 - Environment variables - AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY.
 - Web Identity Token from AWS STS.
 - The shared credentials and config files.
 - Amazon ECS container credentials - loaded from the Amazon ECS if the environment variable AWS_CONTAINER_CREDENTIALS_RELATIVE_URI is set.
 - Amazon EC2 Instance profile credentials. 

For more information about this you can look at https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/credentials.html[AWS credentials documentation]

=== IAM Producer operations

Camel-AWS2 IAM component provides the following operation on the producer side:

- listAccessKeys
- createUser
- deleteUser
- listUsers
- getUser
- createAccessKey
- deleteAccessKey
- updateAccessKey
- createGroup
- deleteGroup
- listGroups
- addUserToGroup
- removeUserFromGroup

== Producer Examples

- createUser: this operation will create a user in IAM

[source,java]
--------------------------------------------------------------------------------
from("direct:createUser")
    .setHeader(IAM2Constants.USERNAME, constant("camel"))
    .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=createUser")
--------------------------------------------------------------------------------

- deleteUser: this operation will delete a user in IAM

[source,java]
--------------------------------------------------------------------------------
from("direct:deleteUser")
    .setHeader(IAM2Constants.USERNAME, constant("camel"))
    .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=deleteUser")
--------------------------------------------------------------------------------

- listUsers: this operation will list the users in IAM

[source,java]
--------------------------------------------------------------------------------
from("direct:listUsers")
    .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=listUsers")
--------------------------------------------------------------------------------

- createGroup: this operation will add a group in IAM

[source,java]
--------------------------------------------------------------------------------
from("direct:deleteUser")
    .setHeader(IAM2Constants.GROUP_NAME, constant("camel"))
    .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=createGroup")
--------------------------------------------------------------------------------

- deleteGroup: this operation will delete a group in IAM

[source,java]
--------------------------------------------------------------------------------
from("direct:deleteUser")
    .setHeader(IAM2Constants.GROUP_NAME, constant("camel"))
    .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=deleteGroup")
--------------------------------------------------------------------------------

- listGroups: this operation will list the groups in IAM

[source,java]
--------------------------------------------------------------------------------
from("direct:listUsers")
    .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=listGroups")
--------------------------------------------------------------------------------

== Using a POJO as body

Sometimes build an AWS Request can be complex, because of multiple options. We introduce the possibility to use a POJO as body.
In AWS IAM there are multiple operations you can submit, as an example for Create User request, you can do something like:

[source,java]
------------------------------------------------------------------------------------------------------
from("direct:createUser")
     .setBody(CreateUserRequest.builder().userName("camel").build())
    .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=createUser&pojoRequest=true")
------------------------------------------------------------------------------------------------------

In this way you'll pass the request directly without the need of passing headers and options specifically related to this operation.

== Dependencies

Maven users will need to add the following dependency to their pom.xml.

*pom.xml*

[source,xml]
---------------------------------------
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-aws2-iam</artifactId>
    <version>${camel-version}</version>
</dependency>
---------------------------------------

where `$\{camel-version}` must be replaced by the actual version of Camel.


include::spring-boot:partial$starter.adoc[]
