In this example we are using IAM permissions assigned to Ec2 to be able to write to s3
Step 1 : update EC2 IAM role to allow s3 write
Step 2 : include Maven dependency for s3
entire aws sdk can be added as dependency that pull unwanted baggage of jars or specific module can be added like s3
Pom file
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.3.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Angel.SR6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>2.0.0-preview-4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.0.0-preview-4</version>
</dependency>
Step 3 : Add Code to write to s3
Java Code
package com.hac.utility.s3.record;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Profile;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import software.amazon.awssdk.AmazonClientException;
import software.amazon.awssdk.AmazonServiceException;
import software.amazon.awssdk.auth.InstanceProfileCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.StorageClass;
import software.amazon.awssdk.sync.RequestBody;
@Component
@Profile("!local")
public class WriteToS3Impl extends BaseMockPersistence implements WriteReqResponse {
private static final Logger LOGGER = LoggerFactory.getLogger(WriteToS3Impl.class);
private S3Client s3;
private Region region = Region.EU_WEST_1;
public WriteToS3Impl() {
System.out.println("s3 Building ****************************************");
InstanceProfileCredentialsProvider credentialsProvider = null;
try {
credentialsProvider = new InstanceProfileCredentialsProvider();
// Verify we can fetch credentials from the provider
credentialsProvider.getCredentials();
LOGGER.info("Obtained credentials from the IMDS.");
} catch (AmazonClientException e) {
LOGGER.info("Unable to obtain credentials from the IMDS ", e);
}
s3 = S3Client.builder().credentialsProvider(credentialsProvider).region(region).build();
System.out.println("s3 Instantiated ****************************************");
}
@Async
@Override
public void write(String req, String response) {
LOGGER.info("**** >>>s3 Write called ");
// ObjectMetadata obm = new ObjectMetadata();
// obm.setContentLength(response.length());
String fileName = getFileName(req);
File responseFl = new File(fileName);
File reqFile = new File(fileName);
try {
FileWriter fileWriter = new FileWriter(responseFl);
fileWriter.write(response);
fileWriter.flush(); fileWriter.close();
PutObjectRequest putRespXML = PutObjectRequest.builder().bucket(emulatorData.getSroot()).key(emulatorData.getResps3Path()+fileName).storageClass(StorageClass.REDUCED_REDUNDANCY).build();
s3.putObject(putRespXML,RequestBody.of(Files.readAllBytes(responseFl.toPath())));
LOGGER.info("**** >>> responseFl {} size {} put to s3",emulatorData.getSroot()+emulatorData.getResps3Path()+fileName,responseFl.length());
responseFl = null;
FileWriter reqFileWriter = new FileWriter(reqFile);
reqFileWriter.write(req);
reqFileWriter.flush(); reqFileWriter.close();
PutObjectRequest putRequestXml =PutObjectRequest.builder().bucket(emulatorData.getSroot()).key(emulatorData.getReqs3Path()+fileName).storageClass(StorageClass.REDUCED_REDUNDANCY).build();
s3.putObject(putRequestXml, RequestBody.of(Files.readAllBytes(reqFile.toPath())));
LOGGER.info("**** >>> reqFile {} size {} put to s3",emulatorData.getSroot()+emulatorData.getReqs3Path()+fileName,reqFile.length());
reqFile = null;
} catch (AmazonServiceException | IOException e) {
System.err.println(e.getMessage());
}
}
}