diff --git a/spring-cloud/spring-cloud-aws/README.md b/spring-cloud/spring-cloud-aws/README.md
index c5f58159c8..1340712c7a 100644
--- a/spring-cloud/spring-cloud-aws/README.md
+++ b/spring-cloud/spring-cloud-aws/README.md
@@ -19,3 +19,8 @@ to write the following in `application.properties`:
cloud.aws.rds.spring-cloud-test-db
cloud.aws.rds.spring-cloud-test-db.password=se3retpass
```
+Multiple application classes are available under this project. To launch InstanceProfileAwsApplication application, replace `start-class` under `pom.xml`:
+
+```
+com.baeldung.spring.cloud.aws.InstanceProfileAwsApplication
+```
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-aws/pom.xml b/spring-cloud/spring-cloud-aws/pom.xml
index 632e050d92..b27b6c0d18 100644
--- a/spring-cloud/spring-cloud-aws/pom.xml
+++ b/spring-cloud/spring-cloud-aws/pom.xml
@@ -19,6 +19,7 @@
+ com.baeldung.spring.cloud.aws.SpringCloudAwsApplication
UTF-8
UTF-8
1.8
diff --git a/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/InstanceProfileAwsApplication.java b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/InstanceProfileAwsApplication.java
new file mode 100644
index 0000000000..80c0851a6f
--- /dev/null
+++ b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/InstanceProfileAwsApplication.java
@@ -0,0 +1,60 @@
+package com.baeldung.spring.cloud.aws;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.UUID;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+import com.baeldung.spring.cloud.aws.s3.SpringCloudS3Service;
+
+@Configuration
+@EnableAutoConfiguration
+@ComponentScan("com.baeldung.spring.cloud.aws.s3")
+public class InstanceProfileAwsApplication {
+
+ private static final Logger logger = LoggerFactory.getLogger(InstanceProfileAwsApplication.class);
+ private static final String applicationConfig = "spring.config.name:application-instance-profile";
+
+ private static String bucketName;
+ private static String fileName = "sample-file.txt";
+
+ private static void setupResources() {
+ bucketName = "baeldung-test-" + UUID.randomUUID()
+ .toString();
+ try {
+ Files.write(Paths.get(fileName), "Hello World!".getBytes());
+ } catch (IOException e) {
+ logger.error(e.getMessage(), e);
+ }
+ }
+
+ public static void main(String[] args) {
+ setupResources();
+ if (!new File(fileName).exists()) {
+ logger.warn("Not able to create {} file. Check your folder permissions.", fileName);
+ System.exit(1);
+ }
+
+ SpringApplication application = new SpringApplicationBuilder(InstanceProfileAwsApplication.class).properties(applicationConfig)
+ .build();
+ ConfigurableApplicationContext context = application.run(args);
+ SpringCloudS3Service service = context.getBean(SpringCloudS3Service.class);
+
+ // S3 bucket operations
+ service.createBucket(bucketName);
+ service.uploadObject(bucketName, fileName);
+ service.downloadObject(bucketName, fileName);
+ service.deleteBucket(bucketName);
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3Service.java b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3Service.java
new file mode 100644
index 0000000000..a0fdce2143
--- /dev/null
+++ b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3Service.java
@@ -0,0 +1,64 @@
+package com.baeldung.spring.cloud.aws.s3;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.amazonaws.services.s3.AmazonS3;
+import com.amazonaws.services.s3.model.ListObjectsV2Result;
+import com.amazonaws.services.s3.model.S3ObjectSummary;
+
+@Component
+public class SpringCloudS3Service {
+
+ private static final Logger logger = LoggerFactory.getLogger(SpringCloudS3Service.class);
+
+ @Autowired
+ AmazonS3 amazonS3;
+
+ @Autowired
+ SpringCloudS3 springCloudS3;
+
+ public void createBucket(String bucketName) {
+ logger.debug("Creating S3 bucket: {}", bucketName);
+ amazonS3.createBucket(bucketName);
+ logger.info("{} bucket created successfully", bucketName);
+ }
+
+ public void downloadObject(String bucketName, String objectName) {
+ String s3Url = "s3://" + bucketName + "/" + objectName;
+ try {
+ springCloudS3.downloadS3Object(s3Url);
+ logger.info("{} file download result: {}", objectName, new File(objectName).exists());
+ } catch (IOException e) {
+ logger.error(e.getMessage(), e);
+ }
+ }
+
+ public void uploadObject(String bucketName, String objectName) {
+ String s3Url = "s3://" + bucketName + "/" + objectName;
+ File file = new File(objectName);
+ try {
+ springCloudS3.uploadFileToS3(file, s3Url);
+ logger.info("{} file uploaded to S3", objectName);
+ } catch (IOException e) {
+ logger.error(e.getMessage(), e);
+ }
+ }
+
+ public void deleteBucket(String bucketName) {
+ logger.trace("Deleting S3 objects under {} bucket...", bucketName);
+ ListObjectsV2Result listObjectsV2Result = amazonS3.listObjectsV2(bucketName);
+ for (S3ObjectSummary objectSummary : listObjectsV2Result.getObjectSummaries()) {
+ logger.info("Deleting S3 object: {}", objectSummary.getKey());
+ amazonS3.deleteObject(bucketName, objectSummary.getKey());
+ }
+ logger.info("Deleting S3 bucket: {}", bucketName);
+ amazonS3.deleteBucket(bucketName);
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-aws/src/main/resources/InstanceProfileFormation.yaml b/spring-cloud/spring-cloud-aws/src/main/resources/InstanceProfileFormation.yaml
new file mode 100644
index 0000000000..f8c3d3c915
--- /dev/null
+++ b/spring-cloud/spring-cloud-aws/src/main/resources/InstanceProfileFormation.yaml
@@ -0,0 +1,78 @@
+AWSTemplateFormatVersion: 2010-09-09
+Metadata:
+ 'AWS::CloudFormation::Designer':
+ 157e7d5f-5cb3-4a23-a50c-97e7f6c57173:
+ size:
+ width: 60
+ height: 60
+ position:
+ x: 450
+ 'y': 90
+ z: 0
+ embeds: []
+ 9bbaaa55-9cba-4555-a7c6-fb6ac248fd3a:
+ size:
+ width: 60
+ height: 60
+ position:
+ x: 260
+ 'y': 90
+ z: 0
+ embeds: []
+ isassociatedwith:
+ - 157e7d5f-5cb3-4a23-a50c-97e7f6c57173
+ a7348729-a594-4dca-9b0a-e1c8d777dc3b:
+ size:
+ width: 60
+ height: 60
+ position:
+ x: 70
+ 'y': 90
+ z: 0
+ embeds: []
+Resources:
+ IAMRoleBaeldung:
+ Type: 'AWS::IAM::Role'
+ Properties:
+ AssumeRolePolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Principal:
+ Service:
+ - ec2.amazonaws.com
+ Action:
+ - 'sts:AssumeRole'
+ ManagedPolicyArns:
+ - 'arn:aws:iam::aws:policy/AmazonS3FullAccess'
+ Metadata:
+ 'AWS::CloudFormation::Designer':
+ id: 157e7d5f-5cb3-4a23-a50c-97e7f6c57173
+ InstanceProfileBaeldung:
+ Type: 'AWS::IAM::InstanceProfile'
+ Properties:
+ Roles:
+ - !Ref IAMRoleBaeldung
+ Metadata:
+ 'AWS::CloudFormation::Designer':
+ id: 9bbaaa55-9cba-4555-a7c6-fb6ac248fd3a
+ EC2Instance:
+ Type: 'AWS::EC2::Instance'
+ Properties:
+ ImageId: ami-2581aa40
+ InstanceType: t2.micro
+ IamInstanceProfile: !Ref InstanceProfileBaeldung
+ KeyName: Satish-Ohio
+ UserData: !Base64
+ 'Fn::Join':
+ - ''
+ - - |
+ #!/bin/bash
+ - |
+ apt -y install openjdk-8-jre-headless
+ Metadata:
+ 'AWS::CloudFormation::Designer':
+ id: a7348729-a594-4dca-9b0a-e1c8d777dc3b
+ DependsOn:
+ - InstanceProfileBaeldung
+
diff --git a/spring-cloud/spring-cloud-aws/src/main/resources/application-instance-profile.properties b/spring-cloud/spring-cloud-aws/src/main/resources/application-instance-profile.properties
new file mode 100644
index 0000000000..23ca09c85c
--- /dev/null
+++ b/spring-cloud/spring-cloud-aws/src/main/resources/application-instance-profile.properties
@@ -0,0 +1,14 @@
+# Don't try to create DataSouce when running tests which don't need a DataSource
+spring.autoconfigure.exclude=\
+ org.springframework.cloud.aws.autoconfigure.jdbc.AmazonRdsDatabaseAutoConfiguration,\
+ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
+cloud.aws.region.auto=true
+
+# Load instance profile credentials
+cloud.aws.credentials.instanceProfile=true
+
+# Disable auto cloud formation
+cloud.aws.stack.auto=false
+
+# Disable web environment
+spring.main.web-environment=false
\ No newline at end of file