TerraformでSendGridのDNSレコードをAWS Route53に登録してみた

TerraformでSendGridのDNSレコードをAWS Route53に登録してみた

2025.10.15

はじめに

ドメインのDNS管理は、時間が経過すると多数のDNSレコードが登録され、各レコードの目的や登録時期を把握することが困難になります。

今回、Amazon Route 53で管理しているドメインにSendGridのドメイン認証を設定する必要があったため、IaCツールであるTerraformを使ってDNSレコードを管理する方法を実践してみました。

環境準備

本記事では以下の環境を使用しています。

  • Terraform v1.13.3
  • aws-cli v2.22.3 (Python v3.12.6)
  • SendGridアカウント
  • AWSアカウント

手順

前提条件

SendGridでドメイン登録が完了し、DNSレコード情報が取得できている状態を前提とします。
(参考:SendGridドメイン認証手順

1. プロジェクトの準備

任意のディレクトリにプロジェクトフォルダを作成し、以下2つのファイルを配置します。

  • terraform.tf - Terraformの基本設定ファイル
  • main.tf - リソース定義ファイル

2. terraform.tf の作成

Terraformのプロバイダー設定とバージョン指定を行います。

			
			terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.92"
    }
  }
  
  required_version = ">= 1.2"
}

		

3. main.tf の作成

Route 53のDNSレコードを定義します。以下のコードでは、SendGridのドメイン認証に必要な3つのCNAMEレコードと1つのTXTレコード(DMARC)を作成します。

			
			# AWSプロバイダーの設定
# region指定は必須だが、Route 53はグローバルサービスのため実際には影響しない
# 他のリージョナルサービス(EC2, RDSなど)を追加する場合のデフォルトリージョンとなる
provider "aws" {
  region = "ap-northeast-1"  # 任意のリージョンでOK(例:東京リージョン)
}

# 既存のRoute 53ホストゾーンを参照
# data ソースは既存のAWSリソースを読み取り専用で参照する
# ※事前にAWSコンソールでホストゾーンが作成されている必要があります
data "aws_route53_zone" "primary" {
  name = "your-domain.com"  # あなたのドメイン名に置き換えてください
}

# SendGridのドメイン認証用CNAME レコード #1
# SendGridからメールを送信するための設定
resource "aws_route53_record" "sendgrid-cname-1" {
  zone_id = data.aws_route53_zone.primary.zone_id  # 上記で参照したホストゾーンのID
  name    = "em9104.your-domain.com"                # サブドメイン名(SendGridから提供される)
  type    = "CNAME"                                  # CNAMEレコードタイプ
  ttl     = 300                                      # Time To Live(秒)- DNSキャッシュの有効期限
  records = ["u56591258.wl009.sendgrid.net"]        # 指し先のドメイン(SendGridから提供される)
}

# SendGridのDKIM認証用CNAME レコード #1
# DKIM (DomainKeys Identified Mail) - メールの送信元を検証するための電子署名
resource "aws_route53_record" "sendgrid-cname-2" {
  zone_id = data.aws_route53_zone.primary.zone_id
  name    = "gsg._domainkey.your-domain.com"             # DKIMレコード用のサブドメイン
  type    = "CNAME"
  ttl     = 300
  records = ["gsg.domainkey.u56591258.wl009.sendgrid.net"]
}

# SendGridのDKIM認証用CNAME レコード #2
# SendGridはセキュリティのため2つのDKIMレコードを使用
resource "aws_route53_record" "sendgrid-cname-3" {
  zone_id = data.aws_route53_zone.primary.zone_id
  name    = "gsg2._domainkey.your-domain.com"            # 2つ目のDKIMレコード用サブドメイン
  type    = "CNAME"
  ttl     = 300
  records = ["gsg2.domainkey.u56591258.wl009.sendgrid.net"]
}

