【发布时间】: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