我有一个使用以下策略摘录的角色的Lambda函数:
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::ipwl-lambda-config/*",
"arn:aws:s3:::ipwl-lambda-config"
]
}
我的存储桶策略如下所示
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyUnEncryptedObjectUploads",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::ipwl-lambda-config/*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption": "aws:kms"
}
}
},
{
"Sid": "AllowLambda",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::accountid:role/iam_for_lambda"
},
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::ipwl-lambda-config/*",
"arn:aws:s3:::ipwl-lambda-config"
]
}
]
}
我已经在角色和存储桶策略上允许了GetObject和ListBucket。然而,当我的函数运行时,执行以下代码:
s3_obj = s3_res.Object(s3_bucket, s3_object)
我遇到了如下错误:
[ERROR] ClientError: 在调用GetObject操作时发生错误(AccessDenied):拒绝访问
我需要添加哪些权限?该对象存在,当我使用管理员角色在本地运行代码时可以获取到它。
更新
我已经数十次检查了存储桶和对象名称是否正确。根据堆栈跟踪,实际上是来自这里的第二行代码引起了异常。
s3_res = boto3.resource('s3')
s3_obj = s3_res.Object(s3_bucket, s3_object)
data = s3_obj.get()['Body'].read()
KMS 仅适用于 PutObject。我们有一个支持帐户,所以我可以向他们查询并更新他们的发现。
s3_res.Object
抛出了错误吗?也许您有其他的S3操作?此外,我很好奇KMS如何适用于此。 - Marcin