# DMARC (Domain-based Message Authentication, Reporting & Conformance) TXTレコード
# メール認証の失敗時の処理方法を指定するポリシー
resource "aws_route53_record" "sendgrid-txt" {
  zone_id = data.aws_route53_zone.primary.zone_id
  name    = "_dmarc.your-domain.com"                     # DMARCレコードは_dmarcサブドメインに設定
  type    = "TXT"                                         # TXTレコードタイプ(テキストデータを格納)
  ttl     = 300
  records = ["v=DMARC1; p=none;"]                        # DMARC v1、ポリシー=none(監視のみ、拒否しない)
}

		

4. Terraform の実行

以下のコマンドを順に実行します。

  1. AWS認証情報の設定

    			
    			export AWS_PROFILE=your-profile
    
    		

    Route 53の編集権限を持つAWSプロファイルに切り替えます。

  2. Terraformの初期化

    			
    			terraform init
    
    		

    必要なプロバイダープラグインをダウンロードし、作業ディレクトリを初期化します。

  3. 実行プランの確認

    			
    			terraform plan
    
    		

    実際にリソースを作成する前に、どのような変更が行われるかを確認します。

  4. リソースの作成

    			
    			terraform apply
    
    		

    実際にAWSへリソースを作成します。承認を求められた場合は yes を入力してください。

実行が完了すると、Route 53の your-domain.com Hosted Zoneに以下のようにDNSレコードが作成されます。

			
			aws_route53_record.sendgrid-cname-1: Creating...
aws_route53_record.sendgrid-txt: Creating...
aws_route53_record.sendgrid-cname-3: Creating...
aws_route53_record.sendgrid-cname-2: Creating...
aws_route53_record.sendgrid-cname-3: Still creating... [00m10s elapsed]
aws_route53_record.sendgrid-txt: Still creating... [00m10s elapsed]
aws_route53_record.sendgrid-cname-1: Still creating... [00m10s elapsed]
aws_route53_record.sendgrid-cname-2: Still creating... [00m10s elapsed]
aws_route53_record.sendgrid-txt: Still creating... [00m20s elapsed]
aws_route53_record.sendgrid-cname-1: Still creating... [00m20s elapsed]
aws_route53_record.sendgrid-cname-2: Still creating... [00m20s elapsed]
aws_route53_record.sendgrid-cname-3: Still creating... [00m20s elapsed]
aws_route53_record.sendgrid-cname-1: Still creating... [00m30s elapsed]
aws_route53_record.sendgrid-cname-3: Still creating... [00m30s elapsed]
aws_route53_record.sendgrid-txt: Still creating... [00m30s elapsed]
aws_route53_record.sendgrid-cname-2: Still creating... [00m30s elapsed]
aws_route53_record.sendgrid-txt: Creation complete after 34s [id=Z08853872IAZIZ9BKLHIO__dmarc.your-domain.com_TXT]
aws_route53_record.sendgrid-cname-1: Creation complete after 34s [id=Z08853872IAZIZ9BKLHIO_em9104.your-domain.com_CNAME]
aws_route53_record.sendgrid-cname-2: Creation complete after 34s [id=Z08853872IAZIZ9BKLHIO_gsg._domainkey.your-domain.com_CNAME]
aws_route53_record.sendgrid-cname-3: Creation complete after 34s [id=Z08853872IAZIZ9BKLHIO_gsg2._domainkey.your-domain.com_CNAME]

Apply complete! Resources: 4 added, 0 changed, 0 destroyed.

		

約30秒ほどでDNSレコードの作成が完了します。

Screenshot 2025-10-14 at 7.46.28 PM

Route 53のコンソールで確認すると、上記のように4つのDNSレコードが正しく作成されていることが確認できます。

まとめ

TerraformでSendGridのドメイン認証に必要なDNSレコードをコード管理することで、以下のメリットが得られます。

  • DNSレコードの目的と設定内容が明確に記録される
  • 変更履歴をGitなどで管理できる
  • 同じ設定を他のドメインへ容易に適用可能

今後、DNS設定の変更が必要になった場合も、Terraformのコードを修正して terraform apply を実行するだけで、安全かつ確実に変更を反映できます。

この記事をシェアする

FacebookHatena blogX

関連記事