另一个账户中来自 Lambda 的 AWS 跨账户 S3 PutObject

Posted

技术标签:

【中文标题】另一个账户中来自 Lambda 的 AWS 跨账户 S3 PutObject【英文标题】:AWS CrossAccount S3 PutObject from Lambda in another account 【发布时间】:2020-07-31 13:57:52 【问题描述】:

我正在尝试将账户 A 中的 Lambda 中的文本文件放入账户 B 中的 S3 存储桶中。S3 存储桶(测试存储桶)启用了 AWS-KMS 加密。我添加了以下权限:

    将以下存储桶策略添加到账户 B 中的 S3 存储桶:

     "Version": "2012-10-17",
     "Id": "ExamplePolicy",
     "Statement": [
         
             "Sid": "ExampleStmt",
             "Effect": "Allow",
             "Principal": 
                 "AWS": "arn:aws:iam::AccountA:role/Lambda-Role"
             ,
             "Action": "s3:*",
             "Resource": "arn:aws:s3:::test-bucket/*"
         
     ]
    

    在 KMS 密钥中添加了以下策略:

     "Version": "2012-10-17",
     "Id": "key-default-1",
     "Statement": [
         
             "Sid": "Enable IAM User Permissions",
             "Effect": "Allow",
             "Principal": 
                 "AWS": "arn:aws:iam::AccountB:root"
             ,
             "Action": "kms:*",
             "Resource": "*"
         ,
         
             "Sid": "Allow use of the key",
             "Effect": "Allow",
             "Principal": 
                 "AWS": "arn:aws:iam::AccountA:role/Lambda-Role"
             ,
             "Action": [
                 "kms:Encrypt",
                 "kms:Decrypt",
                 "kms:ReEncrypt*",
                 "kms:GenerateDataKey*",
                 "kms:DescribeKey"
             ],
             "Resource": "*"
         
     ]
    

    在账户 A 的内联策略下方添加 - Lambda 角色并授予对 KMS 密钥的访问权限:

"Version": "2012-10-17",
    "Statement": [
        
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:Encrypt",
                "kms:GenerateDataKey",
                "kms:DescribeKey",
                "kms:ReEncrypt*"
            ],
            "Resource": [
                "arn:aws:kms:us-west-2:AccountB:key/KMS-ID"
            ]
        
    ]

文件也在账户 B S3 存储桶中上传,但无法查看/下载任何这些文件。得到这个错误:

<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>5H3KEXCJ7YSCJS</RequestId>
<HostId>hqwavZZo6D0asdddcvfff+prEtoBCwTFH0AYtzzzzzztqAaPflzs85aaaaa=</HostId>
</Error>

当我检查它具有的文件属性时:服务器端加密 - 拒绝访问。 不知道我在这里错过了什么。有人请指导。

【问题讨论】:

【参考方案1】:

账户 A 中缺少的一件事 - Lambda 角色是 - 即使账户 B 中的存储桶策略允许,它也应该有权访问账户 B 中的存储桶。

    
    "Version": "2012-10-17",
    "Statement": [
        
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::AccountABucketName"
                "arn:aws:s3:::AccountABucketName/*"
            ]
 
        
    ]

要列出存储桶中的文件,您还应该添加"Resource": "arn:aws:s3:::test-bucket

【讨论】:

我可以将文件上传到账户 B S3 存储桶中。但是当我尝试手动下载该文件时,出现 AccessDenied 错误【参考方案2】:

我找到了解决方案。我只需要在 put_object 中添加 ACL='bucket-owner-full-control'。下面是完整的 boto3 cmd。

s3.put_object(
    ACL='bucket-owner-full-control'
    Body=processed_content,
    Bucket=processed_bucket,
    Key=processed_key)

【讨论】:

另外,本指南描述了您的解决方案:aws.amazon.com/premiumsupport/knowledge-center/…

以上是关于另一个账户中来自 Lambda 的 AWS 跨账户 S3 PutObject的主要内容,如果未能解决你的问题,请参考以下文章

AWS CodePipeline 错误:不允许跨账户传递角色

AWS CloudFormation:如何从另一个AWS账户为Lambda代码指定存储桶?

Amazon S3 在另一个账户中触发另一个 Lambda 函数

AWS 跨账户 Postgres RDS IAM 身份验证

我的 aws 角色的信任策略有啥问题,它不能被假定为跨账户?

如何从账户 A 中的 Lambda(VPC 中的 Lambda)调用账户 B 中的 AWS Lambda 函数(VPC 中的这个 Lambda)