Interoperating with S3 from Golang
package main
import (
"fmt"
"log"
"os"
"path/filepath"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
)
func main() {
// export AWS_REGION=ap-northeast-1
// export AWS_ACCESS_KEY_ID=AKIAJFMLIYDGYVCXX3MA
// export AWS_SECRET_ACCESS_KEY=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
sess, err := session.NewSession()
if err != nil {
log.Println("failed to start the session; check AWS environment variables: ", err)
}
listBuckets(sess)
// bucketName := "com.les"
// testFileURL := "./status.html"
// uploadObject(sess, bucketName, testFileURL)
// listObjects(sess, bucketName)
// _, key := filepath.Split(testFileURL)
// fetchItem(sess, bucketName, key)
}
func listBuckets(sess *session.Session) {
svc := s3.New(sess)
res, err := svc.ListBuckets(nil)
if err != nil {
log.Println("failed to list buckets: ", err.Error())
}
log.Println("Buckets:")
for _, b := range res.Buckets {
fmt.Printf("* %s created on %s\n\n", aws.StringValue(b.Name), aws.TimeValue(b.CreationDate))
}
}
func listObjects(sess *session.Session, bucketName string) {
svc := s3.New(sess)
res, err := svc.ListObjects(&s3.ListObjectsInput{
Bucket: aws.String(bucketName)})
if err != nil {
log.Printf("failed to list objects in bucket %s: %v\n", bucketName, err)
}
log.Printf("Objects in %s: \n", bucketName)
for _, item := range res.Contents {
fmt.Printf("%+v\n", item)
}
}
func listObjectsWithPrefix(sess *session.Session, bucketName string) {
svc := s3.New(sess)
res, err := svc.ListObjects(&s3.ListObjectsInput{Bucket: aws.String(bucketName)})
if err != nil {
log.Printf("failed to list objects in bucket %s: %v\n", bucketName, err)
}
log.Printf("Objects in %s: \n", bucketName)
for _, item := range res.Contents {
fmt.Printf("%+v\n", item)
}
}
func uploadObject(sess *session.Session, bucketName, srcURL string) {
_, filename := filepath.Split(srcURL)
file, err := os.Open(srcURL)
if err != nil {
log.Printf("Unable to open file %s: %v\n", filename, err)
}
defer file.Close()
uploader := s3manager.NewUploader(sess)
_, err = uploader.Upload(&s3manager.UploadInput{
Bucket: aws.String(bucketName),
Key: aws.String(filename),
Body: file,
})
if err != nil {
log.Printf("Unable to upload %q to %q, %v", filename, bucketName, err)
return
}
log.Printf("Successfully uploaded %q to %q\n", filename, bucketName)
}
func fetchItem(sess *session.Session, bucketName, key string) {
downloader := s3manager.NewDownloader(sess)
filename := "status_from_s3.html"
file, err := os.Create(filepath.Join("support", filename))
if err != nil {
log.Printf("Unable to open file %s: %v\n", filename, err)
}
defer file.Close()
sz, err := downloader.Download(file, &s3.GetObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(key),
})
if err != nil {
log.Printf("Unable to download %q from %q: %v", filename, bucketName, err)
}
fmt.Println("Downloaded", file.Name(), sz, "bytes")
}