我有一个允许用户定义S3 Bucket的模板。在同一模板中,我可以选择添加Lambda触发器,SQS触发器和SNS触发器。
为了使用可选触发器成功创建S3 Bucket,我需要为所选触发器创建策略。
我面临的问题是,有时它会起作用,有时它不会因竞争条件而产生。如果在策略之前创建了Bucket,则堆栈创建将失败。
我尝试在S3 Bucket资源上添加条件DependsOn属性,但DependsOn只接受字符串。
这就是我的DependsOn属性的样子:
"S3Bucket": {
"Type": "AWS::S3::Bucket",
"DependsOn": [{
"Fn::If": ["DoCreateQueueTrigger",
"SQSMessagePermission",
""]
}],
}
我唯一能想到的就是在模板执行到达Bucket创建之前暂停模板。
有办法吗?
答案 0 :(得分:0)
您可以通过声明两个具有相同名称的互惠条件资源来完成此任务:一个声明可选触发器,另一个是“空资源”,当真实资源未实际创建时,它只接受DependsOn
声明:
Conditions:
DoCreateTrigger: !Equals [!Ref CreateTrigger, true]
NotCreateTrigger: !Not [!Equals [!Ref CreateTrigger, true]]
Resources:
SQSMessagePermission:
Condition: NotCreateTrigger
Type: AWS::CloudFormation::WaitConditionHandle
SQSMessagePermission:
Condition: DoCreateTrigger
Type: AWS::SQS::QueuePolicy
Properties:
# ...etc...
S3Bucket:
Type: AWS::S3::Bucket
DependsOn: [SQSMessagePermission]
Properties:
# ...etc...