Lambda对S3 PutObject的访问被拒绝

9
我创建了一个新的 S3 存储桶,并保留了所有默认设置。我试图使用 PutObject 方法从 Lambda 函数将对象写入存储桶,但无论我附加什么策略或做什么,我都会在该操作上得到 "访问被拒绝" 的错误提示,除非我编辑存储桶 ACL 并将其设置为完全公开。显然这不是一个很好的解决方案。我真的不知道发生了什么:我知道我以前曾经没有任何特殊设置就完成了此操作。Lambda 和 S3 存储桶都在同一个账户中,并且分配给 Lambda 的角色已附加 AWSLambdaFullAccess 策略。我快疯了,希望能得到帮助。
4个回答

9

很不幸,仅有"s3:PutObject"是不够的,你会持续收到403访问被拒绝错误。

你应该在Lambda角色中添加"s3:PutObjectAcl"策略。


2

我也遇到了这个问题。

解决方案

我通过以下策略解决了这个问题:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PetsS3Write",
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::<bucket name or wildcard if you want all buckets writable>/*"
        }
    ]
}

评论

如果您查看IAM控制台中的实际策略,您会发现这将使lambda对存储桶和任何对象具有写访问权限。在资源标题下,IAM视图中的策略如下所示:

BucketName | string like | auth0-test-hucket, ObjectPath | string like | All

如果没有结尾的通配符,它将不会允许写入任何对象到存储桶,因为它无法命名该对象,因为没有权限这样做。如果您编辑策略,您将能够指定Bucket nameObject name

因此,我假设可以用字符串替换通配符,并且它将限制对该特定字符串的写访问权限。例如,如果您将通配符替换为“oneObject”,则只能在名为“oneObject”的存储桶中创建对象。我还没有尝试过这个方法,但它似乎符合上述规则。


0

根据您为Lambda函数分配的权限集,AWSLambdaFullAccess无法访问您的S3存储桶。除了这些权限之外,您还需要允许访问S3。如果您只需要PutObject权限,则可以将以下策略添加到Lambda角色中。请记住,这些权限可以进一步锁定到资源级别,但您可以从这些开始:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1546988882992",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}

您可以根据您的需求添加或删除更多的 S3 权限。


1
我将上述内容复制到了我的 Lambda 角色内联策略中,但仍然收到“访问被拒绝”的错误。有什么想法? - LandonC
很遗憾,“access denied”是CloudWatch日志中的完整错误消息。 - LandonC
1
我认为在“Resource”键中使用通配符(*)不是最佳实践,它太过宽泛。我曾经遇到过完全相同的问题。我的解决方案如下。 - codeinaire
如果您仔细阅读我的回答,就会发现我说原帖的提问者可以“从那里开始”,一旦他的函数能够正常工作,就可以将其“锁定”到特定的资源上。 - captainblack
@captainblack,是的,我明白你的意思。你提供的解决方案更加通用和灵活,但并没有直接回答问题。OP表示他们想要应用操作的唯一资源是一个存储桶,这使得你提供的解决方案过于普遍。我认为我提供的答案更具体地回答了OP的问题,尽管不像你的解决方案那样具有普适性和灵活性。这有道理吗? - codeinaire

-1

您应该为s3存储桶更改策略。 这样您就可以使用以下代码。

  iamRoleStatements:
    - Effect: 'Allow'
      Action:
        - 's3:PutObject'
        - 's3:GetObject'
      Resource: "arn:aws:s3:::*/*"
    - Effect: 'Allow'
      Action:
        - 's3:ListBucket'
      Resource: "arn:aws:s3:::*"

注意:您应该将s3:PutObjecct放入动作中。 希望对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接