3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS】Terraform で別のアカウントにサブドメインのパブリックホストゾーンを作成する

Last updated at Posted at 2025-09-12

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

のようにすることで、実際に委任できているかが確認できます。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?