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

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

  1. 将以下存储桶策略添加到账户 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/*"
         }
     ]
    

    }

  2. 在 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": "*"
         }
     ]
    

    }

  3. 在账户 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>

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

【问题讨论】:

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


    【解决方案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)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-02
    • 2018-12-20
    • 2020-03-18
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2019-01-15
    • 2020-06-02
    相关资源
    最近更新 更多