TerraformでSESの設定をする機会があったので記事にします。
SPFとDKIMとDMARCの認証を含めてまるっとTerraformでデプロイします。

なお、DNSはすでに作成済みのRoute 53ホストゾーンを使う想定です。

設定手順

Terraformコード

まずはSESのIDを定義します。
ドメイン名はこのあとよく出てくるので変数で定義しておきます。

variable "domain_name" {
  type    = string
  default = "iret.media"
}

# SES
resource "aws_ses_domain_identity" "main" {
  domain = var.domain_name
}

次にDKIMとSPFの設定を定義します。
(depends_onは明示しなくても通るかもしれないですが念のため)

## For DKIM
resource "aws_ses_domain_dkim" "main" {
  domain = var.domain_name

  depends_on = [
    aws_ses_domain_identity.main
  ]
}

## For SPF
resource "aws_ses_domain_mail_from" "main" {
  domain           = var.domain_name
  mail_from_domain = "mail.${var.domain_name}"

  depends_on = [
    aws_ses_domain_identity.main
  ]
}

最後にDNSレコードを定義します。
SESのID・SPF・DKIM・DMARCの認証をしています。

# For SES
resource "aws_route53_record" "ses_txt" {
  zone_id = aws_route53_zone.primary.zone_id
  name    = "_amazonses.${var.domain_name}"
  type    = "TXT"
  ttl     = "600"
  records = [aws_ses_domain_identity.main.verification_token]
}

# For DKIM
resource "aws_route53_record" "ses_dkim" {
  count   = 3
  zone_id = aws_route53_zone.primary.zone_id
  name    = "${element(aws_ses_domain_dkim.main.dkim_tokens, count.index)}._domainkey.${var.domain_name}"
  type    = "CNAME"
  ttl     = "600"
  records = ["${element(aws_ses_domain_dkim.main.dkim_tokens, count.index)}.dkim.amazonses.com"]
}

# For SPF
resource "aws_route53_record" "ses_spf_mx" {
  zone_id = aws_route53_zone.primary.zone_id
  name    = aws_ses_domain_mail_from.main.mail_from_domain
  type    = "MX"
  ttl     = "600"
  records = ["10 feedback-smtp.ap-northeast-1.amazonses.com"]
}

resource "aws_route53_record" "ses_spf_txt" {
  zone_id = aws_route53_zone.primary.zone_id
  name    = aws_ses_domain_mail_from.main.mail_from_domain
  type    = "TXT"
  ttl     = "600"
  records = ["v=spf1 include:amazonses.com ~all"]
}

# For DMARC
resource "aws_route53_record" "ses_dmarc" {
  zone_id = aws_route53_zone.primary.zone_id
  name    = "_dmarc.${var.domain_name}"
  type    = "TXT"
  ttl     = "600"
  records = ["v=DMARC1;p=quarantine;pct=25;rua=mailto:dmarcreports@${var.domain_name}"]
}

Terraformデプロイ

変更内容を確認します。

terraform plan

内容確認して問題なければデプロイします。

terraform apply

デプロイが完了すれば、SESのIDの作成からSPF・DKIM・DMARCの設定まで完了します。