【问题标题】:Lambda Access Denied on S3 PutObjectS3 PutObject 上的 Lambda 访问被拒绝
【发布时间】:2019-06-03 16:20:35
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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”的存储桶中创建一个对象。这个我没试过,不过好像是按照上面的规则来的。

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • 我将上述内容复制到我的 lambda 角色的内联策略中,但我仍然收到“拒绝访问”。想法?
        • 不幸的是,“访问被拒绝”是 CloudWatch 日志中的完整错误消息
        • 我认为对"Resource" 键使用通配符 (*) 不是最佳做法,这是一种允许的方式。我有这个完全相同的问题。我的解决方案如下。
        • @codeinaire 如果您阅读了我的回答,它表明 OP 可以“开始”,一旦他的功能正常工作,他可以​​“锁定”到特定资源。
        • @captainblack 是的,我明白你在说什么。您提供的解决方案更普遍适用且更灵活,但并未具体回答问题。 OP 表示他们希望它应用该操作的唯一资源是一个存储桶,它使您提供的解决方案通用。我相信我提供的答案更具体到 OP 的问题,尽管不像您的解决方案那样普遍或灵活。这有意义吗?
        【解决方案4】:

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

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

        注意:您应该将s3:PutObjecct 付诸行动。 希望对你有所帮助。

        【讨论】:

          猜你喜欢
          • 2012-09-11
          • 2017-08-04
          • 1970-01-01
          • 2020-06-30
          • 2020-09-30
          • 1970-01-01
          • 2021-05-19
          • 1970-01-01
          • 2020-12-26
          相关资源
          最近更新 更多