TerraformでSendGridのDNSレコードをAWS Route53に登録してみた
はじめに
ドメインの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 の実行
以下のコマンドを順に実行します。
-
AWS認証情報の設定
export AWS_PROFILE=your-profile
Route 53の編集権限を持つAWSプロファイルに切り替えます。
-
Terraformの初期化
terraform init
必要なプロバイダープラグインをダウンロードし、作業ディレクトリを初期化します。
-
実行プランの確認
terraform plan
実際にリソースを作成する前に、どのような変更が行われるかを確認します。
-
リソースの作成
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レコードの作成が完了します。
Route 53のコンソールで確認すると、上記のように4つのDNSレコードが正しく作成されていることが確認できます。
まとめ
TerraformでSendGridのドメイン認証に必要なDNSレコードをコード管理することで、以下のメリットが得られます。
- DNSレコードの目的と設定内容が明確に記録される
- 変更履歴をGitなどで管理できる
- 同じ設定を他のドメインへ容易に適用可能
今後、DNS設定の変更が必要になった場合も、Terraformのコードを修正して terraform apply
を実行するだけで、安全かつ確実に変更を反映できます。