我创建了一个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实例关联。有人知道是否可能做到这样的事情吗?除了创建完整的堆栈然后手动返回并更新它之外?理想情况下,我希望这在单个堆栈创建时发生。