【问题标题】:How to resolve a circular dependency in AWS Cloudformation如何解决 AWS Cloudformation 中的循环依赖
【发布时间】:2016-10-02 20:33:27
【问题描述】:

我创建了一个 AWS Cloudformation 模板,但无法克服循环依赖。我正在创建一个 EC2 实例和一个负载均衡器,负载均衡器依赖于 EC2 实例,因为它在其 Instances 属性中引用它。一切正常,直到我不得不在 EC2 实例 Init 部分中引用负载均衡器的 DNSName 属性。

"AppServer": {
  "Type": "AWS::EC2::Instance",
  "Metadata": {
    "AWS::CloudFormation::Init" : {
      "configSets" : {
        "Install" : [ "Install" ]
      },
       ...
       ...
       ...
      "Install" : {
        "commands" : {
           "update hostname rmi" : {
            "command" : { "Fn::Join" : [ "", [ "runuser -lm rlt -c \"/home/ec2-user/awscf/update-rmi.sh ", { "Fn::GetAtt" : [ "WebLoadBalancer", "DNSName" ] }, "\"" ] ] }
          },
         }

所以这里的问题是 EC2 实例无法引用负载均衡器,因为它尚未创建,并且无法首先创建负载均衡器,因为它需要 EC2 实例 ID,因此可以关联到它.

我查看了 WaitConditions 和 CreationPolicy,但除非我误解了它们的工作方式,否则我认为它们不会帮助我。基本上我需要的是a)创建EC2实例但在创建LoadBalancer之前不执行UserData或b)首先创建LoadBalancer并且不要将它与EC2实例相关联,一旦创建EC2实例就返回并更新 LoadBalancer 以将其与 EC2 实例相关联。有谁知道这样的事情是否可能?除了创建完整堆栈然后返回并手动更新它之外?理想情况下,我希望这发生在堆栈的单一创建中。

【问题讨论】:

  • 您可以使用 AutoscalingGroup 和 Launch 配置来分离 ELB 对 EC2 实例的依赖。
  • ELB 的instances 不是必填字段。为什么不删除它并让您的脚本将自己添加到 ELB?
  • @tedder42 这是我最初的想法之一,但我该怎么做呢?是否可以在创建后返回并在同一模板中修改 ELB?我试图避免在创建堆栈后修改模板。

标签: amazon-web-services amazon-ec2 amazon-cloudformation


【解决方案1】:

您可能需要在每个资源逻辑名称中添加Ref

我遇到了同样的错误(循环依赖):

  UserData:
    Fn::Base64:
      !Sub  |
      #!/bin/bash -xe
      # ...
      echo "<h1>I amrunning on ASG ${MyAutoScalingGroup}</h1>

添加Ref 解析如下:

  UserData:
    Fn::Base64:
      !Sub  |
      #!/bin/bash -xe
      # ...
      echo "<h1>I amrunning on ASG ${!Ref MyAutoScalingGroup}</h1>

注意:我使用的是 YAML,因为 JSON 在 Cloudformation 中很糟糕。

【讨论】:

    【解决方案2】:

    您可以考虑使用 EC2 实例中的 cfn-get-metadata 帮助程序脚本来检索 Stack::Resource 信息。

    http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-get-metadata.html

    【讨论】:

      猜你喜欢
      • 2018-10-13
      • 2020-06-04
      • 1970-01-01
      • 2018-12-01
      • 2012-03-15
      • 2016-09-21
      • 1970-01-01
      相关资源
      最近更新 更多