github.com/grafana/pyroscope@v1.18.0/pkg/objstore/providers/s3/bucket_client.go (about)

     1  // SPDX-License-Identifier: AGPL-3.0-only
     2  // Provenance-includes-location: https://github.com/cortexproject/cortex/blob/master/pkg/storage/bucket/s3/bucket_client.go
     3  // Provenance-includes-license: Apache-2.0
     4  // Provenance-includes-copyright: The Cortex Authors.
     5  
     6  package s3
     7  
     8  import (
     9  	"github.com/go-kit/log"
    10  	"github.com/go-kit/log/level"
    11  	"github.com/prometheus/common/model"
    12  	"github.com/thanos-io/objstore"
    13  	"github.com/thanos-io/objstore/providers/s3"
    14  )
    15  
    16  // NewBucketClient creates a new S3 bucket client
    17  func NewBucketClient(cfg Config, name string, logger log.Logger) (objstore.Bucket, error) {
    18  	s3Cfg, err := newS3Config(cfg)
    19  	if err != nil {
    20  		return nil, err
    21  	}
    22  
    23  	warnForDeprecatedConfigFields(cfg, logger)
    24  
    25  	return s3.NewBucketWithConfig(logger, s3Cfg, name, nil)
    26  }
    27  
    28  // NewBucketReaderClient creates a new S3 bucket client
    29  func NewBucketReaderClient(cfg Config, name string, logger log.Logger) (objstore.BucketReader, error) {
    30  	s3Cfg, err := newS3Config(cfg)
    31  	if err != nil {
    32  		return nil, err
    33  	}
    34  
    35  	warnForDeprecatedConfigFields(cfg, logger)
    36  
    37  	return s3.NewBucketWithConfig(logger, s3Cfg, name, nil)
    38  }
    39  
    40  func newS3Config(cfg Config) (s3.Config, error) {
    41  	sseCfg, err := cfg.SSE.BuildThanosConfig()
    42  	if err != nil {
    43  		return s3.Config{}, err
    44  	}
    45  
    46  	bucketLookupType := s3.AutoLookup
    47  	if cfg.ForcePathStyle || cfg.BucketLookupType == PathStyleLookup {
    48  		bucketLookupType = s3.PathLookup
    49  	} else if cfg.BucketLookupType == VirtualHostedStyleLookup {
    50  		bucketLookupType = s3.VirtualHostLookup
    51  	}
    52  
    53  	return s3.Config{
    54  		Bucket:           cfg.BucketName,
    55  		Endpoint:         cfg.Endpoint,
    56  		Region:           cfg.Region,
    57  		AccessKey:        cfg.AccessKeyID,
    58  		SecretKey:        cfg.SecretAccessKey.String(),
    59  		Insecure:         cfg.Insecure,
    60  		SSEConfig:        sseCfg,
    61  		BucketLookupType: bucketLookupType,
    62  		HTTPConfig: s3.HTTPConfig{
    63  			IdleConnTimeout:       model.Duration(cfg.HTTP.IdleConnTimeout),
    64  			ResponseHeaderTimeout: model.Duration(cfg.HTTP.ResponseHeaderTimeout),
    65  			InsecureSkipVerify:    cfg.HTTP.InsecureSkipVerify,
    66  			TLSHandshakeTimeout:   model.Duration(cfg.HTTP.TLSHandshakeTimeout),
    67  			ExpectContinueTimeout: model.Duration(cfg.HTTP.ExpectContinueTimeout),
    68  			MaxIdleConns:          cfg.HTTP.MaxIdleConns,
    69  			MaxIdleConnsPerHost:   cfg.HTTP.MaxIdleConnsPerHost,
    70  			MaxConnsPerHost:       cfg.HTTP.MaxConnsPerHost,
    71  			Transport:             cfg.HTTP.Transport,
    72  		},
    73  		// Enforce signature version 2 if CLI flag is set
    74  		SignatureV2: cfg.SignatureVersion == SignatureVersionV2,
    75  	}, nil
    76  }
    77  
    78  func warnForDeprecatedConfigFields(cfg Config, logger log.Logger) {
    79  	if cfg.ForcePathStyle {
    80  		level.Warn(logger).Log("msg", "S3 bucket client config has a deprecated s3.force-path-style flag set. Please, use s3.bucket-lookup-type instead.")
    81  	}
    82  }