Dns 地形:路由53、LB和CDN相互依赖

Dns 地形:路由53、LB和CDN相互依赖,dns,terraform,amazon-cloudfront,Dns,Terraform,Amazon Cloudfront,我的团队使用Terraform部署必要的基础设施。 目前,我们的堆栈由以下部分组成:由负载平衡器前置的AutoScalingGroup和指向此LB的Route53 DNS记录 我们希望扩展堆栈以包括指向LB的Cloudfront分发,并使Route53 DNS记录指向CDN 我希望能够: 启动Cloudfront并将DNS记录更改为指向CDN,而不会导致任何停机 拆下CDN,将DNS改为指向负载均衡器,不会造成任何停机 当前配置如下所示: resource "aws_lb" "alb" {

我的团队使用Terraform部署必要的基础设施。 目前,我们的堆栈由以下部分组成:由负载平衡器前置的AutoScalingGroup和指向此LB的Route53 DNS记录

我们希望扩展堆栈以包括指向LB的Cloudfront分发,并使Route53 DNS记录指向CDN

我希望能够:

  • 启动Cloudfront并将DNS记录更改为指向CDN,而不会导致任何停机
  • 拆下CDN,将DNS改为指向负载均衡器,不会造成任何停机
当前配置如下所示:

resource "aws_lb" "alb" {
  name                       = "${var.alb-name}"
  ...
}
当前行为如下所示:

resource "aws_lb" "alb" {
  name                       = "${var.alb-name}"
  ...
}
  • CDN的启动,然后重新路由DNS记录以指向CDN,不会导致任何停机
  • 断开CDN,然后将DNS记录重新路由到负载平衡器,确实会导致停机
我知道Route53记录上的
依赖=[“aws_lb.alb”,“aws_cloudfront_distribution.cdn”]
可能不是创建所需行为的最佳选择。但是,我不确定如何使用terraform实现所需的行为


我想知道是否有人有任何建议,以达到预期的行为。如果提供的信息不足,请告诉我。谢谢你的帮助,非常感谢

从事物的快速扫描来看,这应该是你看到的行为。这个图表是什么样子的?如果这两个更改没有按照您的描述进行,您能否显示应用这两个更改的输出?另外,如果您正在使用资源中这些资源的输出,您也不需要
dependens\u on
,因为Terraform已经知道它需要按照该顺序构建依赖链。我已经用Terraform执行的输出创建了一个要点:我没有一个图表来显示您,如果需要,我可以在下面的运行中执行@ydaetskcoRI认为CDN拆卸过程中的问题是,路由53只有在CDN被破坏后才会改变。此时,已经有停机时间了。但是,我不知道如何让它在创建CDN时等待,以及在销毁CDN时不等待。也就是说,在拆卸过程中,理想情况下,我们希望在不等待CDN被销毁的情况下重新路由到LB。这就是为什么我相信“依赖”不是最好的策略,但我不知道如何做我需要的:嘘。。我觉得这很奇怪。你能编辑这个问题以包含plan和plan destroy的图形吗?我已经创建了“plan”图形:但是,“terraform graph-type=plan destroy | dot-Tsvg>graph destroy.svg”命令生成了一个空的svg文件。我不确定这是不是错了@伊代茨科
resource "aws_route53_record" "www" {
  count = "${var.domain-name != "" ? 1 : 0}"

  depends_on = ["aws_lb.alb", "aws_cloudfront_distribution.cdn"]  

  zone_id = "${data.aws_route53_zone.primary.zone_id}"
  name    = "${var.domain-name}"
  type    = "A"

  alias = {
    // we use concat because 'count' makes the response of the resource a list. 
    // link to similar issue: https://stackoverflow.com/questions/45654774/terraform-conditional-resource
    name                   = "${var.use_cloudfront == "true" ? element(concat(aws_cloudfront_distribution.cdn.*.domain_name, list("")), 0) : aws_lb.alb.dns_name}"    
    zone_id                = "${var.use_cloudfront == "true" ? element(concat(aws_cloudfront_distribution.cdn.*.hosted_zone_id, list("")), 0) : aws_lb.alb.zone_id}"
    evaluate_target_health = true
  }
}