list_object 不适用于 AWS Lambda 的跨账户

时间:2021-04-28 22:35:11

标签: python amazon-web-services amazon-s3 aws-lambda amazon-iam

我正在尝试使用 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')

1 个答案:

答案 0 :(得分:0)

问题可能是由 KMS 引起的。如果 lambda 和存储桶在不同的帐户中,则 lambda 将无法自动访问第二个帐户中的 kms 密钥。您必须修改 KMS 密钥策略 以允许这样做。因此,请尝试将 lambda 角色 arn 添加到第二个帐户的 KMS 策略中。