以下链接中的文章
https://alexwlchan.net/2017/07/listing-s3-keys/
只要对象在父文件夹中,就会有帮助
如何才能完成读取子文件夹中的对象
我试图使用mybucket.objects.filter(Prefix=someprefix)
,但它不会在子文件夹中查找对象
mybucket.objects.all()
将起作用(它也会查看子文件夹)但是当存储桶中有数百万个文件时,调用的lambda函数将超时
答案 0 :(得分:0)
你可以试试这个例子:
var client = new Amazon.S3.AmazonS3Client(Amazon.RegionEndpoint.USEast1);
ListObjectsRequest request = new ListObjectsRequest
{
BucketName = bucketName,
Prefix = prefix
};
// Build your call out to S3 and store the response
ListObjectsResponse response = client.ListObjects(request);
IEnumerable<S3Object> folders = response.S3Objects;
在搜索子文件夹或文件的前缀中输入文件夹名称。
答案 1 :(得分:0)
正如您已经发现的,Lambda函数的每个实例都有一个finite lifetime and memory capacity。由于S3 Bucket中有数百万个对象,因此您需要将工作委派给Lambda函数的许多实例,而不仅仅是单个实例。
如您所链接的文章所述,此处的解决方案是使用数据分页。在List Objects V2 API的第一个响应中提供的延续令牌是您需要传递到下一个调用的内容。如果不再提供continuation-token
,则您已到达搜索结果的末尾。
根据上面链接的文档,响应对象上的IsTruncated
属性将设置为true
。但是,您链接到的文章不检查此属性,而只是检查KeyError
异常,这应该是足够的。然后,在下次调用Lambda函数时,将continuation-token
的值传入event
对象。
从您链接的文章中查看复制粘贴的Python函数,并查看我插入的注释的位置。这就是你想要以递归和异步方式调用Lambda函数的地方。
您可以使用boto3
库来调用Lambda函数,使用invoke()
method document here。确保指定InvocationType
= event
参数,因为这将导致Lambda函数异步执行。另外,请务必将continuation-token
传递给Payload
方法参数,因为您的下一个Lambda调用需要将其作为输入接受,并将其传递给下一个list_objects_v2()
request。
def get_all_s3_keys(bucket):
"""Get a list of all keys in an S3 bucket."""
keys = []
kwargs = {'Bucket': bucket}
while True:
resp = s3.list_objects_v2(**kwargs)
for obj in resp['Contents']:
keys.append(obj['Key'])
try:
### Invoke your Lambda function recursively here
kwargs['ContinuationToken'] = resp['NextContinuationToken']
except KeyError:
print('There is no continuation token, aborting ...')
break
return keys