【发布时间】:2022-02-10 05:19:29
【问题描述】:
我正在尝试使用以下方法获取 S3 中最后修改的文件:
def lambda_handler(event, context):
import boto3
bucket_name = "arn:aws-us-gov:s3:::some_bucket_name/some_folder/"
get_last_modified = lambda obj: int(obj['LastModified'].strftime('%s'))
s3 = boto3.client('s3')
objs = s3.list_objects_v2(Bucket=bucket_name)['Contents']
last_added = [obj['Key'] for obj in sorted(objs, key=get_last_modified)][0]
...虽然事情看起来正确,但我不断收到错误:
"errorMessage": "Parameter validation failed:\nInvalid bucket name \"arn:aws-us-gov:s3:::some_bucket_name/some_folder/\": Bucket name must match the regex \"^[a-zA-Z0-9.\\-_]{1,255}$\" or be an ARN matching the regex \"^arn:(aws).*:(s3|s3-object-lambda):[a-z\\-0-9]*:[0-9]{12}:accesspoint[/:][a-zA-Z0-9\\-.]{1,63}$|^arn:(aws).*:s3-outposts:[a-z\\-0-9]+:[0-9]{12}:outpost[/:][a-zA-Z0-9\\-]{1,63}[/:]accesspoint[/:][a-zA-Z0-9\\-]{1,63}$\"",
我在存储桶名称中缺少什么?我从控制台复制了 ARN,但似乎仍然无法产生预期的结果。我不是 RegEx 专家,所以我很难辨别 arn 中可能缺少什么。为了测试,我用一些随机名称替换了存储桶名称,并得到了存储桶不存在的错误;正如预期的那样。我有点困惑是什么问题。任何帮助将不胜感激。
【问题讨论】:
-
您不需要输入完整的 ARN,只需在您的情况下输入
some_bucket_name。请参阅文档:boto3.amazonaws.com/v1/documentation/api/latest/reference/… -
您要使用的存储桶名称是“some_bucket_name”,而不是存储桶的完整 ARN。另外,如果不使用分页器,最多只能获取桶中的前 1000 个对象。
-
我看到了 bucket_name 的问题:我试图使用文件位置的完整路径,而不仅仅是实际的存储桶名称。我将不得不进一步挖掘如何添加路径的其余部分。
标签: python amazon-web-services amazon-s3 aws-lambda boto3