これはなに?
Route53とELBを紐付ける際にRoute53のAlias機能を使うがZone IDが違いました。
ELBのHosted zone idとRoute53のAlias Hosted Zone IDは関連性がない(特定条件において)ということをまとめておきます。
混乱のきっかけ
TerraformでRoute53の設定をしようとしていました。
以下のコードがサンプルでよくある設定かと思います。
ELBの情報を元にRoute53を設定しております。
resource "aws_route53_record" "elb" {
zone_id = "domain zone id"
name = "hoge"
type = "A"
alias {
name = "${aws_elb.hoge.dns_name}"
zone_id = "${aws_elb.hoge.zone_id}"
evaluate_target_health = "true"
}
}
問題発生
aws_elb.hoge.zone_id
の値と Route53の Alias Hosted Zone ID
が違う値が設定されていました。
そのためTerraform planを実行すると毎回変更が検知されてしまいました。
AWS Supportに連絡
ELBのHosted zone idとRoute53のAlias Hosted Zone IDは関連性がないと返答をいただきました。
勘違いした際のポイント
同じケースもある
ELBのHosted zone idとRoute53のAlias Hosted Zone IDが同じのケースがあります。
詳細は後で説明します。
Terraformの仕様
zone_id - (Required) Hosted zone ID for a CloudFront distribution, S3 bucket, ELB, or Route 53 hosted zone. See resource_elb.zone_id for example.
こちらに書いてあるがAliasTargetのHostedZoneIdは作成時は必須ではない、削除する時だけ指定する必要がある
http://docs.aws.amazon.com/cli/latest/reference/route53/change-resource-record-sets.html
しかしTerraformでは作成時にも alias.zone_id
の指定が必要である
何故違うのか
Alias Hosted Zone IDで表示されているIDはdualstackのIDです。
dualstackはIPv4とIPv6両方対応したDNS名です。
つまりELBの画面で表示されているHosted zoneとは別物です。
IPv4だけの時も発生する可能性はあるそうです。
まとめ
AWSのマネジメントコンソールからRoute53を変更するとdualstackが自動的に付与されます。
そのため後からTerraformで実装すると今回のようなケースになるかと思います。
仕様を把握するまでかなり混乱しました。
レコードを削除する時に、ELBの値を元に削除しようとするとトラブルが発生する可能性があるので注意が必要です。