diff --git a/spring-vault-core/pom.xml b/spring-vault-core/pom.xml
index 66e03f72..b86f376b 100644
--- a/spring-vault-core/pom.xml
+++ b/spring-vault-core/pom.xml
@@ -95,6 +95,22 @@
+
+ com.amazonaws
+ aws-java-sdk-core
+ true
+
+
+ software.amazon.ion
+ ion-java
+
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-cbor
+
+
+
+
org.springframeworkspring-test
diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/AwsEc2AuthenticationOptions.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/AwsEc2AuthenticationOptions.java
index c3693863..8007a748 100644
--- a/spring-vault-core/src/main/java/org/springframework/vault/authentication/AwsEc2AuthenticationOptions.java
+++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/AwsEc2AuthenticationOptions.java
@@ -195,7 +195,7 @@ public class AwsEc2AuthenticationOptions {
/**
* Build a new {@link AwsEc2AuthenticationOptions} instance.
*
- * @return a new {@link AppIdAuthenticationOptions}.
+ * @return a new {@link AwsEc2AuthenticationOptions}.
*/
public AwsEc2AuthenticationOptions build() {
diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/AwsIamAuthentication.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/AwsIamAuthentication.java
new file mode 100644
index 00000000..92271804
--- /dev/null
+++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/AwsIamAuthentication.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright 2017 the original author or authors.
+ *
+ * Licensed 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.springframework.vault.authentication;
+
+import java.io.ByteArrayInputStream;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import com.amazonaws.DefaultRequest;
+import com.amazonaws.auth.AWS4Signer;
+import com.amazonaws.http.HttpMethodName;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.util.Assert;
+import org.springframework.util.Base64Utils;
+import org.springframework.util.StringUtils;
+import org.springframework.vault.VaultException;
+import org.springframework.vault.client.VaultResponses;
+import org.springframework.vault.support.VaultResponse;
+import org.springframework.vault.support.VaultToken;
+import org.springframework.web.client.HttpStatusCodeException;
+import org.springframework.web.client.RestOperations;
+
+/**
+ * AWS IAM authentication using signed HTTP requests to query the current identity.
+ *
+ * AWS IAM authentication creates a {@link AWS4Signer signed} HTTP request that is
+ * executed by Vault to get the identity of the signer using AWS STS
+ * {@literal GetCallerIdentity}. A signature requires
+ * {@link com.amazonaws.auth.AWSCredentials} to calculate the signature.
+ *
+ * This authentication requires AWS' Java SDK to sign request parameters and calculate the
+ * signature key. Using an appropriate {@link com.amazonaws.auth.AWSCredentialsProvider}
+ * allows authentication within AWS-EC2 instances with an assigned profile, within ECS and
+ * Lambda instances.
+ *
+ * @author Mark Paluch
+ * @since 1.1
+ * @see AwsIamAuthenticationOptions
+ * @see com.amazonaws.auth.AWSCredentialsProvider
+ * @see RestOperations
+ * @see Auth Backend: aws
+ * (IAM)
+ * @see AWS:
+ * GetCallerIdentity
+ */
+public class AwsIamAuthentication implements ClientAuthentication {
+
+ private static final Log logger = LogFactory.getLog(AwsIamAuthentication.class);
+
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+ private static final String REQUEST_BODY = "Action=GetCallerIdentity&Version=2011-06-15";
+
+ private static final String REQUEST_BODY_BASE64_ENCODED = Base64Utils
+ .encodeToString(REQUEST_BODY.getBytes());
+
+ private final AwsIamAuthenticationOptions options;
+
+ private final RestOperations vaultRestOperations;
+
+ /**
+ * Create a new {@link AwsIamAuthentication} specifying
+ * {@link AwsIamAuthenticationOptions}, a Vault and an AWS-Metadata-specific
+ * {@link RestOperations} .
+ *
+ * @param options must not be {@literal null}.
+ * @param vaultRestOperations must not be {@literal null}.
+ */
+ public AwsIamAuthentication(AwsIamAuthenticationOptions options,
+ RestOperations vaultRestOperations) {
+
+ Assert.notNull(options, "AwsIamAuthenticationOptions must not be null");
+ Assert.notNull(vaultRestOperations, "Vault RestOperations must not be null");
+
+ this.options = options;
+ this.vaultRestOperations = vaultRestOperations;
+ }
+
+ @Override
+ public VaultToken login() throws VaultException {
+ return createTokenUsingAwsIam();
+ }
+
+ @SuppressWarnings("unchecked")
+ private VaultToken createTokenUsingAwsIam() {
+
+ Map login = new HashMap<>();
+
+ login.put("iam_http_request_method", "POST");
+ login.put("iam_request_url", Base64Utils.encodeToString(options.getEndpointUri()
+ .toString().getBytes()));
+ login.put("iam_request_body", REQUEST_BODY_BASE64_ENCODED);
+
+ String headerJson = getSignedHeaders(options);
+
+ login.put("iam_request_headers",
+ Base64Utils.encodeToString(headerJson.getBytes()));
+
+ if (!StringUtils.isEmpty(options.getRole())) {
+ login.put("role", options.getRole());
+ }
+
+ try {
+
+ VaultResponse response = this.vaultRestOperations.postForObject(
+ "auth/{mount}/login", login, VaultResponse.class, options.getPath());
+
+ Assert.state(response != null && response.getAuth() != null,
+ "Auth field must not be null");
+
+ if (logger.isDebugEnabled()) {
+
+ if (response.getAuth().get("metadata") instanceof Map) {
+ Map
+
+
+ com.amazonaws
+ aws-java-sdk-core
+ 1.11.161
+ true
+
+
diff --git a/src/main/asciidoc/reference/authentication.adoc b/src/main/asciidoc/reference/authentication.adoc
index c7bd4c99..da8aa30b 100644
--- a/src/main/asciidoc/reference/authentication.adoc
+++ b/src/main/asciidoc/reference/authentication.adoc
@@ -277,6 +277,76 @@ it in `AwsEc2AuthenticationOptions`.
See also: https://www.vaultproject.io/docs/auth/aws-ec2.html[Vault Documentation: Using the AWS-EC2 auth backend]
+[[vault.authentication.awsiam]]
+== AWS-IAM authentication
+
+The https://www.vaultproject.io/docs/auth/aws.html[aws]
+auth backend allows Vault login by using existing AWS IAM credentials.
+
+AWS IAM authentication creates a signed HTTP request that is
+executed by Vault to get the identity of the signer using AWS STS
+`GetCallerIdentity` method. AWSv4 signatures require IAM credentials.
+
+IAM credentials can be obtained from either the runtime environment
+or supplied externally. Runtime environments such as AWS-EC2,
+Lambda and ECS with assigned IAM principals do not require client-specific
+configuration of credentials but can obtain these from its metadata source.
+
+====
+[source,java]
+----
+@Configuration
+class AppConfig extends AbstractVaultConfiguration {
+
+ // …
+
+ @Override
+ public ClientAuthentication clientAuthentication() {
+
+ AwsIamAuthenticationOptions options = AwsIamAuthenticationOptions.builder()
+ .credentials(new BasicAWSCredentials(…)).build();
+
+ return new AwsIamAuthentication(options, restOperations());
+ }
+
+ // …
+}
+----
+====
+
+.Using AWS-EC2 instance profile as credentials source
+====
+[source,java]
+----
+@Configuration
+class AppConfig extends AbstractVaultConfiguration {
+
+ // …
+
+ @Override
+ public ClientAuthentication clientAuthentication() {
+
+ AwsIamAuthenticationOptions options = AwsIamAuthenticationOptions.builder()
+ .credentialsProvider(InstanceProfileCredentialsProvider.getInstance()).build();
+
+ return new AwsIamAuthentication(options, restOperations());
+ }
+
+ // …
+}
+----
+====
+
+`AwsIamAuthentication` requires the AWS Java SDK dependency (`com.amazonaws:aws-java-sdk-core`)
+as the authentication implementation uses AWS SDK types for credentials and request signing.
+
+You can configure the authentication via `AwsIamAuthenticationOptions`.
+
+See also:
+
+* https://www.vaultproject.io/docs/auth/aws.html[Vault Documentation: Using the AWS auth backend]
+* http://docs.aws.amazon.com/STS/latest/APIReference/API_GetCallerIdentity.html[AWS Documentation: STS GetCallerIdentity]
+
[[vault.authentication.clientcert]]
== TLS certificate authentication