Terraform で Route 53 レコードのルーティングポリシーを変更する

Posted on

Terraform で Route 53 レコードのルーティングポリシーを変更するには、いくつかのステップを踏む必要があります。この記事は、ダウンタイムなしにルーティングポリシーを Simple から Weighted に変更する手順を検証したものです。

ルーティングポリシーを変更したい理由は、インフラ構成を刷新するにあたって新環境に徐々にリクエストを流したいからです。

ステップを踏みながら変更する

例として test.manabusakai.com のレコードを Simple から Weighted ルーティングポリシーに変更します。実環境では IP アドレスではなく ALB などの Alias レコードになりますが、手順に違いはありません。

resource "aws_route53_record" "test" {
  zone_id = "Z11GV4TXXXXXXX"
  name    = "test.manabusakai.com"
  type    = "A"
  ttl     = "10"
  records = ["192.0.2.1"]
}

まずはリソース名を分かりやすくするために terraform state mv します。ここでは test_bluetest_green というリソース名にします。

$ terraform state mv aws_route53_record.test aws_route53_record.test_blue
Move "aws_route53_record.test" to "aws_route53_record.test_blue"
Successfully moved 1 object(s).

tfstate が変更されたのでそれに合うようにリソース名 (testtest_blue) を変更し、Weighted に必要な set_identifierweighted_routing_policy を追加します。ここでいったん apply します。

resource "aws_route53_record" "test_blue" {
  zone_id        = "Z11GV4TXXXXXXX"
  name           = "test.manabusakai.com"
  type           = "A"
  ttl            = "10"
  records        = ["192.0.2.1"]
  set_identifier = "blue"

  weighted_routing_policy {
    weight = 100
  }
}

次に test_green を定義します。 apply の順序によってはダウンタイムが発生する可能性があるので、weight は 100 対 0 にしておき test_green 側にはリクエストを流さないようにします。ここでも忘れずに apply します。

resource "aws_route53_record" "test_blue" {
  zone_id        = "Z11GV4TXXXXXXX"
  name           = "test.manabusakai.com"
  type           = "A"
  ttl            = "10"
  records        = ["192.0.2.1"]
  set_identifier = "blue"

  weighted_routing_policy {
    weight = 100
  }
}

resource "aws_route53_record" "test_green" {
  zone_id        = "Z11GV4TXXXXXXX"
  name           = "test.manabusakai.com"
  type           = "A"
  ttl            = "10"
  records        = ["192.0.2.2"]
  set_identifier = "green"

  weighted_routing_policy {
    weight = 0
  }
}

最後に weight を任意の割合に変更します。 weight の変更は update in-place で行われます。それぞれ 50 % ずつリクエストを流したいならこんな感じ。

resource "aws_route53_record" "test_blue" {
  zone_id        = "Z11GV4TXXXXXXX"
  name           = "test.manabusakai.com"
  type           = "A"
  ttl            = "10"
  records        = ["192.0.2.1"]
  set_identifier = "blue"

  weighted_routing_policy {
    weight = 50
  }
}

resource "aws_route53_record" "test_green" {
  zone_id        = "Z11GV4TXXXXXXX"
  name           = "test.manabusakai.com"
  type           = "A"
  ttl            = "10"
  records        = ["192.0.2.2"]
  set_identifier = "green"

  weighted_routing_policy {
    weight = 50
  }
}

端折ってまとめて apply すると予期せぬエラーが発生するので、ステップごとに確認しながら進めるのがポイントです。

おわりに

Management Console から変更したことは何度もあるのですが、いざ Terraform でやろうとするとハマりどころが多くて学びがありました。