跨账户调用时,S3 拒绝访问

问题描述 投票:0回答:2

我有一个 AWS 数据帐户,其中有一个 S3 存储桶。我有几个 AWS 工作人员账户,其中有 AWS Lambda 函数。我希望 Lambda 函数将对象推送到数据帐户中的 S3 存储桶中。

我在数据帐户中配置了一个具有 S3 完全访问权限的角色 R1,以及一个与工作人员帐户建立可信实体并授予这些帐户

assumerole
访问权限的策略。我还配置了一个存储桶策略,允许 R1 访问 S3 存储桶。

在工作人员帐户中,我为 Lambda 函数配置了角色 R2。 R2 角色附加了一个策略,表示它可以

assumeRole
R1。当我尝试从 Lambda 函数中执行
putObject
时,我得到
403 access denied

我不知道这个链条中的哪里不起作用,该错误完全不伦不类且无用,我查看的每个文档都只讨论如何通过控制台执行此操作,而我正在使用 CloudFormation 来执行此操作。我不确定如何开始调试它,因为我不确定是否有一种简单的方法来模拟角色并查看其功能。有什么建议吗?

amazon-web-services amazon-s3 aws-lambda amazon-iam
2个回答
0
投票

另一种方法是:

  • 存储桶策略添加到数据帐户中的 S3 存储桶。在策略中,为每个工作线程 AWS Lambda 函数使用的 IAM 角色授予 PutObject 权限。
  • 在每个工作人员 Lambda 函数使用的 IAM 角色中授予权限,以将对象放入中央存储桶中

也就是说,两个帐户都允许访问。

然后,Lambda 函数可以直接写入存储桶,而无需承担 IAM 角色。


0
投票

我发现 AWS S3 存储桶有趣的一点是,表面上,您在存储桶策略中需要多个资源

甚至指定了存储桶策略

Resource
乍一看似乎很奇怪 - 当然,资源就是存储桶。但是,仔细观察,该策略允许您指定存储桶内的对象,并进行全局匹配。

因此,如果要列出存储桶中的项目,则需要包含存储桶,如果要下载,则还需要包含对象。

例如,与另一个帐户共享存储桶,

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "example",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::1234567890:root"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::mystery-bucket",
                "arn:aws:s3:::mystery-bucket/*"
            ]
        }
    ]
}

如果您删除示例中的

"arn:aws:s3:::mystery-bucket"
"arn:aws:s3:::mystery-bucket/*"
(并保持允许的操作相同),您将无法分别列出存储桶中的对象或从存储桶中下载对象,帐户为 1234567890。

© www.soinside.com 2019 - 2024. All rights reserved.