CloudFormation Route53 - 更新现有的RecordSet

时间:2018-02-16 17:38:59

标签: amazon-cloudformation amazon-route53

我正在尝试编写一个蓝色/绿色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" ] }
    }

3 个答案:

答案 0 :(得分:1)

不支持从2个不同的CloudFormation堆栈管理单个资源(例如RecordSet)。

我对您的用例有一些建议:

  1. 我建议您独立于您用于蓝/绿的模板管理记录。一旦创建/更新绿色并且您希望您的记录为绿色ELB解析,您只需更新管理RecordSet的堆栈,将其设置为适当的别名。
  2. 使用与第一个建议相同的基础。您可以在创建/更新堆栈时使用CloudFormation触发的SNS通知自动执行此操作。将它与Lambda结合使用,您可以动态更新控制RecordSet的堆栈。
  3. 您可以创建一个custom resource,仅用于将记录集更新为所需别名。

答案 1 :(得分:1)

您的问题似乎与创建两个具有无法共存的冲突资源的 CloudFormation 堆栈有关。解决此问题的一种方法是始终以可以共存的方式创建别名记录。

应该允许的一种方法是创建加权路由类型。将两个堆栈实例中记录集的权重设置为 1,并将记录集 ID 分别设置为“蓝色”或“绿色”。

现在您应该能够并排部署两个 CFN 堆栈而不会发生冲突。如果蓝色堆栈实例处于活动状态而绿色未激活,则所有 dns 响应都将返回蓝色别名。当您激活绿色时,它将在蓝色旁边创建一个记录集,并且应该开始占用大约一半的流量。现在,如果您停用蓝色堆栈,绿色将接管所有流量。

这确实意味着您需要禁用蓝色以完全隔离地测试绿色,这可能有点不方便并且可能会减慢回滚速度。您可以进行两阶段部署,将权重保留为堆栈参数,然后一旦以权重 = 1 部署绿色,以权重 = 0 重新部署蓝色以将其从 dns 中取出,而不会将其拆除。如果绿色不好,你可以停用它,权重为零的蓝色应该接管。

加权路由只是一种路由类型选项,您还可以查看多值答案、故障转移甚至地理位置。

答案 2 :(得分:0)

只是为了发挥创造力。您还可以设置一个参数,该参数在CF中设置一个条件,该条件将为Route53执行不同的部分,例如,对CF具有条件。创建,删除,忽略。这样的事情。