in lib/backend/s3backend/client.go [89:149]
func NewClient(
config Config, userAuth UserAuthConfig, stats tally.Scope, opts ...Option) (*Client, error) {
config.applyDefaults()
if config.Username == "" {
return nil, errors.New("invalid config: username required")
}
if config.Region == "" {
return nil, errors.New("invalid config: region required")
}
if config.Bucket == "" {
return nil, errors.New("invalid config: bucket required")
}
if !path.IsAbs(config.RootDirectory) {
return nil, errors.New("invalid config: root_directory must be absolute path")
}
pather, err := namepath.New(config.RootDirectory, config.NamePath)
if err != nil {
return nil, fmt.Errorf("namepath: %s", err)
}
auth, ok := userAuth[config.Username]
if !ok {
return nil, errors.New("auth not configured for username")
}
creds := credentials.NewStaticCredentials(
auth.S3.AccessKeyID, auth.S3.AccessSecretKey, auth.S3.SessionToken)
awsConfig := aws.NewConfig().WithRegion(config.Region).WithCredentials(creds)
if config.Endpoint != "" {
awsConfig = awsConfig.WithEndpoint(config.Endpoint)
}
if config.DisableSSL {
awsConfig = awsConfig.WithDisableSSL(config.DisableSSL)
}
if config.S3ForcePathStyle {
awsConfig = awsConfig.WithS3ForcePathStyle(config.S3ForcePathStyle)
}
api := s3.New(session.New(), awsConfig)
downloader := s3manager.NewDownloaderWithClient(api, func(d *s3manager.Downloader) {
d.PartSize = config.DownloadPartSize
d.Concurrency = config.DownloadConcurrency
})
uploader := s3manager.NewUploaderWithClient(api, func(u *s3manager.Uploader) {
u.PartSize = config.UploadPartSize
u.Concurrency = config.UploadConcurrency
})
client := &Client{config, pather, stats, join{api, downloader, uploader}}
for _, opt := range opts {
opt(client)
}
return client, nil
}