0%

S3 使用

流式上传文件

使用 S3 标准接口上传文件时需要提供一个 ReadSeeker ,这样就不方便把一个流式数据源的内容转存到对象存储(本地文件可以支持 ReadSeeker),可以使用 s3manager 提供的 API 进行流式上传:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package main

import (
// ...
"io"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
)

type reader struct {
r io.Reader
}

func (r *reader) Read(p []byte) (int, error) {
return r.r.Read(p)
}

func main() {
// ... parse flags

sess := session.Must(session.NewSession())
uploader := s3manager.NewUploader(sess, func(u *s3manager.Uploader) {
u.PartSize = 20 << 20 // 20MB
// ... more configuration
})

// ... context stuff

_, err := uploader.UploadWithContext(ctx, &s3manager.UploadInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
Body: &reader{os.Stdin},
})

// ... handle error
}

Mock S3 Client

使用 s3iface.S3API 接口而不是 S3 结构体,mock 时将接口嵌入结构体,从而只需要 mock 业务代码真正使用的 API 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// myFunc uses an SDK service client to make a request to
// Amazon Simple Storage Service.
func myFunc(svc s3iface.S3API) bool {
// Make svc.AbortMultipartUpload request
}

func main() {
sess := session.New()
svc := s3.New(sess)

myFunc(svc)
}

// In your _test.go file:

// Define a mock struct to be used in your unit tests of myFunc.
type mockS3Client struct {
s3iface.S3API
}
func (m *mockS3Client) AbortMultipartUpload(input *s3.AbortMultipartUploadInput) (*s3.AbortMultipartUploadOutput, error) {
// mock response/functionality
}

func TestMyFunc(t *testing.T) {
// Setup Test
mockSvc := &mockS3Client{}

myfunc(mockSvc)

// Verify myFunc's functionality
}

统计存储桶下文件总大小

1
s3cmd ls --recursive s3://code-pipeline-log/ | grep -v -E "(Bucket: |Prefix: |LastWriteTime|^$|--)" | awk 'BEGIN {total=0}{total+=$3}END{print total/1024/1024" MB"}'

s3 bench 测试

https://github.com/dvassallo/s3-benchmark

1
2
3
4
5
6
# cat ~/.aws/credentials
[default]
aws_access_key_id=MY_AK
aws_secret_access_key=MY_SK

./s3-benchmark --endpoint http://tos-s3-cn-qingdao.volces.com --bucket-name cr-bench-1 --region cn-qingdao --payloads-min=13 --payloads-max=15

####

参考资料

本文到此结束  感谢您的阅读