我正在使用CFT创建一个IAM策略,该策略仅允许单独访问一个S3存储桶(这也是在同一CFT本身中创建的)。这是CFT问题所在的部分
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"BucketCreation":{
"Type": "AWS::S3::Bucket",
"Properties": {
"BucketName":"samplebucket",
}
},
"IAMPolicy":{
"Type": "AWS::IAM::Policy",
"Properties": {
"PolicyName": "ListS3BucketsPolicy",
"PolicyDocument": {
"Statement": [{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": "Fn::GetAtt" : [ "BucketCreation" , "Arn" ]
}]
}
}
}
}
}
现在,上面的cft使用资源语句"Resource": "arn:aws:s3:::bucketname"
创建了一个IAM策略,这仅提供了存储桶访问权限,而没有对象级访问权限。我需要的是资源部分,看起来像这样"Resource": "arn:aws:s3:::bucketname/*"
。在CFT中有可能吗?
答案 0 :(得分:1)
是的,请参见here
您可以使用通配符作为资源ARN的一部分。您可以使用 任何ARN段(各部分中的通配符(*和?) 用冒号分隔)。星号(*)表示以下各项的任意组合: 零个或多个字符,问号(?)代表任何单个字符 字符。您可以使用多个*或?每个段中的字符,但 通配符不能跨越段。
此ARN使用ARN的相对ID部分中的通配符*来 识别示例存储桶中的所有对象。
更新:
为了简化/*
,请像intrinsic functions那样查看Join
答案 1 :(得分:0)
感谢@titogeo。我找到了解决方法。在这里
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"BucketCreation":{
"Type": "AWS::S3::Bucket",
"Properties": {
"BucketName":"samplebucket"
}
},
"IAMPolicy":{
"Type": "AWS::IAM::Policy",
"Properties": {
"PolicyName": "ListS3BucketsPolicy",
"PolicyDocument": {
"Statement": [{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource":{
"Fn::Join":["",[
{
"Fn::GetAtt" : [ "BucketCreation" , "Arn" ]
},
"/*"
]
]
}
}]
}
}
}
}
}
P.S:对不起,我的意愿很差。我对此感到沮丧,如果有人可以修复它,那将是有帮助的。