【问题标题】:Pause resource creation in CloudFormation template在 CloudFormation 模板中暂停资源创建
【发布时间】: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


【解决方案1】:

您可以通过声明两个同名的互惠条件资源来实现此目的:一个声明可选触发器,另一个声明“空资源”,当实际资源并未实际创建时,它仅接受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...

【讨论】:

    猜你喜欢
    • 2019-11-05
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 2019-06-13
    • 2021-04-22
    • 2017-07-15
    • 2011-07-12
    • 1970-01-01
    相关资源
    最近更新 更多