当前位置:  开发笔记 > 编程语言 > 正文

使用ACL"public-read"保存到s3时,带有AdministratorAccess的AWS Lambda会抛出"拒绝访问"

如何解决《使用ACL"public-read"保存到s3时,带有AdministratorAccess的AWSLambda会抛出"拒绝访问"》经验,为你挑选了1个好方法。

我正在关注设置AWS Lambda的AWS演练,该Lamb Lambda从S3存储桶生成缩略图:当sourcebucket接收到新对象时,它会调用lambda来转换该对象并将其缩略图保存为destination bucket.一切都与默认代码片段一起使用,其中没有为对象指定ACL,在这种情况下S3会自动将其设置为private.但是,当我修改代码并将对象的ACL设置为时'public-read',Lambda无法将对象保存到目标存储桶中并引发'Access Denied'错误.

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

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

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> Sbbs..:

看起来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:::*"
    }
  ]
}

感谢这个答案.

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有