diff --git a/config/awsconfig/awsconfig.go b/config/awsconfig/awsconfig.go index 6dcbabcce..cfa84afde 100644 --- a/config/awsconfig/awsconfig.go +++ b/config/awsconfig/awsconfig.go @@ -2,6 +2,7 @@ package awsconfig import ( "flag" + "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/session" @@ -90,6 +91,8 @@ func WithAWS(fs *flag.FlagSet, cb func() (*zap.Logger, bool)) imagor.Option { "Upload ACL for S3 Result Storage") s3ResultStorageExpiration = fs.Duration("s3-result-storage-expiration", 0, "S3 Result Storage expiration duration e.g. 24h. Default no expiration") + s3FileStorageClass = fs.String("s3-file-storage-class", "STANDARD", + "S3 File Storage Class. Available values: reduced-redunancy, standard-ia, intelligent-tiering, glacier, deep_archive. Default: standard.") _, _ = cb() ) @@ -182,6 +185,7 @@ func WithAWS(fs *flag.FlagSet, cb func() (*zap.Logger, bool)) imagor.Option { s3storage.WithACL(*s3ResultStorageACL), s3storage.WithSafeChars(*s3SafeChars), s3storage.WithExpiration(*s3ResultStorageExpiration), + s3storage.WithFileStorageClass(*s3FileStorageClass), ), ) } diff --git a/storage/s3storage/option.go b/storage/s3storage/option.go index 6e5550156..83095f429 100644 --- a/storage/s3storage/option.go +++ b/storage/s3storage/option.go @@ -1,9 +1,10 @@ package s3storage import ( - "github.com/aws/aws-sdk-go/service/s3" "strings" "time" + + "github.com/aws/aws-sdk-go/service/s3" ) // Option S3Storage option @@ -70,3 +71,24 @@ func WithExpiration(exp time.Duration) Option { } } } + +func WithFileStorageClass(storageClass string) Option { + return func(h *S3Storage) { + switch storageClass { + case "reduced-redunancy": + h.StorageClass = "REDUCED_REDUNDANCY" + case "standard-ia": + h.StorageClass = "STANDARD_IA" + case "onezone-ia": + h.StorageClass = "ONEZONE_IA" + case "intelligent-tiering": + h.StorageClass = "INTELLIGENT_TIERING" + case "glacier": + h.StorageClass = "GLACIER" + case "deep_archive": + h.StorageClass = "DEEP_ARCHIVE" + default: + h.StorageClass = "STANDARD" + } + } +} diff --git a/storage/s3storage/s3storage.go b/storage/s3storage/s3storage.go index 5401af68d..adab849ab 100644 --- a/storage/s3storage/s3storage.go +++ b/storage/s3storage/s3storage.go @@ -2,6 +2,13 @@ package s3storage import ( "context" + "io" + "net/http" + "path/filepath" + "strings" + "sync" + "time" + "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/session" @@ -9,12 +16,6 @@ import ( "github.com/aws/aws-sdk-go/service/s3/s3manager" "github.com/cshum/imagor" "github.com/cshum/imagor/imagorpath" - "io" - "net/http" - "path/filepath" - "strings" - "sync" - "time" ) // S3Storage AWS S3 Storage implements imagor.Storage interface @@ -24,11 +25,12 @@ type S3Storage struct { Downloader *s3manager.Downloader Bucket string - BaseDir string - PathPrefix string - ACL string - SafeChars string - Expiration time.Duration + BaseDir string + PathPrefix string + ACL string + SafeChars string + StorageClass string + Expiration time.Duration safeChars imagorpath.SafeChars } @@ -128,12 +130,13 @@ func (s *S3Storage) Put(ctx context.Context, image string, blob *imagor.Blob) er }() var metadata map[string]*string input := &s3manager.UploadInput{ - ACL: aws.String(s.ACL), - Body: reader, - Bucket: aws.String(s.Bucket), - ContentType: aws.String(blob.ContentType()), - Metadata: metadata, - Key: aws.String(image), + ACL: aws.String(s.ACL), + Body: reader, + Bucket: aws.String(s.Bucket), + ContentType: aws.String(blob.ContentType()), + Metadata: metadata, + Key: aws.String(image), + StorageClass: aws.String(s.StorageClass), } _, err = s.Uploader.UploadWithContext(ctx, input) return err