aws s3 bucket搜索子文件夹

时间:2018-01-09 18:03:24

标签: amazon-web-services lambda

以下链接中的文章

https://alexwlchan.net/2017/07/listing-s3-keys/
只要对象在父文件夹中,

就会有帮助 如何才能完成读取子文件夹中的对象 我试图使用mybucket.objects.filter(Prefix=someprefix),但它不会在子文件夹中查找对象 mybucket.objects.all()将起作用(它也会查看子文件夹)但是当存储桶中有数百万个文件时,调用的lambda函数将超时

2 个答案:

答案 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函数

从您链接的文章中查看复制粘贴的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