我正在尝试使用 AWS Lambda 和 python 从另一个账户中的 S3 路径下载文件。如果我提供 copy_object 的完整密钥,我就可以下载文件。这在日常场景中对我不起作用,因为没有通知,我的预定 lambda 代码必须使用通配符检查文件是否存在。但是我在尝试列出该存储桶的内容时遇到访问被拒绝(调用 ListObjects 操作时发生错误 (AccessDenied):访问被拒绝)错误,即使我添加了获取和列表权限。
我将以下策略添加到我的 lambda 角色中。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": [
"arn:aws:s3:::<src S3 bucket>/",
"arn:aws:s3:::<src S3 bucket>/*"
],
"Effect": "Allow"
},
{
"Action": [
"kms:Decrypt",
"kms:Encrypt",
"kms:GenerateDataKey",
"kms:ReEncrypt*",
"kms:DescribeKey"
],
"Resource": [
"arn:aws:kms:us-east-1:<src bucket account id>:key/<src bucket kms key>"
],
"Effect": "Allow"
}
]
}
在源存储桶中,他们为我的 lambda 角色添加了以下权限
{
"Sid": <>,
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::<my account id>:role/LambdaRole"
]
},
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": [
"arn:aws:s3:::<src S3 bucket>",
"arn:aws:s3:::<src S3 bucket>/*"
]
},
用于拉取文件的 Python 代码
def get_s3_file(event):
s3 = boto3.client('s3')
bucket_name = event['Records'][0]['s3']['bucket']['name']
file_key = unquote_plus(event['Records'][0]['s3']['object']['key'])
file_name = file_key+'test.txt'
logger.info('Reading {} from {}'.format(file_key, bucket_name))
objects = s3.list_objects_v2(Bucket=bucket_name, Prefix=file_key)
for object in objects:
print(object.key)
if object.key.endswith('.txt'):
print(object.key)
copy_source = {'Bucket': bucket_name,'Key': file_name}
s3_c.copy_object(Bucket='<my bucket>', Key='/data/', CopySource=copy_source, ACL='bucket-owner-full-control')
答案 0 :(得分:0)
问题可能是由 KMS 引起的。如果 lambda 和存储桶在不同的帐户中,则 lambda 将无法自动访问第二个帐户中的 kms 密钥。您必须修改 KMS 密钥策略 以允许这样做。因此,请尝试将 lambda 角色 arn 添加到第二个帐户的 KMS 策略中。