首页 > 解决方案 > 当对象由另一个帐户创建时,无法从 s3 存储桶上的 lambda 获取对象

问题描述

我有 3 个帐户,我将其称为帐户 AA、BB 和 CC。

AA 对 BB 中的 s3 桶做 putObject,CC 有一个 lambda,当在 BB 中创建对象时触发

当我从账户 BB 在 s3 存储桶中创建一个对象时,lambda 按预期工作。我可以通过控制台或 s3 api 做到这一点。

当对象从帐户 AA 放入时,我可以在 lambda 中读取事件,但Access Denied在尝试执行s3:GetObject

在某一时刻,我在 BB 中有 lambda,它能够执行s3:GetObjectAA 创建的对象。只有当我将 lambda 移动到 CC 时,我才开始遇到 AA 创建的对象的问题。

这是我的 s3 存储桶策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::AA:root"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::BUCKET_NAME/*"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::CC:role/LAMBDA_ARN"
            },
            "Action": "s3:Get*",
            "Resource": "arn:aws:s3::BUCKET_NAME/*"
        }
    ]
}

这是我来自 CC lambda 的声明,它允许访问 s3

        {
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::BUCKET_NAME*",
                "arn:aws:s3:::BUCKET_NAME*/*"
            ],
            "Effect": "Allow",
        }

s3:get*lambda 执行角色对账户 BB具有完全权限。

它是由另一个帐户写入的事实不应影响读取该对象,因为我可以从 AA 中取出写入其中的相同对象,再次将其写入 BB,CC lambda 将能够很好地读取它。

标签: amazon-web-servicesamazon-s3aws-lambdaamazon-iam

解决方案


从其他账户(即从不拥有 S3 存储桶的账户)将对象写入 Amazon S3 时,建议将 ACL 设置bucket-owner-full-control. 这允许存储桶所有者控制对象。

看起来很奇怪,可以在拥有帐户无法访问的存储桶中创建对象!

请参阅:访问控制列表 (ACL) 概述 - Amazon Simple Storage Service


推荐阅读