我有一个CFn脚本,旨在建立通向S3存储桶的多区域路径。
模板可以创建目标存储桶和必要策略,也可以采用现有存储桶名称的参数。在第一种情况下,我们可以使用DependsOn: MyBucketPolicy
,以便在拥有权限之前不会开始跟踪。在第二种情况下,路径不应该依赖任何内容。不幸的是,在某些情况下不允许使用功能。
Philip Garbe提供了this workaround(#7),我将其应用于自己的模板。但是,目前尚不清楚它为什么起作用。
Conditions:
BucketExists: !Not [!Equals [!Ref pExistingBucket, ""]]
NeedNewBucket: !Equals [!Ref pExistingBucket, ""]
Resources:
GovernanceBucketPolicy:
Type: AWS::S3::BucketPolicy
Condition: NeedNewBucket
BucketPolicyWaitHandle:
Type: "AWS::CloudFormation::WaitConditionHandle"
Condition: NeedNewBucket
DependsOn: MyBucketPolicy
WaitHandle:
Type: "AWS::CloudFormation::WaitConditionHandle"
WaitCondition:
Type: "AWS::CloudFormation::WaitCondition"
Properties:
Handle: !If
- NeedNewBucket
- !Ref BucketPolicyWaitHandle
- !Ref WaitHandle
Timeout: "1"
Count: 0
MyTrail:
Type: AWS::CloudTrail::Trail
DependsOn: WaitCondition
S3BucketName: !If [BucketExists, !Sub ${pExistingBucket}, !Ref MyBucket]
我认为由于计数为0,所以立即触发了等待条件。The docs对此进行解释
如果等待条件在超时时间到期之前收到了必要数量的成功信号(如Count属性中所定义),则AWS CloudFormation会将等待条件标记为CREATE_COMPLETE并继续创建堆栈。
但是,尽管我认为这是唯一可行的原因,但是似乎没有提及等待句柄的创建。我在文档中缺少什么吗?在标记为完成之前,等待是否还需要其句柄存在?在一起有更好的方法吗?