package s3packr import ( "context" "io" "os" "path/filepath" "time" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/session" "github.com/gobuffalo/envy" "github.com/gobuffalo/packr/v2/jam/parser" "github.com/gobuffalo/packr/v2/jam/store" "github.com/gobuffalo/packr/v2/plog" "github.com/google/go-cloud/blob" "github.com/google/go-cloud/blob/s3blob" "github.com/pkg/errors" ) var _ store.Store = &S3Store{} type S3Store struct { *store.Disk } func New(box *parser.Box) *S3Store { return &S3Store{ Disk: store.NewDisk(box.AbsPath, box.Package), } } func (s *S3Store) Pack(box *parser.Box) error { plog.Debug(s, "Pack", "box", box) return filepath.Walk(box.AbsPath, func(path string, info os.FileInfo, err error) error { if info.IsDir() { return nil } return s.upload(box.Name, path) }) } func (s *S3Store) upload(box string, path string) error { return withBucket(func(ctx context.Context, buck *blob.Bucket) error { w, err := buck.NewWriter(ctx, Key(box+path), &blob.WriterOptions{ ContentType: "application/octet-stream", }) if err != nil { return errors.WithStack(err) } defer w.Close() f, err := os.Open(path) if err != nil { return errors.WithStack(err) } defer f.Close() _, err = io.Copy(w, f) if err != nil { return errors.WithStack(err) } return nil }) } func withBucket(fn func(context.Context, *blob.Bucket) error) error { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() key, err := envy.MustGet("S3_KEY") if err != nil { return errors.WithStack(err) } secret, err := envy.MustGet("S3_SECRET") if err != nil { return errors.WithStack(err) } config := aws.NewConfig() config.Region = aws.String("us-east-1") config.Credentials = credentials.NewStaticCredentialsFromCreds(credentials.Value{ AccessKeyID: key, SecretAccessKey: secret, }) sess, err := session.NewSession(config) if err != nil { return errors.WithStack(err) } buck, err := s3blob.OpenBucket(ctx, sess, "s3packr-demo") if err != nil { return errors.WithStack(err) } return fn(ctx, buck) }