使用Golang从AWS S3桶中获取所有对象的例子

425 阅读1分钟

默认的AWS S3 API对于从一个桶中获取对象有1000个硬性限制,但有一个V2 API可以克服这个问题。请看下面的例子,我们正在获取符合特定名称结构的文件 -yyyy-mm-dd-hh-mm-ss.json 。如果你愿意,你可以忽略匹配并获取所有的东西:

var keyRegex = regexp.MustCompile(`^\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}\.json$`)

type S3 struct {
	client *s3.S3
}

func (s S3) FetchSomeObjects(ctx context.Context, bucket string) ([]*domain.SomeObject, error) {
	var (
		pageNum  int
		objects  []*domain.SomeObject
	)

	err := s.client.ListObjectsV2PagesWithContext(ctx, &s3.ListObjectsV2Input{Bucket: bucket},
		func(page *s3.ListObjectsV2Output, isLastPage bool) bool {
			pageNum++

			for _, object := range page.Contents {
				if keyRegex.MatchString(*object.Key) {
					objects = append(objects, &domain.SomeObject{Key: *object.Key})
				}
			}

			return pageNum < 100
		},
	)
	if err != nil {
		return nil, err
	}

	return objects, nil
}