You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2018/07/24 10:14:27 UTC

[camel] 01/07: CAMEL-12238 - Camel-AWS: Create an IAM component, first commit

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

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

commit 38a00fdfbf13b85a78318e52e8f910861fbd90db
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Tue Jul 24 11:22:45 2018 +0200

    CAMEL-12238 - Camel-AWS: Create an IAM component, first commit
---
 .../camel/component/aws/iam/IAMComponent.java      | 118 +++
 .../aws/iam/IAMComponentVerifierExtension.java     |  87 +++
 .../camel/component/aws/iam/IAMConfiguration.java  | 139 ++++
 .../camel/component/aws/iam/IAMConstants.java      |  29 +
 .../camel/component/aws/iam/IAMEndpoint.java       | 122 +++
 .../camel/component/aws/iam/IAMOperations.java     |  22 +
 .../camel/component/aws/iam/IAMProducer.java       |  93 +++
 .../services/org/apache/camel/component/aws-iam    |  18 +
 .../component/aws/iam/AmazonIAMClientMock.java     | 833 +++++++++++++++++++++
 .../aws/iam/IAMComponentConfigurationTest.java     |  51 ++
 .../aws/iam/IAMComponentVerifierExtensionTest.java |  73 ++
 .../component/aws/iam/IAMProducerSpringTest.java   |  57 ++
 .../camel/component/aws/iam/IAMProducerTest.java   |  74 ++
 .../aws/iam/IAMComponentSpringTest-context.xml     |  35 +
 .../springboot/IAMComponentAutoConfiguration.java  | 128 ++++
 .../iam/springboot/IAMComponentConfiguration.java  | 193 +++++
 .../src/main/resources/META-INF/spring.factories   |   4 +-
 17 files changed, 2075 insertions(+), 1 deletion(-)

