是否可以使用 python 从 lambda 函数获取 s3 存储桶中特定文件夹中的文件(对象)数量。
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 文件。它可能不是“当前”,但这是一种非常简单的方法来计算对象,而无需循环调用。
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