如何解决AWS Cloudformation中的循环依赖问题

3

我创建了一个AWS Cloudformation模板,但是遇到了循环依赖的问题。我正在创建一个EC2实例和一个负载均衡器,负载均衡器依赖于EC2实例,因为它在其“Instances”属性中引用了它。一切都很顺利,直到我不得不在EC2实例的初始化部分中引用负载均衡器的“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 来将 ELB 依赖于 EC2 实例分离。 - kavin
ELB的“instances”不是必需字段。为什么不将其删除并让脚本将自己添加到ELB中呢? - tedder42
@tedder42 这是我最初的想法之一,但我该如何做呢?在创建后是否可以返回并修改同一模板中的ELB?我试图避免在堆栈创建后修改模板。 - so cal cheesehead
2个回答

0
您可能需要为每个资源逻辑名称添加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中很糟糕。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接