从 python lambda 函数获取 s3 存储桶中文件夹中的文件数量

问题描述 投票:0回答:2

是否可以使用 python 从 lambda 函数获取 s3 存储桶中特定文件夹中的文件(对象)数量。

python amazon-s3 aws-lambda boto3 aws-sdk
2个回答
0
投票

Amazon S3 Storage Lens “提供整个 Amazon S3 存储中的对象存储使用情况和活动的单一视图。它包括深入选项,可在组织、账户、区域、存储桶甚至前缀级别生成见解。”但是,要获取 Prefix 级别的指标,需要高级指标,其价格为

$0.20 per million objects monitored per month
。有一个 boto3 库 可以访问 Storage Lens,但这似乎是关于配置而不是检索实际指标。 (我没有使用过,所以我不确定涉及什么。)

或者,您可以拨打

list_objects_v2()
获取所需的前缀。但是,它最多仅返回 1000 个对象,因此您需要在 NextContinuationToken 不为空时继续调用它。每次调用都会返回一个
KeyCount
,这是随请求返回的键的数量。
或者,如果您使用基于资源的 

bucket.objects.all()

调用,那么 boto3 将为您执行循环,并返回

s3.ObjectSummary
对象的 list。您只需使用列表上的
len()
即可获取计数。
对于具有大量对象的存储桶/文件夹来说,这两种方法都会非常慢。因此,另一种选择是使用 

Amazon S3 Inventory

,它可以提供列出所有对象的每日或每周 CSV 文件。它可能不是“当前”,但这是一种非常简单的方法来计算对象,而无需循环调用。


0
投票
aws s3 ls

命令和

--summarize -- recursive
来获取摘要,其中包括指定存储桶中的文件数,例如以下命令显示存储桶的摘要,
abc123
:
aws s3 ls s3://abc123 --summarize --recursive

对应的Python代码如下

import boto3 def lambda_handler(event, context): s3_client = boto3.client('s3') bucket_name = "abc123" total_objects = 0 total_size = 0 paginator = s3_client.get_paginator('list_objects_v2') page_iterator = paginator.paginate(Bucket=bucket_name, Recursive=True) for page in page_iterator: if 'Contents' in page: total_objects += len(page['Contents']) for obj in page['Contents']: total_size += obj['Size'] summary = { "TotalObjects": total_objects, "TotalSize": total_size } return summary

© www.soinside.com 2019 - 2024. All rights reserved.