Политика восстановления после отказа маршрута 53 с terraform - PullRequest
0 голосов
/ 22 октября 2018

Я пытался создать политику аварийного переключения для домена в AWS с использованием terraform. Проблема заключается в том, что за обоими ресурсами route53 в качестве ОСНОВНОГО и ВТОРИЧНОГО указывается только одно имя elb dns.Я на самом деле хочу, чтобы это использовало имя северного вирджинского имени как ПЕРВИЧНОЕ, а Орегон как ВТОРИЧНОЕ.

Это многорегиональная архитектура, и я создал модули с одним и тем же исходным каталогом.

Имя файла: route53.tf

resource "aws_route53_record" "www1" {
  zone_id = "Zone-ID"
  name    = "www1"
  type    = "A"
  #ttl     = "5"

  failover_routing_policy {
    type = "PRIMARY"
  }

  set_identifier = "www1"
  #records        = ["${aws_elb.web.dns_name}"]
  alias {
    name                   = "${aws_elb.web.dns_name}"
    zone_id                = "${aws_elb.web.zone_id}"
    evaluate_target_health = true
  }

}
resource "aws_route53_record" "www2" {
  zone_id = "Zone-ID"
  name    = "www2"
  type    = "A"
  #ttl     = "5"

  failover_routing_policy {
    type = "SECONDARY"
  }

  set_identifier = "www2"
  #records        = ["${aws_elb.web.dns_name}"]
  alias {
    name                   = "${aws_elb.web.dns_name}"
    zone_id                = "${aws_elb.web.zone_id}"
    evaluate_target_health = true
  }
}

Имя файла: alb_elb.tf

resource "aws_elb" "web" {
  name               = "web-elb"
  availability_zones = "${var.az}"

  listener {
    instance_port     = 8000
    instance_protocol = "http"
    lb_port           = 80
    lb_protocol       = "http"
  }

  health_check {
    healthy_threshold   = 2
    unhealthy_threshold = 2
    timeout             = 3
    target              = "HTTP:8000/"
    interval            = 30
  }

  instances                   = ["${aws_instance.web.*.id}"]
  cross_zone_load_balancing   = true
  idle_timeout                = 400
  connection_draining         = true
  connection_draining_timeout = 400

  tags {
    Name = "foobar-terraform-elb"
  }
}

Имя файла: main.tf.

module "north-virginia" {
  source = "./modules/production"
  region = "us-east-1"
  az = ["us-east-1a", "us-east-1b", "us-east-1c"]
}

module "oregon" {
  source = "./modules/production"
  region = "us-west-2"
  az = ["us-west-2a", "us-west-2b", "us-west-2c"]
}

Имя файла: ./production/module/main.tf

variable region { }

variable az { 
type = "list" 
}

provider "aws" {
  region = "${var.region}"
  profile = "personal"
  shared_credentials_file = "~/.aws/credentials"
}

data "aws_caller_identity" "current" {}

output "account_id" {
  value = "${data.aws_caller_identity.current.account_id}"
}

Дерево каталогов:

.
├── main.tf
└── modules
    ├── dev
    │   ├── ec2.tf
    │   ├── main.tf
    │   └── route53.tf
    ├── production
    │   ├── aws_elb.tf
    │   ├── aws_instance.tf
    │   ├── main.tf
    │   └── route53.tf
    └── qa
        ├── ec2.tf
        ├── main.tf
        └── route53.tf

1 Ответ

0 голосов
/ 22 октября 2018

В вашем производственном / alb_elb.tf добавьте следующее:

output "dns_name" {
value = "${aws_elb.web.dns_name}"
}

Это выведет имя DNS.
В вашем main.tf создайте отдельный модуль для route53.
этот модульдолжен выглядеть так:

module "route53" {
  source = "./modules/route53"
  name1 = "${module.north-virginia.dns_name}"
  name2 = "${module.oregon.dns_name}"
}

ваш route53.tf должен выглядеть примерно так:

variable "name1" ()
varibale "name2" ()
resource "aws_route53_record" "www1" {
  zone_id = "Zone-ID"
  name    = "www1"
  type    = "A"
  #ttl     = "5"

  failover_routing_policy {
    type = "PRIMARY"
  }

  set_identifier = "www1"
  #records        = ["${aws_elb.web.dns_name}"]
  alias {
    name                   = "${var.name1}"
    zone_id                = "${aws_elb.web.zone_id}"
    evaluate_target_health = true
  }

}
resource "aws_route53_record" "www2" {
  zone_id = "Zone-ID"
  name    = "www2"
  type    = "A"
  #ttl     = "5"

  failover_routing_policy {
    type = "SECONDARY"
  }

  set_identifier = "www2"
  #records        = ["${aws_elb.web.dns_name}"]
  alias {
    name                   = "${var.name2}"
    zone_id                = "${aws_elb.web.zone_id}"
    evaluate_target_health = true
  }
}
...