这通常是由于IAM策略与资源之间的不匹配引起的。在CloudFormation模板中,您需要确保给出的IAM策略与资源正确匹配。
以下是一个简单的例子:
Resources:
S3Bucket:
Type: 'AWS::S3::Bucket'
Properties:
BucketName: my-bucket
S3BucketPolicy:
Type: 'AWS::S3::BucketPolicy'
Properties:
PolicyDocument:
Statement:
- Effect: Allow
Principal: "*"
Action: "s3:GetObject"
Resource: !Sub 'arn:aws:s3:::${S3Bucket}/*'
Bucket: !Ref 'S3Bucket'
在这个例子中,我们定义了一个S3存储桶并为其分配了一个策略。请注意,我们使用“!Sub”函数来动态引用S3存储桶的名称。
确保IAM策略与资源匹配的另一种方法是使用CloudFormation的“DependsOn”属性,该属性允许指定在哪个资源之前创建特定资源。例如:
Resources:
IAMUser:
Type: 'AWS::IAM::User'
Properties:
UserName: myuser
IAMUserPolicy:
Type: 'AWS::IAM::Policy'
Properties:
PolicyName: mypolicy
PolicyDocument: |
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:*"
],
"Resource": "*"
}
]
}
Users:
- !Ref IAMUser
DependsOn: IAMUser
在这个例子中,我们创建了一个IAM用户,并分配了一个策略。使用“DependsOn”属性,我们确保IAM用户在IAM策略之前创建。
通过这些方法,您可以避免AWS预处理CloudFormation堆栈错误:策略分配错误导致回滚。