我正在关注设置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:::*" } ] }
虽然我可以在桶级别的所有资源上设置"公共读取"策略,但我希望在目标存储桶中保留一些私有对象.
看起来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:::*" } ] }
感谢这个答案.