diff --git a/components/camel-aws/src/main/java/org/apache/camel/component/aws/iam/IAMComponent.java b/components/camel-aws/src/main/java/org/apache/camel/component/aws/iam/IAMComponent.java
new file mode 100644
index 0000000..85cb8f9
--- /dev/null
+++ b/components/camel-aws/src/main/java/org/apache/camel/component/aws/iam/IAMComponent.java
@@ -0,0 +1,118 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws.iam;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.impl.DefaultComponent;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.util.ObjectHelper;
+
+/**
+ * For working with Amazon KMS.
+ */
+public class IAMComponent extends DefaultComponent {
+
+    @Metadata
+    private String accessKey;
+    @Metadata
+    private String secretKey;
+    @Metadata
+    private String region;
+    @Metadata(label = "advanced")    
+    private IAMConfiguration configuration;
+    
+    public IAMComponent() {
+        this(null);
+    }
+    
+    public IAMComponent(CamelContext context) {
+        super(context);
+        
+        this.configuration = new IAMConfiguration();
+        registerExtension(new IAMComponentVerifierExtension());
+    }
+
+    @Override
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        IAMConfiguration configuration = this.configuration.copy();
+        setProperties(configuration, parameters);
+
+        if (ObjectHelper.isEmpty(configuration.getAccessKey())) {
+            setAccessKey(accessKey);
+        }
+        if (ObjectHelper.isEmpty(configuration.getSecretKey())) {
+            setSecretKey(secretKey);
+        }
+        if (ObjectHelper.isEmpty(configuration.getRegion())) {
+            setRegion(region);
+        }
+        if (configuration.getIamClient() == null && (configuration.getAccessKey() == null || configuration.getSecretKey() == null)) {
+            throw new IllegalArgumentException("Amazon IAM client or accessKey and secretKey must be specified");
+        }
+        
+        IAMEndpoint endpoint = new IAMEndpoint(uri, this, configuration);
+        return endpoint;
+    }
+    
+    public IAMConfiguration getConfiguration() {
+        return configuration;
+    }
+
+    /**
+     * The AWS MQ default configuration
+     */
+    public void setConfiguration(IAMConfiguration configuration) {
+        this.configuration = configuration;
+    }
+
+    public String getAccessKey() {
+        return configuration.getAccessKey();
+    }
+
+    /**
+     * Amazon AWS Access Key
+     */
+    public void setAccessKey(String accessKey) {
+        configuration.setAccessKey(accessKey);
+    }
+
+    public String getSecretKey() {
+        return configuration.getSecretKey();
+    }
+
+    /**
+     * Amazon AWS Secret Key
+     */
+    public void setSecretKey(String secretKey) {
+        configuration.setSecretKey(secretKey);
+    }
+    
+    public String getRegion() {
+        return configuration.getRegion();
+    }
+
+    /**
+     * The region in which MQ client needs to work
+     */
+    public void setRegion(String region) {
+        configuration.setRegion(region);
+    }
+
+}
diff --git a/components/camel-aws/src/main/java/org/apache/camel/component/aws/iam/IAMComponentVerifierExtension.java b/components/camel-aws/src/main/java/org/apache/camel/component/aws/iam/IAMComponentVerifierExtension.java
new file mode 100644
index 0000000..048217f
--- /dev/null
+++ b/components/camel-aws/src/main/java/org/apache/camel/component/aws/iam/IAMComponentVerifierExtension.java
@@ -0,0 +1,87 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws.iam;
+
+import java.util.Map;
+
+import com.amazonaws.SdkClientException;
+import com.amazonaws.auth.AWSCredentials;
+import com.amazonaws.auth.AWSCredentialsProvider;
+import com.amazonaws.auth.AWSStaticCredentialsProvider;
+import com.amazonaws.auth.BasicAWSCredentials;
+import com.amazonaws.regions.Regions;
+import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
+import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
+
+import org.apache.camel.component.extension.verifier.DefaultComponentVerifierExtension;
+import org.apache.camel.component.extension.verifier.ResultBuilder;
+import org.apache.camel.component.extension.verifier.ResultErrorBuilder;
+import org.apache.camel.component.extension.verifier.ResultErrorHelper;
+
+public class IAMComponentVerifierExtension extends DefaultComponentVerifierExtension {
+
+    public IAMComponentVerifierExtension() {
+        this("aws-iam");
+    }
+
+    public IAMComponentVerifierExtension(String scheme) {
+        super(scheme);
+    }
+
+    // *********************************
+    // Parameters validation
+    // *********************************
+
+    @Override
+    protected Result verifyParameters(Map<String, Object> parameters) {
+
+        ResultBuilder builder = ResultBuilder.withStatusAndScope(Result.Status.OK, Scope.PARAMETERS).error(ResultErrorHelper.requiresOption("accessKey", parameters))
+            .error(ResultErrorHelper.requiresOption("secretKey", parameters)).error(ResultErrorHelper.requiresOption("region", parameters));
+
+        // Validate using the catalog
+
+        super.verifyParametersAgainstCatalog(builder, parameters);
+
+        return builder.build();
+    }
+
+    // *********************************
+    // Connectivity validation
+    // *********************************
+
+    @Override
+    protected Result verifyConnectivity(Map<String, Object> parameters) {
+        ResultBuilder builder = ResultBuilder.withStatusAndScope(Result.Status.OK, Scope.CONNECTIVITY);
+
+        try {
+            IAMConfiguration configuration = setProperties(new IAMConfiguration(), parameters);
+            AWSCredentials credentials = new BasicAWSCredentials(configuration.getAccessKey(), configuration.getSecretKey());
+            AWSCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(credentials);
+            AmazonIdentityManagement client = AmazonIdentityManagementClientBuilder.standard().withCredentials(credentialsProvider).withRegion(Regions.valueOf(configuration.getRegion())).build();
+            client.listAccessKeys();
+        } catch (SdkClientException e) {
+            ResultErrorBuilder errorBuilder = ResultErrorBuilder.withCodeAndDescription(VerificationError.StandardCode.AUTHENTICATION, e.getMessage())
+                .detail("aws_iam_exception_message", e.getMessage()).detail(VerificationError.ExceptionAttribute.EXCEPTION_CLASS, e.getClass().getName())
+                .detail(VerificationError.ExceptionAttribute.EXCEPTION_INSTANCE, e);
+
+            builder.error(errorBuilder.build());
+        } catch (Exception e) {
+            builder.error(ResultErrorBuilder.withException(e).build());
+        }
+        return builder.build();
+    }
+}
diff --git a/components/camel-aws/src/main/java/org/apache/camel/component/aws/iam/IAMConfiguration.java b/components/camel-aws/src/main/java/org/apache/camel/component/aws/iam/IAMConfiguration.java
new file mode 100644
index 0000000..82e97b7
--- /dev/null
+++ b/components/camel-aws/src/main/java/org/apache/camel/component/aws/iam/IAMConfiguration.java
@@ -0,0 +1,139 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws.iam;
+
+import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
+import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClient;
+import com.amazonaws.services.kms.AWSKMS;
+
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriParams;
+import org.apache.camel.spi.UriPath;
+
+@UriParams
+public class IAMConfiguration implements Cloneable {
+
+    @UriPath(description = "Logical name")
+    @Metadata(required = "true")
+    private String label;
+    @UriParam(label = "producer")
+    private AmazonIdentityManagementClient iamClient;
+    @UriParam(label = "producer", secret = true)
+    private String accessKey;
+    @UriParam(label = "producer", secret = true)
+    private String secretKey;
+    @UriParam(label = "producer")
+    @Metadata(required = "true")
+    private IAMOperations operation;
+    @UriParam(label = "producer")
+    private String proxyHost;
+    @UriParam(label = "producer")
+    private Integer proxyPort;
+    @UriParam
+    private String region;
+
+    public AmazonIdentityManagementClient getIamClient() {
+        return iamClient;
+    }
+
+    /**
+     * To use a existing configured AWS IAM as client
+     */
+    public void setIamClient(AmazonIdentityManagementClient iamClient) {
+        this.iamClient = iamClient;
+    }
+
+    public String getAccessKey() {
+        return accessKey;
+    }
+
+    /**
+     * Amazon AWS Access Key
+     */
+    public void setAccessKey(String accessKey) {
+        this.accessKey = accessKey;
+    }
+
+    public String getSecretKey() {
+        return secretKey;
+    }
+
+    /**
+     * Amazon AWS Secret Key
+     */
+    public void setSecretKey(String secretKey) {
+        this.secretKey = secretKey;
+    }
+
+    public IAMOperations getOperation() {
+        return operation;
+    }
+
+    /**
+     * The operation to perform
+     */
+    public void setOperation(IAMOperations operation) {
+        this.operation = operation;
+    }
+
+    public String getProxyHost() {
+        return proxyHost;
+    }
+
+    /**
+     * To define a proxy host when instantiating the KMS client
+     */
+    public void setProxyHost(String proxyHost) {
+        this.proxyHost = proxyHost;
+    }
+
+    public Integer getProxyPort() {
+        return proxyPort;
+    }
+
+    /**
+     * To define a proxy port when instantiating the KMS client
+     */
+    public void setProxyPort(Integer proxyPort) {
+        this.proxyPort = proxyPort;
+    }
+
+    public String getRegion() {
+        return region;
+    }
+
+    /**
+     * The region in which KMS client needs to work
+     */
+    public void setRegion(String region) {
+        this.region = region;
+    }
+    
+    // *************************************************
+    //
+    // *************************************************
+
+    public IAMConfiguration copy() {
+        try {
+            return (IAMConfiguration)super.clone();
+        } catch (CloneNotSupportedException e) {
+            throw new RuntimeCamelException(e);
+        }
+    }
+}
diff --git a/components/camel-aws/src/main/java/org/apache/camel/component/aws/iam/IAMConstants.java b/components/camel-aws/src/main/java/org/apache/camel/component/aws/iam/IAMConstants.java
new file mode 100644
index 0000000..b8d9f5f
--- /dev/null
+++ b/components/camel-aws/src/main/java/org/apache/camel/component/aws/iam/IAMConstants.java
@@ -0,0 +1,29 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws.iam;
+
+/**
+ * Constants used in Camel AWS IAM module
+ * 
+ */
+public interface IAMConstants {
+    String OPERATION                = "CamelAwsKMSOperation";
+    String LIMIT                    = "CamelAwsKMSLimit";
+    String DESCRIPTION              = "CamelAwsKMSDescription";
+    String KEY_ID                   = "CamelAwsKMSKeyId";
+    String PENDING_WINDOW_IN_DAYS   = "CamelAwsKMSPendingWindowInDays";
+}
diff --git a/components/camel-aws/src/main/java/org/apache/camel/component/aws/iam/IAMEndpoint.java b/components/camel-aws/src/main/java/org/apache/camel/component/aws/iam/IAMEndpoint.java
new file mode 100644
index 0000000..c528275
--- /dev/null
+++ b/components/camel-aws/src/main/java/org/apache/camel/component/aws/iam/IAMEndpoint.java
@@ -0,0 +1,122 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws.iam;
+
+import com.amazonaws.ClientConfiguration;
+import com.amazonaws.auth.AWSCredentials;
+import com.amazonaws.auth.AWSCredentialsProvider;
+import com.amazonaws.auth.AWSStaticCredentialsProvider;
+import com.amazonaws.auth.BasicAWSCredentials;
+import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
+import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClient;
+import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
+
+import org.apache.camel.Component;
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.impl.ScheduledPollEndpoint;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.util.ObjectHelper;
+
+/**
+ * The aws-iam is used for managing Amazon IAM
+ */
+@UriEndpoint(firstVersion = "2.23.0", scheme = "aws-iam", title = "AWS IAM", syntax = "aws-iam:label", producerOnly = true, label = "cloud,management")
+public class IAMEndpoint extends ScheduledPollEndpoint {
+
+    private AmazonIdentityManagement iamClient;
+
+    @UriParam
+    private IAMConfiguration configuration;
+
+    public IAMEndpoint(String uri, Component component, IAMConfiguration configuration) {
+        super(uri, component);
+        this.configuration = configuration;
+    }
+
+    public Consumer createConsumer(Processor processor) throws Exception {
+        throw new UnsupportedOperationException("You cannot receive messages from this endpoint");
+    }
+
+    public Producer createProducer() throws Exception {
+        return new IAMProducer(this);
+    }
+
+    public boolean isSingleton() {
+        return true;
+    }
+
+    @Override
+    public void doStart() throws Exception {
+        super.doStart();
+
+        iamClient = configuration.getIamClient() != null ? configuration.getIamClient() : createKMSClient();
+    }
+    
+    @Override
+    public void doStop() throws Exception {
+        if (ObjectHelper.isEmpty(configuration.getIamClient())) {
+            if (iamClient != null) {
+            	iamClient.shutdown();
+            }
+        }
+        super.doStop();
+    }
+
+    public IAMConfiguration getConfiguration() {
+        return configuration;
+    }
+
+    public AmazonIdentityManagement getIamClient() {
+        return iamClient;
+    }
+
+    AmazonIdentityManagement createKMSClient() {
+    	AmazonIdentityManagement client = null;
+        ClientConfiguration clientConfiguration = null;
+        AmazonIdentityManagementClientBuilder clientBuilder = null;
+        boolean isClientConfigFound = false;
+        if (ObjectHelper.isNotEmpty(configuration.getProxyHost()) && ObjectHelper.isNotEmpty(configuration.getProxyPort())) {
+            clientConfiguration = new ClientConfiguration();
+            clientConfiguration.setProxyHost(configuration.getProxyHost());
+            clientConfiguration.setProxyPort(configuration.getProxyPort());
+            isClientConfigFound = true;
+        }
+        if (configuration.getAccessKey() != null && configuration.getSecretKey() != null) {
+            AWSCredentials credentials = new BasicAWSCredentials(configuration.getAccessKey(), configuration.getSecretKey());
+            AWSCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(credentials);
+            if (isClientConfigFound) {
+                clientBuilder = AmazonIdentityManagementClientBuilder.standard().withClientConfiguration(clientConfiguration).withCredentials(credentialsProvider);
+            } else {
+                clientBuilder = AmazonIdentityManagementClientBuilder.standard().withCredentials(credentialsProvider);
+            }
+        } else {
+            if (isClientConfigFound) {
+                clientBuilder = AmazonIdentityManagementClientBuilder.standard();
+            } else {
+                clientBuilder = AmazonIdentityManagementClientBuilder.standard().withClientConfiguration(clientConfiguration);
+            }
+        }
+        if (ObjectHelper.isNotEmpty(configuration.getRegion())) {
+            clientBuilder = clientBuilder.withRegion(configuration.getRegion());
+        }
+        client = clientBuilder.build();
+        return client;
+    }
+}
diff --git a/components/camel-aws/src/main/java/org/apache/camel/component/aws/iam/IAMOperations.java b/components/camel-aws/src/main/java/org/apache/camel/component/aws/iam/IAMOperations.java
new file mode 100644
index 0000000..5327d5b
--- /dev/null
+++ b/components/camel-aws/src/main/java/org/apache/camel/component/aws/iam/IAMOperations.java
@@ -0,0 +1,22 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws.iam;
+
+public enum IAMOperations {
+
+    listAccessKeys
+}
diff --git a/components/camel-aws/src/main/java/org/apache/camel/component/aws/iam/IAMProducer.java b/components/camel-aws/src/main/java/org/apache/camel/component/aws/iam/IAMProducer.java
new file mode 100644
index 0000000..04df46a
--- /dev/null
+++ b/components/camel-aws/src/main/java/org/apache/camel/component/aws/iam/IAMProducer.java
@@ -0,0 +1,93 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws.iam;
+
+import com.amazonaws.AmazonServiceException;
+import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
+import com.amazonaws.services.identitymanagement.model.ListAccessKeysResult;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.impl.DefaultProducer;
+import org.apache.camel.util.URISupport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.apache.camel.component.aws.common.AwsExchangeUtil.getMessageForResponse;
+
+/**
+ * A Producer which sends messages to the Amazon IAM Service
+ * <a href="http://aws.amazon.com/iam/">AWS IAM</a>
+ */
+public class IAMProducer extends DefaultProducer {
+
+    private static final Logger LOG = LoggerFactory.getLogger(IAMProducer.class);
+
+    private transient String iamProducerToString;
+
+    public IAMProducer(Endpoint endpoint) {
+        super(endpoint);
+    }
+
+    public void process(Exchange exchange) throws Exception {
+        switch (determineOperation(exchange)) {
+        case listAccessKeys:
+            listAccessKeys(getEndpoint().getIamClient(), exchange);
+            break;
+        default:
+            throw new IllegalArgumentException("Unsupported operation");
+        }
+    }
+
+    private IAMOperations determineOperation(Exchange exchange) {
+        IAMOperations operation = exchange.getIn().getHeader(IAMConstants.OPERATION, IAMOperations.class);
+        if (operation == null) {
+            operation = getConfiguration().getOperation();
+        }
+        return operation;
+    }
+
+    protected IAMConfiguration getConfiguration() {
+        return getEndpoint().getConfiguration();
+    }
+
+    @Override
+    public String toString() {
+        if (iamProducerToString == null) {
+        	iamProducerToString = "IAMProducer[" + URISupport.sanitizeUri(getEndpoint().getEndpointUri()) + "]";
+        }
+        return iamProducerToString;
+    }
+
+    @Override
+    public IAMEndpoint getEndpoint() {
+        return (IAMEndpoint)super.getEndpoint();
+    }
+
+    private void listAccessKeys(AmazonIdentityManagement iamClient, Exchange exchange) {
+        ListAccessKeysResult result;
+        try {
+            result = iamClient.listAccessKeys();
+        } catch (AmazonServiceException ase) {
+            LOG.trace("List Access Keys command returned the error code {}", ase.getErrorCode());
+            throw ase;
+        }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(result);
+    }
+}
\ No newline at end of file
diff --git a/components/camel-aws/src/main/resources/META-INF/services/org/apache/camel/component/aws-iam b/components/camel-aws/src/main/resources/META-INF/services/org/apache/camel/component/aws-iam
new file mode 100644
index 0000000..ab88eb6
--- /dev/null
+++ b/components/camel-aws/src/main/resources/META-INF/services/org/apache/camel/component/aws-iam
@@ -0,0 +1,18 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+class=org.apache.camel.component.aws.iam.IAMComponent
diff --git a/components/camel-aws/src/test/java/org/apache/camel/component/aws/iam/AmazonIAMClientMock.java b/components/camel-aws/src/test/java/org/apache/camel/component/aws/iam/AmazonIAMClientMock.java
new file mode 100644
index 0000000..4354d5c
--- /dev/null
+++ b/components/camel-aws/src/test/java/org/apache/camel/component/aws/iam/AmazonIAMClientMock.java
@@ -0,0 +1,833 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws.iam;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+
+import com.amazonaws.AmazonWebServiceRequest;
+import com.amazonaws.ResponseMetadata;
+import com.amazonaws.regions.Region;
+import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClient;
+import com.amazonaws.services.identitymanagement.model.*;
+import com.amazonaws.services.identitymanagement.waiters.AmazonIdentityManagementWaiters;
+
+
+public class AmazonIAMClientMock extends AmazonIdentityManagementClient {
+
+	@Override
+	public void setEndpoint(String endpoint) {
+	}
+
+	@Override
+	public void setRegion(Region region) {	
+	}
+
+	@Override
+	public AddClientIDToOpenIDConnectProviderResult addClientIDToOpenIDConnectProvider(
+			AddClientIDToOpenIDConnectProviderRequest addClientIDToOpenIDConnectProviderRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public AddRoleToInstanceProfileResult addRoleToInstanceProfile(
+			AddRoleToInstanceProfileRequest addRoleToInstanceProfileRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public AddUserToGroupResult addUserToGroup(AddUserToGroupRequest addUserToGroupRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public AttachGroupPolicyResult attachGroupPolicy(AttachGroupPolicyRequest attachGroupPolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public AttachRolePolicyResult attachRolePolicy(AttachRolePolicyRequest attachRolePolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public AttachUserPolicyResult attachUserPolicy(AttachUserPolicyRequest attachUserPolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ChangePasswordResult changePassword(ChangePasswordRequest changePasswordRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public CreateAccessKeyResult createAccessKey(CreateAccessKeyRequest createAccessKeyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public CreateAccessKeyResult createAccessKey() {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public CreateAccountAliasResult createAccountAlias(CreateAccountAliasRequest createAccountAliasRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public CreateGroupResult createGroup(CreateGroupRequest createGroupRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public CreateInstanceProfileResult createInstanceProfile(
+			CreateInstanceProfileRequest createInstanceProfileRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public CreateLoginProfileResult createLoginProfile(CreateLoginProfileRequest createLoginProfileRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public CreateOpenIDConnectProviderResult createOpenIDConnectProvider(
+			CreateOpenIDConnectProviderRequest createOpenIDConnectProviderRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public CreatePolicyResult createPolicy(CreatePolicyRequest createPolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public CreatePolicyVersionResult createPolicyVersion(CreatePolicyVersionRequest createPolicyVersionRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public CreateRoleResult createRole(CreateRoleRequest createRoleRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public CreateSAMLProviderResult createSAMLProvider(CreateSAMLProviderRequest createSAMLProviderRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public CreateServiceLinkedRoleResult createServiceLinkedRole(
+			CreateServiceLinkedRoleRequest createServiceLinkedRoleRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public CreateServiceSpecificCredentialResult createServiceSpecificCredential(
+			CreateServiceSpecificCredentialRequest createServiceSpecificCredentialRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public CreateUserResult createUser(CreateUserRequest createUserRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public CreateVirtualMFADeviceResult createVirtualMFADevice(
+			CreateVirtualMFADeviceRequest createVirtualMFADeviceRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeactivateMFADeviceResult deactivateMFADevice(DeactivateMFADeviceRequest deactivateMFADeviceRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeleteAccessKeyResult deleteAccessKey(DeleteAccessKeyRequest deleteAccessKeyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeleteAccountAliasResult deleteAccountAlias(DeleteAccountAliasRequest deleteAccountAliasRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeleteAccountPasswordPolicyResult deleteAccountPasswordPolicy(
+			DeleteAccountPasswordPolicyRequest deleteAccountPasswordPolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeleteAccountPasswordPolicyResult deleteAccountPasswordPolicy() {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeleteGroupResult deleteGroup(DeleteGroupRequest deleteGroupRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeleteGroupPolicyResult deleteGroupPolicy(DeleteGroupPolicyRequest deleteGroupPolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeleteInstanceProfileResult deleteInstanceProfile(
+			DeleteInstanceProfileRequest deleteInstanceProfileRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeleteLoginProfileResult deleteLoginProfile(DeleteLoginProfileRequest deleteLoginProfileRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeleteOpenIDConnectProviderResult deleteOpenIDConnectProvider(
+			DeleteOpenIDConnectProviderRequest deleteOpenIDConnectProviderRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeletePolicyResult deletePolicy(DeletePolicyRequest deletePolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeletePolicyVersionResult deletePolicyVersion(DeletePolicyVersionRequest deletePolicyVersionRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeleteRoleResult deleteRole(DeleteRoleRequest deleteRoleRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeleteRolePolicyResult deleteRolePolicy(DeleteRolePolicyRequest deleteRolePolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeleteSAMLProviderResult deleteSAMLProvider(DeleteSAMLProviderRequest deleteSAMLProviderRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeleteSSHPublicKeyResult deleteSSHPublicKey(DeleteSSHPublicKeyRequest deleteSSHPublicKeyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeleteServerCertificateResult deleteServerCertificate(
+			DeleteServerCertificateRequest deleteServerCertificateRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeleteServiceLinkedRoleResult deleteServiceLinkedRole(
+			DeleteServiceLinkedRoleRequest deleteServiceLinkedRoleRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeleteServiceSpecificCredentialResult deleteServiceSpecificCredential(
+			DeleteServiceSpecificCredentialRequest deleteServiceSpecificCredentialRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeleteSigningCertificateResult deleteSigningCertificate(
+			DeleteSigningCertificateRequest deleteSigningCertificateRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeleteUserResult deleteUser(DeleteUserRequest deleteUserRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeleteUserPolicyResult deleteUserPolicy(DeleteUserPolicyRequest deleteUserPolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DeleteVirtualMFADeviceResult deleteVirtualMFADevice(
+			DeleteVirtualMFADeviceRequest deleteVirtualMFADeviceRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DetachGroupPolicyResult detachGroupPolicy(DetachGroupPolicyRequest detachGroupPolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DetachRolePolicyResult detachRolePolicy(DetachRolePolicyRequest detachRolePolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public DetachUserPolicyResult detachUserPolicy(DetachUserPolicyRequest detachUserPolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public EnableMFADeviceResult enableMFADevice(EnableMFADeviceRequest enableMFADeviceRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GenerateCredentialReportResult generateCredentialReport(
+			GenerateCredentialReportRequest generateCredentialReportRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GenerateCredentialReportResult generateCredentialReport() {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetAccessKeyLastUsedResult getAccessKeyLastUsed(GetAccessKeyLastUsedRequest getAccessKeyLastUsedRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetAccountAuthorizationDetailsResult getAccountAuthorizationDetails(
+			GetAccountAuthorizationDetailsRequest getAccountAuthorizationDetailsRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetAccountAuthorizationDetailsResult getAccountAuthorizationDetails() {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetAccountPasswordPolicyResult getAccountPasswordPolicy(
+			GetAccountPasswordPolicyRequest getAccountPasswordPolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetAccountPasswordPolicyResult getAccountPasswordPolicy() {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetAccountSummaryResult getAccountSummary(GetAccountSummaryRequest getAccountSummaryRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetAccountSummaryResult getAccountSummary() {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetContextKeysForCustomPolicyResult getContextKeysForCustomPolicy(
+			GetContextKeysForCustomPolicyRequest getContextKeysForCustomPolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetContextKeysForPrincipalPolicyResult getContextKeysForPrincipalPolicy(
+			GetContextKeysForPrincipalPolicyRequest getContextKeysForPrincipalPolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetCredentialReportResult getCredentialReport(GetCredentialReportRequest getCredentialReportRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetCredentialReportResult getCredentialReport() {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetGroupResult getGroup(GetGroupRequest getGroupRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetGroupPolicyResult getGroupPolicy(GetGroupPolicyRequest getGroupPolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetInstanceProfileResult getInstanceProfile(GetInstanceProfileRequest getInstanceProfileRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetLoginProfileResult getLoginProfile(GetLoginProfileRequest getLoginProfileRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetOpenIDConnectProviderResult getOpenIDConnectProvider(
+			GetOpenIDConnectProviderRequest getOpenIDConnectProviderRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetPolicyResult getPolicy(GetPolicyRequest getPolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetPolicyVersionResult getPolicyVersion(GetPolicyVersionRequest getPolicyVersionRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetRoleResult getRole(GetRoleRequest getRoleRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetRolePolicyResult getRolePolicy(GetRolePolicyRequest getRolePolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetSAMLProviderResult getSAMLProvider(GetSAMLProviderRequest getSAMLProviderRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetSSHPublicKeyResult getSSHPublicKey(GetSSHPublicKeyRequest getSSHPublicKeyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetServerCertificateResult getServerCertificate(GetServerCertificateRequest getServerCertificateRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetServiceLinkedRoleDeletionStatusResult getServiceLinkedRoleDeletionStatus(
+			GetServiceLinkedRoleDeletionStatusRequest getServiceLinkedRoleDeletionStatusRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetUserResult getUser(GetUserRequest getUserRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetUserResult getUser() {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public GetUserPolicyResult getUserPolicy(GetUserPolicyRequest getUserPolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListAccessKeysResult listAccessKeys(ListAccessKeysRequest listAccessKeysRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListAccessKeysResult listAccessKeys() {
+       ListAccessKeysResult result = new ListAccessKeysResult();
+       Collection<AccessKeyMetadata> accessKeyMetadata = new ArrayList<AccessKeyMetadata>();
+       AccessKeyMetadata meta = new AccessKeyMetadata();
+       meta.setAccessKeyId("1");
+       meta.setCreateDate(new Date());
+       meta.setStatus(StatusType.Active);
+       meta.setUserName("test");
+       accessKeyMetadata.add(meta);
+	   result.setAccessKeyMetadata(accessKeyMetadata);
+	   return result;
+	}
+
+	@Override
+	public ListAccountAliasesResult listAccountAliases(ListAccountAliasesRequest listAccountAliasesRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListAccountAliasesResult listAccountAliases() {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListAttachedGroupPoliciesResult listAttachedGroupPolicies(
+			ListAttachedGroupPoliciesRequest listAttachedGroupPoliciesRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListAttachedRolePoliciesResult listAttachedRolePolicies(
+			ListAttachedRolePoliciesRequest listAttachedRolePoliciesRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListAttachedUserPoliciesResult listAttachedUserPolicies(
+			ListAttachedUserPoliciesRequest listAttachedUserPoliciesRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListEntitiesForPolicyResult listEntitiesForPolicy(
+			ListEntitiesForPolicyRequest listEntitiesForPolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListGroupPoliciesResult listGroupPolicies(ListGroupPoliciesRequest listGroupPoliciesRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListGroupsResult listGroups(ListGroupsRequest listGroupsRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListGroupsResult listGroups() {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListGroupsForUserResult listGroupsForUser(ListGroupsForUserRequest listGroupsForUserRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListInstanceProfilesResult listInstanceProfiles(ListInstanceProfilesRequest listInstanceProfilesRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListInstanceProfilesResult listInstanceProfiles() {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListInstanceProfilesForRoleResult listInstanceProfilesForRole(
+			ListInstanceProfilesForRoleRequest listInstanceProfilesForRoleRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListMFADevicesResult listMFADevices(ListMFADevicesRequest listMFADevicesRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListMFADevicesResult listMFADevices() {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListOpenIDConnectProvidersResult listOpenIDConnectProviders(
+			ListOpenIDConnectProvidersRequest listOpenIDConnectProvidersRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListOpenIDConnectProvidersResult listOpenIDConnectProviders() {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListPoliciesResult listPolicies(ListPoliciesRequest listPoliciesRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListPoliciesResult listPolicies() {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListPolicyVersionsResult listPolicyVersions(ListPolicyVersionsRequest listPolicyVersionsRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListRolePoliciesResult listRolePolicies(ListRolePoliciesRequest listRolePoliciesRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListRolesResult listRoles(ListRolesRequest listRolesRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListRolesResult listRoles() {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListSAMLProvidersResult listSAMLProviders(ListSAMLProvidersRequest listSAMLProvidersRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListSAMLProvidersResult listSAMLProviders() {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListSSHPublicKeysResult listSSHPublicKeys(ListSSHPublicKeysRequest listSSHPublicKeysRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListSSHPublicKeysResult listSSHPublicKeys() {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListServerCertificatesResult listServerCertificates(
+			ListServerCertificatesRequest listServerCertificatesRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListServerCertificatesResult listServerCertificates() {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListServiceSpecificCredentialsResult listServiceSpecificCredentials(
+			ListServiceSpecificCredentialsRequest listServiceSpecificCredentialsRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListSigningCertificatesResult listSigningCertificates(
+			ListSigningCertificatesRequest listSigningCertificatesRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListSigningCertificatesResult listSigningCertificates() {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListUserPoliciesResult listUserPolicies(ListUserPoliciesRequest listUserPoliciesRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListUsersResult listUsers(ListUsersRequest listUsersRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListUsersResult listUsers() {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListVirtualMFADevicesResult listVirtualMFADevices(
+			ListVirtualMFADevicesRequest listVirtualMFADevicesRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ListVirtualMFADevicesResult listVirtualMFADevices() {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public PutGroupPolicyResult putGroupPolicy(PutGroupPolicyRequest putGroupPolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public PutRolePolicyResult putRolePolicy(PutRolePolicyRequest putRolePolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public PutUserPolicyResult putUserPolicy(PutUserPolicyRequest putUserPolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public RemoveClientIDFromOpenIDConnectProviderResult removeClientIDFromOpenIDConnectProvider(
+			RemoveClientIDFromOpenIDConnectProviderRequest removeClientIDFromOpenIDConnectProviderRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public RemoveRoleFromInstanceProfileResult removeRoleFromInstanceProfile(
+			RemoveRoleFromInstanceProfileRequest removeRoleFromInstanceProfileRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public RemoveUserFromGroupResult removeUserFromGroup(RemoveUserFromGroupRequest removeUserFromGroupRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ResetServiceSpecificCredentialResult resetServiceSpecificCredential(
+			ResetServiceSpecificCredentialRequest resetServiceSpecificCredentialRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public ResyncMFADeviceResult resyncMFADevice(ResyncMFADeviceRequest resyncMFADeviceRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public SetDefaultPolicyVersionResult setDefaultPolicyVersion(
+			SetDefaultPolicyVersionRequest setDefaultPolicyVersionRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public SimulateCustomPolicyResult simulateCustomPolicy(SimulateCustomPolicyRequest simulateCustomPolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public SimulatePrincipalPolicyResult simulatePrincipalPolicy(
+			SimulatePrincipalPolicyRequest simulatePrincipalPolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public UpdateAccessKeyResult updateAccessKey(UpdateAccessKeyRequest updateAccessKeyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public UpdateAccountPasswordPolicyResult updateAccountPasswordPolicy(
+			UpdateAccountPasswordPolicyRequest updateAccountPasswordPolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public UpdateAssumeRolePolicyResult updateAssumeRolePolicy(
+			UpdateAssumeRolePolicyRequest updateAssumeRolePolicyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public UpdateGroupResult updateGroup(UpdateGroupRequest updateGroupRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public UpdateLoginProfileResult updateLoginProfile(UpdateLoginProfileRequest updateLoginProfileRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public UpdateOpenIDConnectProviderThumbprintResult updateOpenIDConnectProviderThumbprint(
+			UpdateOpenIDConnectProviderThumbprintRequest updateOpenIDConnectProviderThumbprintRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public UpdateRoleDescriptionResult updateRoleDescription(
+			UpdateRoleDescriptionRequest updateRoleDescriptionRequest) {
+        throw new UnsupportedOperationException();
+	}
+	
+
+
+	@Override
+	public UpdateSAMLProviderResult updateSAMLProvider(UpdateSAMLProviderRequest updateSAMLProviderRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public UpdateSSHPublicKeyResult updateSSHPublicKey(UpdateSSHPublicKeyRequest updateSSHPublicKeyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public UpdateServerCertificateResult updateServerCertificate(
+			UpdateServerCertificateRequest updateServerCertificateRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public UpdateServiceSpecificCredentialResult updateServiceSpecificCredential(
+			UpdateServiceSpecificCredentialRequest updateServiceSpecificCredentialRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public UpdateSigningCertificateResult updateSigningCertificate(
+			UpdateSigningCertificateRequest updateSigningCertificateRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public UpdateUserResult updateUser(UpdateUserRequest updateUserRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public UploadSSHPublicKeyResult uploadSSHPublicKey(UploadSSHPublicKeyRequest uploadSSHPublicKeyRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public UploadServerCertificateResult uploadServerCertificate(
+			UploadServerCertificateRequest uploadServerCertificateRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public UploadSigningCertificateResult uploadSigningCertificate(
+			UploadSigningCertificateRequest uploadSigningCertificateRequest) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public void shutdown() {
+        throw new UnsupportedOperationException();
+		
+	}
+
+	@Override
+	public ResponseMetadata getCachedResponseMetadata(AmazonWebServiceRequest request) {
+        throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public AmazonIdentityManagementWaiters waiters() {
+        throw new UnsupportedOperationException();
+	}
+}
diff --git a/components/camel-aws/src/test/java/org/apache/camel/component/aws/iam/IAMComponentConfigurationTest.java b/components/camel-aws/src/test/java/org/apache/camel/component/aws/iam/IAMComponentConfigurationTest.java
new file mode 100644
index 0000000..1c7e791
--- /dev/null
+++ b/components/camel-aws/src/test/java/org/apache/camel/component/aws/iam/IAMComponentConfigurationTest.java
@@ -0,0 +1,51 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws.iam;
+
+import com.amazonaws.regions.Regions;
+
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+public class IAMComponentConfigurationTest extends CamelTestSupport {
+
+    
+    @Test
+    public void createEndpointWithComponentElements() throws Exception {
+        IAMComponent component = new IAMComponent(context);
+        component.setAccessKey("XXX");
+        component.setSecretKey("YYY");
+        IAMEndpoint endpoint = (IAMEndpoint)component.createEndpoint("aws-iam://label");
+        
+        assertEquals("XXX", endpoint.getConfiguration().getAccessKey());
+        assertEquals("YYY", endpoint.getConfiguration().getSecretKey());
+    }
+    
+    @Test
+    public void createEndpointWithComponentAndEndpointElements() throws Exception {
+    	IAMComponent component = new IAMComponent(context);
+        component.setAccessKey("XXX");
+        component.setSecretKey("YYY");
+        component.setRegion(Regions.US_WEST_1.toString());
+        IAMEndpoint endpoint = (IAMEndpoint)component.createEndpoint("aws-iam://label?accessKey=xxxxxx&secretKey=yyyyy&region=US_EAST_1");
+        
+        assertEquals("xxxxxx", endpoint.getConfiguration().getAccessKey());
+        assertEquals("yyyyy", endpoint.getConfiguration().getSecretKey());
+        assertEquals("US_EAST_1", endpoint.getConfiguration().getRegion());
+    }
+    
+}
diff --git a/components/camel-aws/src/test/java/org/apache/camel/component/aws/iam/IAMComponentVerifierExtensionTest.java b/components/camel-aws/src/test/java/org/apache/camel/component/aws/iam/IAMComponentVerifierExtensionTest.java
new file mode 100644
index 0000000..4681483
--- /dev/null
+++ b/components/camel-aws/src/test/java/org/apache/camel/component/aws/iam/IAMComponentVerifierExtensionTest.java
@@ -0,0 +1,73 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws.iam;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.Component;
+import org.apache.camel.component.extension.ComponentVerifierExtension;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class IAMComponentVerifierExtensionTest extends CamelTestSupport {
+
+    // *************************************************
+    // Tests (parameters)
+    // *************************************************
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+
+    @Test
+    public void testParameters() throws Exception {
+        Component component = context().getComponent("aws-iam");
+
+        ComponentVerifierExtension verifier = component.getExtension(ComponentVerifierExtension.class).orElseThrow(IllegalStateException::new);
+
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("secretKey", "l");
+        parameters.put("accessKey", "k");
+        parameters.put("region", "l");
+        parameters.put("label", "test");
+        parameters.put("operation", IAMOperations.listAccessKeys);
+
+        ComponentVerifierExtension.Result result = verifier.verify(ComponentVerifierExtension.Scope.PARAMETERS, parameters);
+
+        Assert.assertEquals(ComponentVerifierExtension.Result.Status.OK, result.getStatus());
+    }
+
+    @Test
+    public void testConnectivity() throws Exception {
+        Component component = context().getComponent("aws-iam");
+        ComponentVerifierExtension verifier = component.getExtension(ComponentVerifierExtension.class).orElseThrow(IllegalStateException::new);
+
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("secretKey", "l");
+        parameters.put("accessKey", "k");
+        parameters.put("region", "US_EAST_1");
+        parameters.put("label", "test");
+        parameters.put("operation", IAMOperations.listAccessKeys);
+
+        ComponentVerifierExtension.Result result = verifier.verify(ComponentVerifierExtension.Scope.CONNECTIVITY, parameters);
+
+        Assert.assertEquals(ComponentVerifierExtension.Result.Status.ERROR, result.getStatus());
+    }
+
+}
diff --git a/components/camel-aws/src/test/java/org/apache/camel/component/aws/iam/IAMProducerSpringTest.java b/components/camel-aws/src/test/java/org/apache/camel/component/aws/iam/IAMProducerSpringTest.java
new file mode 100644
index 0000000..f44dd88
--- /dev/null
+++ b/components/camel-aws/src/test/java/org/apache/camel/component/aws/iam/IAMProducerSpringTest.java
@@ -0,0 +1,57 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws.iam;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.spring.CamelSpringTestSupport;
+import org.junit.Test;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+import com.amazonaws.services.identitymanagement.model.ListAccessKeysResult;
+
+public class IAMProducerSpringTest extends CamelSpringTestSupport {
+
+	@EndpointInject(uri = "mock:result")
+	private MockEndpoint mock;
+
+	@Test
+	public void mqListBrokersTest() throws Exception {
+
+		mock.expectedMessageCount(1);
+		Exchange exchange = template.request("direct:listKeys", new Processor() {
+			@Override
+			public void process(Exchange exchange) throws Exception {
+				exchange.getIn().setHeader(IAMConstants.OPERATION, IAMOperations.listAccessKeys);
+			}
+		});
+
+		assertMockEndpointsSatisfied();
+
+		ListAccessKeysResult resultGet = (ListAccessKeysResult) exchange.getIn().getBody();
+		assertEquals(1, resultGet.getAccessKeyMetadata().size());
+		assertEquals("1", resultGet.getAccessKeyMetadata().get(0).getAccessKeyId());
+	}
+
+	@Override
+	protected ClassPathXmlApplicationContext createApplicationContext() {
+		return new ClassPathXmlApplicationContext(
+				"org/apache/camel/component/aws/iam/IAMComponentSpringTest-context.xml");
+	}
+}
\ No newline at end of file
diff --git a/components/camel-aws/src/test/java/org/apache/camel/component/aws/iam/IAMProducerTest.java b/components/camel-aws/src/test/java/org/apache/camel/component/aws/iam/IAMProducerTest.java
new file mode 100644
index 0000000..63089a2
--- /dev/null
+++ b/components/camel-aws/src/test/java/org/apache/camel/component/aws/iam/IAMProducerTest.java
@@ -0,0 +1,74 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws.iam;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.JndiRegistry;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+import com.amazonaws.services.identitymanagement.model.ListAccessKeysResult;
+
+public class IAMProducerTest extends CamelTestSupport {
+
+	@EndpointInject(uri = "mock:result")
+	private MockEndpoint mock;
+
+	@Test
+	public void iamListKeysTest() throws Exception {
+
+		mock.expectedMessageCount(1);
+		Exchange exchange = template.request("direct:listKeys", new Processor() {
+			@Override
+			public void process(Exchange exchange) throws Exception {
+				exchange.getIn().setHeader(IAMConstants.OPERATION, IAMOperations.listAccessKeys);
+			}
+		});
+
+		assertMockEndpointsSatisfied();
+
+		ListAccessKeysResult resultGet = (ListAccessKeysResult) exchange.getIn().getBody();
+		assertEquals(1, resultGet.getAccessKeyMetadata().size());
+		assertEquals("1", resultGet.getAccessKeyMetadata().get(0).getAccessKeyId());
+	}
+
+	@Override
+	protected JndiRegistry createRegistry() throws Exception {
+		JndiRegistry registry = super.createRegistry();
+
+		AmazonIAMClientMock clientMock = new AmazonIAMClientMock();
+
+		registry.bind("amazonIAMClient", clientMock);
+
+		return registry;
+	}
+
+	@Override
+	protected RouteBuilder createRouteBuilder() throws Exception {
+		return new RouteBuilder() {
+			@Override
+			public void configure() throws Exception {
+				from("direct:listKeys").to("aws-iam://test?iamClient=#amazonIAMClient&operation=listAccessKeys")
+						.to("mock:result");
+			}
+		};
+	}
+}
\ No newline at end of file
diff --git a/components/camel-aws/src/test/resources/org/apache/camel/component/aws/iam/IAMComponentSpringTest-context.xml b/components/camel-aws/src/test/resources/org/apache/camel/component/aws/iam/IAMComponentSpringTest-context.xml
new file mode 100644
index 0000000..4c81bf9
--- /dev/null
+++ b/components/camel-aws/src/test/resources/org/apache/camel/component/aws/iam/IAMComponentSpringTest-context.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+    http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
+
+    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
+        <route>
+            <from uri="direct:listKeys"/>
+            <to uri="aws-iam://Test?iamClient=#amazonIAMClient&amp;operation=listAccessKeys"/>
+            <to uri="mock:result"/>
+        </route>
+    </camelContext>
+    
+    <bean id="amazonIAMClient" class="org.apache.camel.component.aws.iam.AmazonIAMClientMock"/>
+</beans>
\ No newline at end of file
diff --git a/platforms/spring-boot/components-starter/camel-aws-starter/src/main/java/org/apache/camel/component/aws/iam/springboot/IAMComponentAutoConfiguration.java b/platforms/spring-boot/components-starter/camel-aws-starter/src/main/java/org/apache/camel/component/aws/iam/springboot/IAMComponentAutoConfiguration.java
new file mode 100644
index 0000000..5c40a2e
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-aws-starter/src/main/java/org/apache/camel/component/aws/iam/springboot/IAMComponentAutoConfiguration.java
@@ -0,0 +1,128 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws.iam.springboot;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.annotation.Generated;
+import org.apache.camel.CamelContext;
+import org.apache.camel.component.aws.iam.IAMComponent;
+import org.apache.camel.spi.ComponentCustomizer;
+import org.apache.camel.spi.HasId;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.apache.camel.spring.boot.ComponentConfigurationProperties;
+import org.apache.camel.spring.boot.util.CamelPropertiesHelper;
+import org.apache.camel.spring.boot.util.ConditionalOnCamelContextAndAutoConfigurationBeans;
+import org.apache.camel.spring.boot.util.GroupCondition;
+import org.apache.camel.spring.boot.util.HierarchicalPropertiesEvaluator;
+import org.apache.camel.util.IntrospectionSupport;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
+
+/**
+ * Generated by camel-package-maven-plugin - do not edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.SpringBootAutoConfigurationMojo")
+@Configuration
+@Conditional({ConditionalOnCamelContextAndAutoConfigurationBeans.class,
+        IAMComponentAutoConfiguration.GroupConditions.class})
+@AutoConfigureAfter(CamelAutoConfiguration.class)
+@EnableConfigurationProperties({ComponentConfigurationProperties.class,
+        IAMComponentConfiguration.class})
+public class IAMComponentAutoConfiguration {
+
+    private static final Logger LOGGER = LoggerFactory
+            .getLogger(IAMComponentAutoConfiguration.class);
+    @Autowired
+    private ApplicationContext applicationContext;
+    @Autowired
+    private CamelContext camelContext;
+    @Autowired
+    private IAMComponentConfiguration configuration;
+    @Autowired(required = false)
+    private List<ComponentCustomizer<IAMComponent>> customizers;
+
+    static class GroupConditions extends GroupCondition {
+        public GroupConditions() {
+            super("camel.component", "camel.component.aws-iam");
+        }
+    }
+
+    @Lazy
+    @Bean(name = "aws-iam-component")
+    @ConditionalOnMissingBean(IAMComponent.class)
+    public IAMComponent configureIAMComponent() throws Exception {
+        IAMComponent component = new IAMComponent();
+        component.setCamelContext(camelContext);
+        Map<String, Object> parameters = new HashMap<>();
+        IntrospectionSupport.getProperties(configuration, parameters, null,
+                false);
+        for (Map.Entry<String, Object> entry : parameters.entrySet()) {
+            Object value = entry.getValue();
+            Class<?> paramClass = value.getClass();
+            if (paramClass.getName().endsWith("NestedConfiguration")) {
+                Class nestedClass = null;
+                try {
+                    nestedClass = (Class) paramClass.getDeclaredField(
+                            "CAMEL_NESTED_CLASS").get(null);
+                    HashMap<String, Object> nestedParameters = new HashMap<>();
+                    IntrospectionSupport.getProperties(value, nestedParameters,
+                            null, false);
+                    Object nestedProperty = nestedClass.newInstance();
+                    CamelPropertiesHelper.setCamelProperties(camelContext,
+                            nestedProperty, nestedParameters, false);
+                    entry.setValue(nestedProperty);
+                } catch (NoSuchFieldException e) {
+                }
+            }
+        }
+        CamelPropertiesHelper.setCamelProperties(camelContext, component,
+                parameters, false);
+        if (ObjectHelper.isNotEmpty(customizers)) {
+            for (ComponentCustomizer<IAMComponent> customizer : customizers) {
+                boolean useCustomizer = (customizer instanceof HasId)
+                        ? HierarchicalPropertiesEvaluator.evaluate(
+                                applicationContext.getEnvironment(),
+                                "camel.component.customizer",
+                                "camel.component.aws-iam.customizer",
+                                ((HasId) customizer).getId())
+                        : HierarchicalPropertiesEvaluator.evaluate(
+                                applicationContext.getEnvironment(),
+                                "camel.component.customizer",
+                                "camel.component.aws-iam.customizer");
+                if (useCustomizer) {
+                    LOGGER.debug("Configure component {}, with customizer {}",
+                            component, customizer);
+                    customizer.customize(component);
+                }
+            }
+        }
+        return component;
+    }
+}
\ No newline at end of file
diff --git a/platforms/spring-boot/components-starter/camel-aws-starter/src/main/java/org/apache/camel/component/aws/iam/springboot/IAMComponentConfiguration.java b/platforms/spring-boot/components-starter/camel-aws-starter/src/main/java/org/apache/camel/component/aws/iam/springboot/IAMComponentConfiguration.java
new file mode 100644
index 0000000..6e2eea6
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-aws-starter/src/main/java/org/apache/camel/component/aws/iam/springboot/IAMComponentConfiguration.java
@@ -0,0 +1,193 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws.iam.springboot;
+
+import javax.annotation.Generated;
+import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClient;
+import org.apache.camel.component.aws.iam.IAMOperations;
+import org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * The aws-iam is used for managing Amazon IAM
+ * 
+ * Generated by camel-package-maven-plugin - do not edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.SpringBootAutoConfigurationMojo")
+@ConfigurationProperties(prefix = "camel.component.aws-iam")
+public class IAMComponentConfiguration
+        extends
+            ComponentConfigurationPropertiesCommon {
+
+    /**
+     * Whether to enable auto configuration of the aws-iam component. This is
+     * enabled by default.
+     */
+    private Boolean enabled;
+    /**
+     * The AWS MQ default configuration
+     */
+    private IAMConfigurationNestedConfiguration configuration;
+    /**
+     * Amazon AWS Access Key
+     */
+    private String accessKey;
+    /**
+     * Amazon AWS Secret Key
+     */
+    private String secretKey;
+    /**
+     * The region in which MQ client needs to work
+     */
+    private String region;
+    /**
+     * Whether the component should resolve property placeholders on itself when
+     * starting. Only properties which are of String type can use property
+     * placeholders.
+     */
+    private Boolean resolvePropertyPlaceholders = true;
+
+    public IAMConfigurationNestedConfiguration getConfiguration() {
+        return configuration;
+    }
+
+    public void setConfiguration(
+            IAMConfigurationNestedConfiguration configuration) {
+        this.configuration = configuration;
+    }
+
+    public String getAccessKey() {
+        return accessKey;
+    }
+
+    public void setAccessKey(String accessKey) {
+        this.accessKey = accessKey;
+    }
+
+    public String getSecretKey() {
+        return secretKey;
+    }
+
+    public void setSecretKey(String secretKey) {
+        this.secretKey = secretKey;
+    }
+
+    public String getRegion() {
+        return region;
+    }
+
+    public void setRegion(String region) {
+        this.region = region;
+    }
+
+    public Boolean getResolvePropertyPlaceholders() {
+        return resolvePropertyPlaceholders;
+    }
+
+    public void setResolvePropertyPlaceholders(
+            Boolean resolvePropertyPlaceholders) {
+        this.resolvePropertyPlaceholders = resolvePropertyPlaceholders;
+    }
+
+    public static class IAMConfigurationNestedConfiguration {
+        public static final Class CAMEL_NESTED_CLASS = org.apache.camel.component.aws.iam.IAMConfiguration.class;
+        /**
+         * To use a existing configured AWS IAM as client
+         */
+        private AmazonIdentityManagementClient iamClient;
+        /**
+         * Amazon AWS Access Key
+         */
+        private String accessKey;
+        /**
+         * Amazon AWS Secret Key
+         */
+        private String secretKey;
+        /**
+         * The operation to perform
+         */
+        private IAMOperations operation;
+        /**
+         * To define a proxy host when instantiating the KMS client
+         */
+        private String proxyHost;
+        /**
+         * To define a proxy port when instantiating the KMS client
+         */
+        private Integer proxyPort;
+        /**
+         * The region in which KMS client needs to work
+         */
+        private String region;
+
+        public AmazonIdentityManagementClient getIamClient() {
+            return iamClient;
+        }
+
+        public void setIamClient(AmazonIdentityManagementClient iamClient) {
+            this.iamClient = iamClient;
+        }
+
+        public String getAccessKey() {
+            return accessKey;
+        }
+
+        public void setAccessKey(String accessKey) {
+            this.accessKey = accessKey;
+        }
+
+        public String getSecretKey() {
+            return secretKey;
+        }
+
+        public void setSecretKey(String secretKey) {
+            this.secretKey = secretKey;
+        }
+
+        public IAMOperations getOperation() {
+            return operation;
+        }
+
+        public void setOperation(IAMOperations operation) {
+            this.operation = operation;
+        }
+
+        public String getProxyHost() {
+            return proxyHost;
+        }
+
+        public void setProxyHost(String proxyHost) {
+            this.proxyHost = proxyHost;
+        }
+
+        public Integer getProxyPort() {
+            return proxyPort;
+        }
+
+        public void setProxyPort(Integer proxyPort) {
+            this.proxyPort = proxyPort;
+        }
+
+        public String getRegion() {
+            return region;
+        }
+
+        public void setRegion(String region) {
+            this.region = region;
+        }
+    }
+}
\ No newline at end of file
diff --git a/platforms/spring-boot/components-starter/camel-aws-starter/src/main/resources/META-INF/spring.factories b/platforms/spring-boot/components-starter/camel-aws-starter/src/main/resources/META-INF/spring.factories
index aaa12f1..e2d56a1 100644
--- a/platforms/spring-boot/components-starter/camel-aws-starter/src/main/resources/META-INF/spring.factories
+++ b/platforms/spring-boot/components-starter/camel-aws-starter/src/main/resources/META-INF/spring.factories
@@ -29,7 +29,9 @@ org.apache.camel.component.aws.ddb.springboot.DdbComponentAutoConfiguration,\
 org.apache.camel.component.aws.firehose.springboot.KinesisFirehoseComponentAutoConfiguration,\
 org.apache.camel.component.aws.lambda.springboot.LambdaComponentAutoConfiguration,\
 org.apache.camel.component.aws.mq.springboot.MQComponentAutoConfiguration,\
-org.apache.camel.component.aws.kms.springboot.KMSComponentAutoConfiguration
+org.apache.camel.component.aws.kms.springboot.KMSComponentAutoConfiguration,\
+org.apache.camel.component.aws.iam.springboot.IAMComponentAutoConfiguration
+