【发布时间】:2016-12-23 14:53:45
【问题描述】:
我正在尝试使用 S3 存储桶策略提供对存储桶的一般访问权限,同时还允许使用角色策略对角色进行特定访问。 Lambda 函数使用该角色来处理存储桶中的对象。它在第一个障碍处被阻止 - 它无法获取带有前缀“incoming/”的任何东西,即使它在角色策略中被允许,并且在存储桶策略中没有明确拒绝。
角色政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowBucketPut",
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::bucket-name/*"
},
{
"Sid": "AllowIncomingGetDelete",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::bucket-name",
"Condition": {
"StringLike": {
"s3:prefix": "incoming/*"
}
}
}
]
}
注意:我还尝试删除条件并将资源更改为“arn:aws:s3:::bucket-name/incoming*”,这似乎只会改变策略模拟器的行为方式。另一个注意事项: GET from the bucket with "incoming/*" 前缀在模拟器中确实有效,只是在实践中无效。
我没有删除以下存储桶策略中的任何声明,因为我不确定哪些可能相关。 IP 地址已被省略。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowPublicList",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::bucket-name",
"Condition": {
"StringLike": {
"s3:prefix": "public*"
}
}
},
{
"Sid": "AllowPublicGet",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket-name/public*"
},
{
"Sid": "AllowPrivateList",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::bucket-name",
"Condition": {
"StringLike": {
"s3:prefix": "private*"
},
"IpAddress": {
"aws:SourceIp": [
"..."
]
}
}
},
{
"Sid": "AllowPrivateGet",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket-name/private*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"..."
]
}
}
},
{
"Sid": "AllowIncomingPut",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::bucket-name/incoming*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"..."
]
}
}
}
]
}
为文字墙道歉。
我不明白为什么我的角色无法获取前缀为“incoming/”的对象。
执行以下操作时,Lambda 函数会出现 403 访问被拒绝:
S3.download_file(bucket, key, localfile)
【问题讨论】:
标签: amazon-web-services amazon-s3 lambda amazon-iam