Daily Archives: February 9, 2017


AWS Services / Amazon Simple Storage Service S3 object tagging

FCB8457B-EE6C-46EE-A248-56C3729C701DS3 Object Tagging is a new feature introduced by AWS on December 2016. A really nice feature that allows you to track your costs on your invoice by your tags.

For example, you can add a tag by client name, and a tag by department: development, qa, or production.

I was migrating some objects from folders; however this feature to upload a folder (or a list of files) with tags was not available throw the “aws/aws-sdk-java version 1.11.87” .

So, the solution is to add an ObjectTaggingProvider (similar to the ObjectMetadataProvider) and modify the TransferManager to accept the ObjectTaggingProvider as a parameter in uploadDirectory method.

Then, on the client, we can implement the taggingProvider:

import com.amazonaws.auth.SystemPropertiesCredentialsProvider
import com.amazonaws.services.s3.model.ObjectMetadata
import com.amazonaws.services.s3.model.ObjectTagging
import com.amazonaws.services.s3.model.Tag
import com.amazonaws.services.s3.transfer.MultipleFileUpload
import com.amazonaws.services.s3.transfer.ObjectMetadataProvider
import com.amazonaws.services.s3.transfer.ObjectTaggingProvider
import com.amazonaws.services.s3.transfer.TransferManagerWithTagging
import com.amazonaws.services.s3.transfer.TransferProgress
class S3FolderMigrationClientWithTagging {
def loadMultipleFiles = { String directoryName ->
ObjectTaggingProvider taggingProvider = new ObjectTaggingProvider() {
ObjectTagging provideObjectTags(File file){
List<Tag> tagList = new ArrayList<Tag>()
tagList.add(new Tag(‘costCenter', costCenterName))
tagList.add(new Tag(‘client', clientName))
new ObjectTagging(tagList)
}
}
File directory = new File("./${directoryName}" )
if(!directory.isDirectory()){
directory.mkdir()
}
MultipleFileUpload multipleFileUpload = transferManager.uploadDirectory(bucketName, contextName, directory, false, metadataProvider, taggingProvider)
TransferProgress transferProgress = multipleFileUpload.progress
while (!multipleFileUpload.done){
Thread.sleep(1000)
}
directory.delete()
}
}

references:

http://docs.aws.amazon.com/AmazonS3/latest/dev/object-tagging.html

https://github.com/aws/aws-sdk-java/issues/1005

https://github.com/aws/aws-sdk-java/pull/1011