Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE

1. Overview

Amazon Simple Storage Service (Amazon S3) is a widely used storage service that provides scalable, secure, and durable object storage. There are use cases when we need to update an Existing Amazon S3 Object. In S3, objects are immutable, meaning we cannot modify the content of an object directly. However, we can overwrite the object with new content, effectively “updating” it.

In this tutorial, we learn how to replace the existing file content with newer content for the same AWS S3 path using AWS Java SDK.

2. Prerequisites

First, we need to ensure the AWS SDK Maven dependency package is incorporated into the project:

<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>s3</artifactId>
    <version>2.24.9</version>
</dependency>

The latest version of the package can be found online.

To use AWS SDK, we’ll need a few things:

  1. AWS Account: we need an Amazon Web Services account. If we don’t have one, we can go ahead and create an account.
  2. AWS Security Credentials: These are our access keys that allow us to make programmatic calls to AWS API actions. We can get these credentials in two ways, either by using AWS root account credentials from the access keys section of the Security Credentials page, or by using IAM user credentials from the IAM console.
  3. Choosing AWS Region: We also have to select the AWS region(s) where we want to store our Amazon S3 data. Keep in mind that S3 storage prices vary by region. For more details, head over to the official documentation. In this tutorial, we’ll use US East (Ohio, region us-east-2).

For a comprehensive guide on credentials setup, let’s refer to the Official AWS Documentation

3. Steps to Update an S3 Object

3.1. Initialize the S3 Client

First, we need to create a client connection to access the Amazon S3 web service. We’ll use the AmazonS3 interface for this purpose:

AWSCredentials credentials = new BasicAWSCredentials(
        "AWS AccessKey",
        "AWS secretKey"
);

Then we’ll configure the client:

AmazonS3 s3client = AmazonS3ClientBuilder.standard()
        .withRegion(Regions.fromName("us-east-1"))
        .withCredentials(new AWSStaticCredentialsProvider(credentials))
        .build();

3.2. Upload New Object to S3

Now we can upload the file to the S3 bucket in the method putObject(), using AWS Java SDK:

PutObjectRequest request = PutObjectRequest.builder()
    .bucket(bucketName)
    .key(key)
    .build();

return s3Client.putObject(request, Path.of(file.toURI()));

Below is the code snippet to invoke the above code:

s3Service.putObject(
    AWS_BUCKET,
    "Document/hello.txt",
    new File("/Users/user/Document/hello.txt")
);

3.3. Upload (Overwrite) the Object

Since objects in S3 are immutable, “updating” an object involves overwriting the object with new content. So for updating, we need to call the same putObject() method with the same set of parameters that were used for adding the document:

public PutObjectResponse updateObject(String bucketName, String key, java.io.File file) {
    return this.putObject(bucketName, key, file);
}

This code will replace the existing object with the new content provided. If the object with the given key doesn’t exist, S3 will create a new object.

3.4. (Optional) Verify the Update

We might want to verify that the object was successfully updated. One way to do this is by retrieving the object’s metadata and checking the lastModified date or by computing the object’s checksum and comparing it against the expected value.

HeadObjectRequest req = HeadObjectRequest.builder()
    .bucket(bucketName)
    .key(key)
    .build();

HeadObjectResponse response = s3Client.headObject(request);
System.out.println("Last Modified: " + response.lastModified());

4. Important Considerations

We also need to remember that in S3, overwriting an object is effectively a PUT operation, which may incur costs. Always be aware of the cost implications when performing operations on S3.

If the bucket has versioning enabled, overwriting an object will not delete the old version. Instead, we’ll have multiple versions of the object. Each version has a unique ID; we can retrieve any previous version if required.

Finally, if metadata is associated with the object, be aware that overwriting the object will replace the old metadata with the new one provided during the PUT operation. We must explicitly set it in the request if we want to retain the old metadata.

5. Conclusion

While we cannot directly modify an S3 object’s content, overwriting the object with new content is straightforward using the AWS SDK for Java. Always keep best practices in mind, such as not hardcoding credentials and being aware of the cost implications of operations. With these steps, we can confidently manage and update S3 objects using Java.

The full implementation of this article can be found over on GitHub.

Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE
res – Microservices (eBook) (cat=Cloud/Spring Cloud)
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.