当前位置: 首页 > 知识库问答 >
问题:

带有AdministratorAccess的AWS Lambda在保存到具有ACL“public read”的s3时抛出“访问被拒绝”

史阳晖
2023-03-14

我下面的AWS演练设置AWS Lambda生成缩略图从一个S3桶:当一个源桶收到一个新对象,它调用一个lambda转换该对象,并将其缩略图保存到一个目标桶。一切都与默认代码片段一起工作,其中没有为对象指定ACL,在这种情况下,S3会自动将其设置为Private。但是,当我修改代码并将对象的ACL设置为公共读取时,Lambda无法将对象保存到目标桶中,并抛出一个访问拒绝错误。

s3.putObject({
    Bucket: dstBucket,
    Key: dstKey,
    Body: data,
    ContentType: 'image/jpeg',
    ACL: 'public-read',
    StorageClass: style.storageClass})

在本教程之后,我通过IAMadminuser向lambda添加了以下访问策略:

aws lambda add-permission \
--function-name CreateThumbnail \
--region eu-west-1 \
--statement-id some-unique-id \
--action "lambda:InvokeFunction" \
--principal s3.amazonaws.com \
--source-arn arn:aws:s3:::sourcebucket \
--source-account bucket-owner-account-id \
--profile adminuser

adminuser是组的一部分,该组具有AdministratorAccess,允许对所有资源执行所有操作:

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

所以我真的不知道为什么Lambda没有保存“公共读取”对象的权限。

遵循本教程,Lambda还具有一个AWSLambdaExecute角色,该角色赋予其在桶上执行所有必要操作的权限:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:*"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::*"
    }
  ]
}

虽然我可以在桶级别的所有资源上设置“公共读取”策略,但我希望在目标桶中保留一些对象的私有性。

共有1个答案

江承嗣
2023-03-14

看起来像AWSLambdaExecute角色策略,教程建议附加到Lambda缺少指定对象ACL的权限。为了解决这个问题,我附加了一个额外的内联策略,它授予lambda对"s3: PutObjectAcl"操作的权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::*"
        }
    ]
}

要避免lambda有两个策略,只需指定一个自定义策略,如下所示:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Resource": "arn:aws:s3:::*"
    }
  ]
}

多亏了这个答案。

 类似资料:
  • 问题内容: 通过将此Applet与JDBC结合使用,我将获得以下错误 问题答案: 如果不采取措施为小程序赋予适当的权限,您将无法在小程序中运行JDBC。Oracle 的本教程详细介绍了该主题。

  • 我正试图用预签名的URL直接上传一个文件到S3 bucket,但在PUT请求上出现AccessDenied(403 Plibended)错误。 附注。忘了补充。我已经尝试添加和以及并且在本例中上载工作正常,但是如何限制上载的访问?它应该只适用于预签名的URL,对吗?

  • 我有一个lambda函数,它使用一个具有以下策略摘录的角色 我的桶策略如下所示 我在角色和bucket策略上都允许使用GetObject和ListBucket。但是,当我的函数运行时 我明白了 [错误]ClientError:调用GetObject操作时发生错误(AccessDenied):拒绝访问 我还需要添加哪些权限?对象就在那里,当我使用管理员角色在本地运行代码时,我可以得到它。 最新消息

  • 我正在尝试将图像上传到我的AWS存储桶,我创建了一个新用户授予他完整的控制权 但是,在上传时,我收到以下错误: 05-27 07:09:47.219: W/System.err(20594):com.amazonaws.services.s3.model.Amazon S3异常:访问被拒绝(服务:Amazon S3;状态代码:403;错误代码:访问被拒绝;请求ID:),S3扩展请求ID:/=

  • 问题内容: 我有一个奇怪的错误。我通过命令行以root用户身份登录到本地Mysql。创建数据库后: 然后给某些用户特权: 这给出了错误: 根目录的权限(显示授予;)显示: 我还要确保以root用户身份登录: 这确认我以“ root” @“ localhost”的身份登录 我已经创建了数据库并多次分配了用户,但从未遇到问题。为什么以root用户身份登录时无法将用户分配给root用户创建的数据库? P

  • 为了访问我的S3 bucket,我导出了我的cred 我可以通过做 我还可以用boto3验证它在python中工作 我可以看到文件在桶里。 然而,当我使用Spark执行此操作时: 我得到了一个很好的 这是我在本地提交作业的方式 spark-submit--packages com.amazonaws:aws--sdk-pom:1.11.98,org.apache.hadoop:hadoop-aws