chrislu
2 years ago
3 changed files with 129 additions and 3 deletions
-
12go.mod
-
6go.sum
-
114test/s3/s3client/s3client.go
@ -0,0 +1,114 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"github.com/aws/aws-sdk-go-v2/aws" |
||||
|
"github.com/aws/aws-sdk-go-v2/aws/retry" |
||||
|
"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" |
||||
|
"time" |
||||
|
) |
||||
|
|
||||
|
func main() { |
||||
|
cfg := MyConfig{ |
||||
|
Key: "any", |
||||
|
Secret: "any", |
||||
|
Region: "US", |
||||
|
Endpoint: MyEndpoint{ |
||||
|
URL: "http://localhost:8333", |
||||
|
}, |
||||
|
Bucket: MyBucketConfig{ |
||||
|
Name: "newbucket", |
||||
|
Versioning: false, |
||||
|
}, |
||||
|
MaxBackoffDelay: aws.Int(int(time.Second * 5)), |
||||
|
MaxRetryAttempts: aws.Int(1), |
||||
|
} |
||||
|
|
||||
|
awsCfg, err := MyAwsConfig(cfg) |
||||
|
if err != nil { |
||||
|
panic(err) |
||||
|
} |
||||
|
svc := s3.NewFromConfig(*awsCfg, func(o *s3.Options) { |
||||
|
o.UsePathStyle = true |
||||
|
}) |
||||
|
|
||||
|
// Use the S3 client to interact with SeaweedFS
|
||||
|
// ...
|
||||
|
// Example: List all buckets
|
||||
|
result, err := svc.ListBuckets(context.Background(), &s3.ListBucketsInput{}) |
||||
|
// no errors - got list of buckets
|
||||
|
if err != nil { |
||||
|
panic(err) |
||||
|
} |
||||
|
|
||||
|
// Print the list of buckets
|
||||
|
for _, bucket := range result.Buckets { |
||||
|
println(*bucket.Name) |
||||
|
} |
||||
|
|
||||
|
bucket := "bucket1" |
||||
|
_, err = svc.HeadBucket(context.Background(), &s3.HeadBucketInput{Bucket: &bucket}) |
||||
|
// ERROR HERE
|
||||
|
if err != nil { |
||||
|
println(err) |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
// === helpers
|
||||
|
|
||||
|
func MyAwsConfig(cfg MyConfig) (*aws.Config, error) { |
||||
|
|
||||
|
cred := aws.NewCredentialsCache(credentials.NewStaticCredentialsProvider(cfg.Key, cfg.Secret, "")) |
||||
|
customResolver := aws.EndpointResolverWithOptionsFunc( |
||||
|
func(service, region string, options ...interface{}) (aws.Endpoint, error) { |
||||
|
return aws.Endpoint{ |
||||
|
URL: cfg.Endpoint.URL, |
||||
|
SigningRegion: cfg.Region, |
||||
|
}, nil |
||||
|
}) |
||||
|
|
||||
|
awsCfg, err := config.LoadDefaultConfig(context.TODO(), |
||||
|
config.WithRegion(cfg.Region), |
||||
|
config.WithCredentialsProvider(cred), |
||||
|
config.WithEndpointResolverWithOptions(customResolver), |
||||
|
config.WithRetryer(func() aws.Retryer { |
||||
|
r := retry.AddWithMaxAttempts(retry.NewStandard(), *cfg.MaxRetryAttempts) |
||||
|
return retry.AddWithMaxBackoffDelay(r, time.Duration(*cfg.MaxBackoffDelay*1000*1000)) |
||||
|
})) |
||||
|
return &awsCfg, err |
||||
|
} |
||||
|
|
||||
|
type MyConfig struct { |
||||
|
// Access key of S3 AWS.
|
||||
|
Key string |
||||
|
// Access secret of S3 AWS.
|
||||
|
Secret string |
||||
|
// Region.
|
||||
|
Region string |
||||
|
// AWS endpoint.
|
||||
|
Endpoint MyEndpoint |
||||
|
// Bucket configuration.
|
||||
|
Bucket MyBucketConfig |
||||
|
// File access.
|
||||
|
FileAccess MyFileAccessType |
||||
|
// Maximum backoff delay (ms, default: 20 sec).
|
||||
|
MaxBackoffDelay *int |
||||
|
// Maximum attempts to retry operation on error (default: 5).
|
||||
|
MaxRetryAttempts *int |
||||
|
} |
||||
|
|
||||
|
type MyBucketConfig struct { |
||||
|
// Name of bucket
|
||||
|
Name string |
||||
|
// Enable or not versioning
|
||||
|
Versioning bool |
||||
|
} |
||||
|
|
||||
|
type MyEndpoint struct { |
||||
|
URL string |
||||
|
} |
||||
|
|
||||
|
type MyFileAccessType byte |
Write
Preview
Loading…
Cancel
Save
Reference in new issue