diff --git a/internal/backend/s3/config.go b/internal/backend/s3/config.go index 499e05094989..93de42152a03 100644 --- a/internal/backend/s3/config.go +++ b/internal/backend/s3/config.go @@ -20,9 +20,10 @@ type Config struct { Layout string `option:"layout" help:"use this backend layout (default: auto-detect)"` StorageClass string `option:"storage-class" help:"set S3 storage class (STANDARD, STANDARD_IA, ONEZONE_IA, INTELLIGENT_TIERING or REDUCED_REDUNDANCY)"` - Connections uint `option:"connections" help:"set a limit for the number of concurrent connections (default: 5)"` - MaxRetries uint `option:"retries" help:"set the number of retries attempted"` - Region string `option:"region" help:"set region"` + Connections uint `option:"connections" help:"set a limit for the number of concurrent connections (default: 5)"` + MaxRetries uint `option:"retries" help:"set the number of retries attempted"` + Region string `option:"region" help:"set region"` + BucketLookup string `option:"bucket-lookup" help:"bucket lookup style: 'auto', 'dns', or 'path'."` } // NewConfig returns a new Config with the default values filled in. diff --git a/internal/backend/s3/s3.go b/internal/backend/s3/s3.go index 770af02f3e42..8ee9d93fc889 100644 --- a/internal/backend/s3/s3.go +++ b/internal/backend/s3/s3.go @@ -2,6 +2,7 @@ package s3 import ( "context" + "fmt" "io" "io/ioutil" "net/http" @@ -66,9 +67,24 @@ func open(cfg Config, rt http.RoundTripper) (*Backend, error) { }, }, }) - client, err := minio.NewWithCredentials(cfg.Endpoint, creds, !cfg.UseHTTP, cfg.Region) + options := minio.Options{ + Creds: creds, + Secure: !cfg.UseHTTP, + Region: cfg.Region, + } + switch strings.ToLower(cfg.BucketLookup) { + case "", "auto": + options.BucketLookup = minio.BucketLookupAuto + case "dns": + options.BucketLookup = minio.BucketLookupDNS + case "path": + options.BucketLookup = minio.BucketLookupPath + default: + return nil, fmt.Errorf(`bad bucket-lookup style %q must be "auto", "path" or "dns"`, cfg.BucketLookup) + } + client, err := minio.NewWithOptions(cfg.Endpoint, &options) if err != nil { - return nil, errors.Wrap(err, "minio.NewWithCredentials") + return nil, errors.Wrap(err, "minio.NewWithOptions") } sem, err := backend.NewSemaphore(cfg.Connections)