Lambda访问被S3 PutObject拒绝

时间:2019-01-08 22:52:08

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

我创建了一个新的S3存储桶,并将所有默认设置保留在原位。我正在尝试使用PutObject方法从lambda函数将对象写入存储桶。无论我采用何种策略或执行何种操作,都会对操作执行“拒绝访问”操作, 除非我编辑存储桶ACL并将其完全公开。显然,这不是一个很好的解决方案。我真的不知道发生了什么:我知道我之前没有做任何特殊设置就已经做到了。 Lambda和S3存储桶都在同一帐户中,分配给lambda的角色已附加AWSLambdaFullAccess策略。我快疯了,任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

不幸的是,"s3:PutObject"不足以使其运行-您将不断收到403 Access denied错误。

您应该将"s3:PutObjectAcl"策略添加到Lambda角色中。

答案 2 :(得分:0)

我遇到了这个确切的问题。

解决方案

我解决该问题的方法是使用以下政策:

{
    "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”的对象。我没有尝试过,但是似乎遵循上述规则。

答案 3 :(得分:0)

您应该更改 s3 存储桶的策略。 所以你可以使用下面的代码。

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

注意:您应该将 s3:PutObjecct 置于 Action 中。 希望对您有所帮助。