73 lines
1.8 KiB
Go
73 lines
1.8 KiB
Go
package s3
|
|
|
|
import (
|
|
"context"
|
|
"github.com/aws/aws-sdk-go-v2/aws"
|
|
"github.com/aws/aws-sdk-go-v2/config"
|
|
"github.com/aws/aws-sdk-go-v2/credentials"
|
|
"github.com/aws/aws-sdk-go-v2/service/s3"
|
|
smithyendpoints "github.com/aws/smithy-go/endpoints"
|
|
"github.com/loveuer/nf-disk/internal/tool"
|
|
"github.com/loveuer/nf/nft/log"
|
|
"net/url"
|
|
)
|
|
|
|
type resolverV2 struct{}
|
|
|
|
func (*resolverV2) ResolveEndpoint(ctx context.Context, params s3.EndpointParameters) (smithyendpoints.Endpoint, error) {
|
|
u, err := url.Parse(*params.Endpoint)
|
|
if err != nil {
|
|
log.Warn("resolver v2: parse url = %s, err = %s", params.Endpoint, err.Error())
|
|
return smithyendpoints.Endpoint{}, err
|
|
}
|
|
return smithyendpoints.Endpoint{
|
|
URI: *u,
|
|
}, nil
|
|
|
|
}
|
|
|
|
type Client struct {
|
|
client *s3.Client
|
|
}
|
|
|
|
func New(ctx context.Context, endpoint string, access string, key string) (*Client, error) {
|
|
var (
|
|
err error
|
|
sdkConfig aws.Config
|
|
output *s3.ListBucketsOutput
|
|
)
|
|
|
|
customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) {
|
|
return aws.Endpoint{
|
|
URL: endpoint,
|
|
}, nil
|
|
})
|
|
|
|
if sdkConfig, err = config.LoadDefaultConfig(
|
|
ctx,
|
|
config.WithEndpointResolverWithOptions(customResolver),
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
s3Client := s3.NewFromConfig(sdkConfig, func(o *s3.Options) {
|
|
//o.BaseEndpoint = aws.String(endpoint)
|
|
//o.EndpointResolverV2 = &resolverV2{}
|
|
o.Credentials = aws.NewCredentialsCache(credentials.NewStaticCredentialsProvider(access, key, ""))
|
|
o.UsePathStyle = true
|
|
o.Region = "auto"
|
|
})
|
|
|
|
if output, err = s3Client.ListBuckets(tool.Timeout(5), &s3.ListBucketsInput{
|
|
MaxBuckets: aws.Int32(2),
|
|
}); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for _, item := range output.Buckets {
|
|
log.Debug("s3.New: list bucket name = %s", *item.Name)
|
|
}
|
|
|
|
return &Client{client: s3Client}, nil
|
|
}
|