diff --git a/s3.go b/s3.go index 634590bc..72a9cd75 100644 --- a/s3.go +++ b/s3.go @@ -5,6 +5,7 @@ import ( "bufio" "crypto/md5" "encoding/json" + "errors" "fmt" "io" "io/ioutil" @@ -22,6 +23,8 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/defaults" + "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" @@ -50,9 +53,21 @@ type MetaFile struct { // Connect - connect to s3 func (s *S3) Connect() error { var err error + awsDefaults := defaults.Get() + defaultCredProviders := defaults.CredProviders(awsDefaults.Config, awsDefaults.Handlers) + + // Define custom static cred provider + staticCreds := &credentials.StaticProvider{Value: credentials.Value{ + AccessKeyID: s.Config.AccessKey, + SecretAccessKey: s.Config.SecretKey, + }} + + // Append static creds to the defaults + customCredProviders := append([]credentials.Provider{staticCreds}, defaultCredProviders...) + creds := credentials.NewChainCredentials(customCredProviders) if s.session, err = session.NewSession( &aws.Config{ - Credentials: credentials.NewStaticCredentials(s.Config.AccessKey, s.Config.SecretKey, ""), + Credentials: creds, Region: aws.String(s.Config.Region), Endpoint: aws.String(s.Config.Endpoint), DisableSSL: aws.Bool(s.Config.DisableSSL), @@ -74,10 +89,11 @@ func (s *S3) Connect() error { Scheme: httpSchema, PathStyle: s.Config.ForcePathStyle, } - s3StreamClient := s3gof3r.New(endpoint, s.Config.Region, s3gof3r.Keys{ - AccessKey: s.Config.AccessKey, - SecretKey: s.Config.SecretKey, - }) + keys, err := s.getAWSKeys() + if err != nil { + return err + } + s3StreamClient := s3gof3r.New(endpoint, s.Config.Region, keys) s.s3Stream = s3StreamClient.Bucket(s.Config.Bucket) return nil @@ -761,3 +777,24 @@ func GetEtag(path string, partSize int64) string { hash := md5.Sum(contentToHash) return fmt.Sprintf("\"%x-%d\"", hash, parts) } + +func (s *S3) getAWSKeys() (keys s3gof3r.Keys, err error) { + + if s.Config.AccessKey != "" && s.Config.SecretKey != "" { + return s3gof3r.Keys{ + AccessKey: s.Config.AccessKey, + SecretKey: s.Config.SecretKey, + }, nil + } + + keys, err = s3gof3r.EnvKeys() + if err == nil { + return + } + keys, err = s3gof3r.InstanceKeys() + if err == nil { + return + } + err = errors.New("no AWS keys found") + return +}