Terraform を用いてほかのアカウントにあるドメインのサブドメイン用パブリックホストゾーンを作成する サンプルコード を作成しました。
新しくパブリックホストゾーンを作成することで、自由度が上がります。特に ACM の発行やレコードの追加が assume role なしでできます。
バグや改善点などがあれば、教えてください。コメントでも PR でも大歓迎です。
要点の解説
parent-phz
これは、ドメインのパブリックホストゾーンがあるアカウントで行います。
Assume ロール
resource "aws_iam_role" "cross_account" {
name = "${var.sub_domain}-cross-account-role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = "sts:AssumeRole"
Effect = "Allow"
Principal = {
AWS = "arn:aws:iam::${var.sub_phz_account_id}:root"
}
}
]
})
tags = var.tags
}
サブドメインアカウントから、ドメインのアカウントにアクセスする必要があります。そこで、 IAM ロールを作成しておきます。
sub-phz
これは、新しくパブリックホストゾーンを作成するアカウントで行います。
Assume ロールを引き受けたプロバイダ
provider "aws" {
alias = "parent"
region = var.aws_parent_phz_region
assume_role {
role_arn = var.cross_account_role_arn
}
}
ドメイン用のアカウントに対してアクセスするためのプロバイダ定義を別でしています。assume ロールとして、先ほど作成した IAM ロールの ARN を指定します。
これによって、 IAM ロールでアクセス許可をされているリソースにアクセスできます。たとえば、元のドメインのパブリックホストゾーンなどです。
NS レコードの追加 (名前解決の委任)
resource "aws_route53_record" "delegate_ns" {
provider = aws.parent
zone_id = data.aws_route53_zone.parent.zone_id
name = var.sub_domain
type = "NS"
ttl = 300
records = aws_route53_zone.sub.name_servers
}
元のドメインのパブリックホストゾーンに NS レコードを追加しています。レコードとして新しいパブリックホストゾーンのネームサーバーを指定します。
これによって、.com -> <ドメイン>.com -> <サブドメイン>.com のようにネームサーバーが委任されていき、名前解決を新しいパブリックホストゾーンで行ってくれます。
$ dig +trace <サブドメイン>.com @198.41.0.4
のようにすることで、実際に委任できているかが確認できます。