【发布时间】:2017-01-30 13:28:04
【问题描述】:
我有一个允许用户定义 S3 存储桶的模板。在同一个模板中,我可以选择添加 Lambda 触发器、SQS 触发器和 SNS 触发器。
为了成功创建带有可选触发器的 S3 存储桶,我需要为选定的触发器创建策略。
我面临的问题是,有时它可以工作,有时它不是由于竞争条件。如果 Bucket 在策略之前创建,则堆栈创建失败。
我尝试在 S3 Bucket 资源上添加条件 DependsOn 属性,但 DependsOn 只接受字符串。
这就是我的 DependsOn 属性的样子:
"S3Bucket": {
"Type": "AWS::S3::Bucket",
"DependsOn": [{
"Fn::If": ["DoCreateQueueTrigger",
"SQSMessagePermission",
""]
}],
}
我唯一能想到的就是在模板执行到 Bucket 创建之前暂停它。
有办法吗?
【问题讨论】:
-
我没有时间检查它,所以不能 100% 确定这是否可行,但您可以尝试返回
{"Ref" : "AWS::NoValue" }而不是""以获取"Fn::If"的 else 条件? -
我也试过了。它不起作用。
-
还有一个想法 - 将策略放入嵌套堆栈中,并让存储桶依赖于嵌套堆栈。嵌套堆栈只有在其所有资源都完成时才会被认为是完整的。如果您需要在其他资源中引用创建的策略,可以将其作为嵌套堆栈输出传递出去。
-
还没有尝试过,但如果我认为我也会在那里遇到同样的情况。我将不得不在主模板中使用依赖属性来不执行不需要创建的子模板
-
对于子模板,我总是会创建子模板,然后让子模板决定创建哪些策略。然后子模板将始终存在,如果没有创建策略,它将立即完成并允许“DependsOn”依赖项被视为已完成。如果创建了一些策略,则只有在创建所有条件策略时,子模板才会完整。但是 - 听起来你现在有一个解决方案!
标签: amazon-web-services amazon-cloudformation