Thom Nichols

Thom

Technology is evolution outside the gene pool

Upload to S3 with Groovy

So, uploading to S3 is not always as simple as it should be. Here's a completely self-contained Groovy script that can upload files to your S3 bucket, plus provide a signed link to access the uploaded file.

The script uses Groovy's Grab macro to download the JetS3t library which does the heavy lifting.

#!/opt/groovy/bin/groovy
/* Script to manipulate S3 objects. 
 * @author Tom Nichols
 * @see http://blog.thomnichols.org
 * @see http://jets3t.s3.amazonaws.com/api/org/jets3t/service/impl/rest/httpclient/RestS3Service.html
 */

import org.jets3t.service.impl.rest.httpclient.RestS3Service
import org.jets3t.service.security.AWSCredentials
import org.jets3t.service.model.*

bucketName =  'CHANGEME'
accessKey =  'CHANGEME'
secretKey =  'CHANGEME'
folder =   'CHANGEME' // optional folder name before the file

@Grab(group='net.java.dev.jets3t',module='jets3t',version='[0.6.1,)')
public putS3() {}

def login = new AWSCredentials( accessKey, secretKey )
def expiry = new GregorianCalendar( 2011,0,1 ).time
def s3 = new RestS3Service( login ) 
def bucket = new S3Bucket( bucketName )

args.each { fileName ->
 def key = "$folder/$fileName"
// s3.deleteObject bucketName, key 
 def s3obj = new S3Object( bucket, new File( fileName ) )
 s3obj.key = key 
 println "\nUploading $fileName to $bucketName/$key"
 s3obj = s3.putObject( bucket, s3obj )
 
 def link = s3.createSignedGetUrl( bucketName, key, login, expiry, false )
 println "$fileName : $link"
} 

Just change the bucket name, key and folder at the top of the script, or optionally you could pull them in via system properties or environment variables. Enjoy.

Category: AWS Groovy Java S3