您当前的位置: 首页 >  编程语言

[Lambda] list_objects 中的内容

你想做的事 获取 list_objects 指定的 S3 存储桶上的键列表 如果存在键,则将数据附加到文件 如果密钥不存在则创建新文件 运行时为 Python3.9 ① Lambda 无法访问 S3 存储桶 错误
[ERROR] ClientError: An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied
Traceback (most recent call last):

解决方案:向 Lambda 授予 S3 权限1. 访问管理 Lambda 函数的 IAM 角色概览页面2.选择“添加权限”→“附加策略”3. 选择您要添加的策略,然后单击“附加策略”*我添加了“AmazonS3FullAccess”,因为我想在此之后写入数据,但“AmazonS3ReadOnlyAccess”只适合读取。

(2) 不能只获取键名

失败示例

示例 1
import boto3

s3_client = boto3.client("s3")
bucket = "testbucket"   #バケット名

response = s3_client.list_objects(Bucket=bucket)

print("##keylist")
print(response)
结果1
##keylist
{'ResponseMetadata': {'RequestId': '##########', 'HostId': '##########', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amz-id-2': '##########', 'x-amz-request-id': '##########', 'date': 'Fri, 12 Aug 2022 07:46:36 GMT', 'x-amz-bucket-region': 'ap-northeast-1', 'content-type': 'application/xml', 'transfer-encoding': 'chunked', 'server': 'AmazonS3'}, 'RetryAttempts': 0}, 'IsTruncated': False, 'Marker': '', 'Contents': [{'Key': 'apple.txt', 'LastModified': datetime.datetime(2022, 8, 12, 5, 19, 14, tzinfo=tzlocal()), 'ETag': '"##########"', 'Size': 0, 'StorageClass': 'STANDARD', 'Owner': {'DisplayName': '##########', 'ID': '##########'}}, {'Key': 'grape.txt', 'LastModified': datetime.datetime(2022, 8, 12, 5, 19, 14, tzinfo=tzlocal()), 'ETag': '"##########"', 'Size': 0, 'StorageClass': 'STANDARD', 'Owner': {'DisplayName': '##########', 'ID': '##########'}}, {'Key': 'peach.txt', 'LastModified': datetime.datetime(2022, 8, 12, 5, 19, 14, tzinfo=tzlocal()), 'ETag': '"##########"', 'Size': 0, 'StorageClass': 'STANDARD', 'Owner': {'DisplayName': '##########', 'ID': '##########'}}], 'Name': 'testbucket', 'Prefix': '', 'MaxKeys': 1000, 'EncodingType': 'url'}

我误解了列表中只返回了键名。 (部分字符为斜体)解决方案

示例 2
import boto3

s3_client = boto3.client("s3")
bucket = "testbucket"   #バケット名

response = s3_client.list_objects(Bucket=bucket)
keys = []
for r in response.get("Contents")
    keys.append(r.get("Key"))

print("##keylist")
print(keys)
结果2
##keylist
['apple.txt', 'grape.txt', 'peach.txt']
奖金

根据指定S3桶中的key是否存在来分支流程的例子

示例 3
import boto3

def lambda_handler(event, context):
    bucket = BUCKET   #バケット名
    key = KEY   #探したいキー名
    s3_client = boto3.client("s3")

    response = s3_client.list_objects(Bucket=bucket)
    keys = []
    for r in response.get("Contents")
        keys.append(r.get("Key"))

    if key in keys:
        #キーが存在する場合の処理
    else:
        #キーが存在しない場合の処理

    return {"statuscode":200}
参考

原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308623513.html