TerraformでSPFレコードを作る

SPFレコードとは、DNSサーバにTXTレコードとして登録する特殊なフォーマットのこと。メール送信者の認証に用いる。

ご存知の通り、メールをサーバから送信する際、Fromヘッダには自由にメールアドレスを設定することができる(他者のドメインであっても)。これに対し、受信者側が「本当にそのFromに設定されたアドレスのドメインは送信者の持ち物か?」を確認する手段の1つがSPFレコード。例えばGMailサーバはSPFをパスしないとほぼ確実に迷惑メール扱いしてくる。したがって、メールを送信するWebアプリケーションを構築する場合SPFレコードを正しく設定するのはほぼ必須となる。

SPFレコードについてより詳しく知りたい方はこちらを参照して欲しい。

sendgrid.kke.co.jp

で、今回は、Route53上にTerraformからSPFレコードを設定しようという話。

SPFレコードを作成する部分のみを抜粋すると以下のようになる。

variable "zone_id" { }
variable "zone_name" { }
variable "mail_sender_count" { }
variable "mail_sender_ips" { type = "list" }

data "template_file" "spf_ips" {
  count = "${var.mail_sender_count}"

  template = "ip4:$${ip}"
  vars     = {
    ip = "${element(var.mail_sender_ips, count.index)}"
  }
}

resource "aws_route53_record" "txt_spf" {
  zone_id = "${var.zone_id}"
  name    = "${var.zone_name}"
  type    = "TXT"
  ttl     = 300
  records = ["v=spf1 ${join(" ", data.template_file.spf_ips.*.rendered)} -all"]
}

このコードを用いると、例えば mail_sender_ips["1.2.3.4", "5.6.7.8"] を渡すと、作成されるTXTレコードは

"v=spf1 ip4:1.2.3.4 ip4:5.6.7.8 -all"

のようになる。

ポイントは、こんな感じ。

設定したら、こちらのサイトで確認しておこう。