我正在尝试编写一个蓝色/绿色CFT,它会拆除并重建EC2实例,ELB并使用此ELB的更新DNS名称更新Route53记录别名。
如果Alias Record DOESNT存在,我可以在创建EC2实例并且ELB附加这些实例后正确创建别名记录集。但是如果记录集中存在旧的ELB DNS名称,则CFT 失败,其中" Alias RecordSet存在"。当然 - 我希望在运行完整的CFT时使用更新的ELB DNS名称更新此记录。有什么建议吗?
"HostRecord" : {
"Type" : "AWS::Route53::RecordSet",
"Properties" : {
"HostedZoneName" : "REDACTED",
"Comment" : "Updates the ELB DNS name into Route 54 recordset.",
"Name" : "REDACTED",
"Type" : "A",
"AliasTarget" : {
"DNSName" : { "Fn::GetAtt" : [ "ESClusterELB" , "DNSName" ] },
"HostedZoneId" : { "Fn::GetAtt" : [ "ESClusterELB" , "CanonicalHostedZoneNameID" ] }
}
答案 0 :(得分:1)
不支持从2个不同的CloudFormation堆栈管理单个资源(例如RecordSet)。
我对您的用例有一些建议:
答案 1 :(得分:1)
您的问题似乎与创建两个具有无法共存的冲突资源的 CloudFormation 堆栈有关。解决此问题的一种方法是始终以可以共存的方式创建别名记录。
应该允许的一种方法是创建加权路由类型。将两个堆栈实例中记录集的权重设置为 1,并将记录集 ID 分别设置为“蓝色”或“绿色”。
现在您应该能够并排部署两个 CFN 堆栈而不会发生冲突。如果蓝色堆栈实例处于活动状态而绿色未激活,则所有 dns 响应都将返回蓝色别名。当您激活绿色时,它将在蓝色旁边创建一个记录集,并且应该开始占用大约一半的流量。现在,如果您停用蓝色堆栈,绿色将接管所有流量。
这确实意味着您需要禁用蓝色以完全隔离地测试绿色,这可能有点不方便并且可能会减慢回滚速度。您可以进行两阶段部署,将权重保留为堆栈参数,然后一旦以权重 = 1 部署绿色,以权重 = 0 重新部署蓝色以将其从 dns 中取出,而不会将其拆除。如果绿色不好,你可以停用它,权重为零的蓝色应该接管。
加权路由只是一种路由类型选项,您还可以查看多值答案、故障转移甚至地理位置。
答案 2 :(得分:0)
只是为了发挥创造力。您还可以设置一个参数,该参数在CF中设置一个条件,该条件将为Route53执行不同的部分,例如,对CF具有条件。创建,删除,忽略。这样的事情。