默认的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
}