我正在尝试构建一个AWS Lambda函数,用于下载并将一些数据写入S3存储桶。我遇到的问题是对S3本身的写入操作会引发PermissionDenied
错误。
这反过来暗示我没有正确地写这个角色。但是,我不确定我做错了什么。
我有五个存储桶,mta-gtfs-N
上有一些变体。我已将以下角色分配给Lambda函数:
{ "Version": "2012-10-17", "Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"s3:*"
],
"Resource": [
"arn:aws:s3:::mta-gtfs-1",
"arn:aws:s3:::mta-gtfs-21",
"arn:aws:s3:::mta-gtfs-11",
"arn:aws:s3:::mta-gtfs-16",
"arn:aws:s3:::mta-gtfs-2"
]
}
] }
有人可以发现我的错误吗?
答案 0 :(得分:3)
您需要在资源字符串的末尾添加/*
,以便访问存储桶内的操作。示例:arn:aws:s3:::mta-gtfs-1/*
所以你的Resource
数组应该是
"Resource": [
"arn:aws:s3:::mta-gtfs-1/*",
"arn:aws:s3:::mta-gtfs-21/*",
"arn:aws:s3:::mta-gtfs-11/*",
"arn:aws:s3:::mta-gtfs-16/*",
"arn:aws:s3:::mta-gtfs-2/*"
]
使用上述资源部分的政策将允许Get
,Put
对象等操作。如果要执行像S3:ListBucket
这样的桶级操作,则需要省略/*
并使用您当前使用的方式使用资源名称,但对于S3:*Object
之类的操作,您需要/*
1}}(它也可以是“文件夹”前缀,如<Bucket>/home/*
)
以下是test
广告资源的sample policy。请注意/*
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::test"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::test/*"]
}
]
}
答案 1 :(得分:1)
您的政策应重写为:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::mta-gtfs-*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:AbortMultipartUpload",
"s3:ListMultipartUploadParts",
"s3:ListBucketMultipartUploads"
],
"Resource": [
"arn:aws:s3:::mta-gtfs-*/*"
]
}
]
}