【问题标题】:How do I resolve this circular reference in AWS CloudFormation?如何在 AWS CloudFormation 中解决此循环引用?
【发布时间】:2021-06-11 14:29:57
【问题描述】:

我正在使用 CloudFormation 创建一个通用堆栈模板,但遇到了一个相当烦人的循环引用。

总体要求:

  1. 我希望能够预置(很多其他的东西,但主要是)一个 ECS 集群服务,它使用容量提供程序自动扩展,容量提供程序使用自动扩展组,自动扩展组使用启动模板。

  2. 我不想要静态资源名称。如果由于更新而必须重新创建资源并且该特定资源必须具有唯一名称,则会导致问题。

问题:

如果启动模板“知道集群名称”(通过 UserData),服务任务就会陷入 PROVISIONING 状态。

所以我们有了第一个依赖链:

启动模板

但是Cluster有一个依赖链:

集群

因此,我们有一个循环引用:Cluster Launch Template

——

我能想到的解决这个问题的一种方法是在另一个资源的名称(位于此依赖链之外,例如目标组)的名称中添加一个后缀作为集群的名称;这样,它就不是静态的,而且还删除了循环引用。

我的问题是:有没有更好的方法?

感觉应该有一个资源,集群可以订阅,ec2实例可以发布到,这将消除循环依赖以及分配资源名称的需要。

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation


    【解决方案1】:

    分享来自 GitHub 问题的更新。通过引入一个新资源:集群容量提供者协会打破了循环依赖关系。

    https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-clustercapacityproviderassociations.html

    要在我的示例中使用它,您:

    1. 创建集群(不指定名称)
    2. 创建启动模板(使用 Ref 获取集群名称)
    3. 创建 Auto Scaling 组
    4. 创建容量提供者
    5. 创建集群容量提供程序关联

    一个问题是,您必须等待新关联创建完成,然后才能在集群上创建服务。所以请确保您的服务“依赖”这些关联!

    【讨论】:

      【解决方案2】:

      没有这样的资源可以打破依赖关系,并且必须预先定义集群名称。这已经被认为是一个问题,它是开放 github 问题的一部分:

      其中一个问题是:

      打破循环依赖,以便创建未命名的集群

      目前一个解决方法 noted 是部分预定义名称,例如:

      ECSCluster:
        Type: AWS::ECS::Cluster
        Properties:
          ClusterName: !Sub ${AWS::StackName}-ECSCluster
      
      LaunchConfiguration:
        Type: AWS::AutoScaling::LaunchConfiguration
        Properties:
          UserData:
            Fn::Base64: !Sub |
                #!/bin/bash
                echo ECS_CLUSTER=${AWS::StackName}-ECSCluster >> /etc/ecs/ecs.config
      

      或者,可以尝试通过开发一些custom resource 来解决这个问题,该custom resource 将以lambda 函数的形式出现。因此,您可能可以使用具有一些虚拟名称的启动模板 (LT) 创建未命名的集群。然后,一旦集群运行,您将使用自定义资源创建具有更新集群名称的新版本 LT,并刷新您的自动扩展组以使用新的 LT 版本。但我不确定这是否可行。尽管如此,它至少可以考虑。

      【讨论】:

      • 谢谢!我将关注 GitHub 问题以获得更好的解决方案 =) 目前,我为集群名称添加了一个后缀堆栈名称
      • @ChrisPhilips 没问题。希望 ECS 中的循环依赖问题能在不久的将来得到解决。
      • 我已经更新了接受的答案,因为现在有一个资源打破了循环依赖链。
      • @ChrisPhilips 这是个好消息。谢谢你告诉我。
      猜你喜欢
      • 2016-10-02
      • 2018-10-13
      • 2011-10-19
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 2020-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多