Моя команда использует Terraform для развертывания необходимой инфраструктуры.
В настоящее время наш стек состоит из: AutoScalingGroup с балансировщиком нагрузки и DNS-записи Route53, которая указывает на этот LB;
Мы хотели бы расширить стек, включив в него дистрибутив Cloudfront, который указывает на LB, и сделать DNS-запись Route53 указывающей на CDN.
Я бы хотел иметь возможность:
- раскрутить Cloudfront и изменить запись DNS так, чтобы она указывала на CDN, не вызывая простоев;
- разорвать CDN, изменить DNS так, чтобы он указывал на балансировщик нагрузки, не вызывая простоев;
Текущая конфигурация выглядит следующим образом:
resource "aws_lb" "alb" {
name = "${var.alb-name}"
...
}
resource "aws_cloudfront_distribution" "cdn" {
count = "${var.use_cloudfront != "false" ? 1 : 0}"
...
}
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
}
}
Текущее поведение выглядит следующим образом:
- раскрутка CDN с последующей перенаправлением записи DNS для указания на CDN не приводит к простоям;
- разрыв CDN с последующей перенаправлением записи DNS на балансировщик нагрузки приводит к простоям;
Мне известно, что depends_on = ["aws_lb.alb", "aws_cloudfront_distribution.cdn"]
в записи Route53 может быть не лучшим выбором для создания желаемого поведения. Однако я не уверен, как достичь желаемого поведения с помощью terraform.
Мне интересно, есть ли у кого-нибудь предложения по достижению желаемого поведения. Дайте мне знать, если предоставленной информации недостаточно. Спасибо за вашу помощь, она ценится!