FAQinghere
9/6/2017 - 2:07 AM

Go S3

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")

}