TerraformでSPFレコードを作る
SPFレコードとは、DNSサーバにTXTレコードとして登録する特殊なフォーマットのこと。メール送信者の認証に用いる。
ご存知の通り、メールをサーバから送信する際、Fromヘッダには自由にメールアドレスを設定することができる(他者のドメインであっても)。これに対し、受信者側が「本当にそのFromに設定されたアドレスのドメインは送信者の持ち物か?」を確認する手段の1つがSPFレコード。例えばGMailサーバはSPFをパスしないとほぼ確実に迷惑メール扱いしてくる。したがって、メールを送信するWebアプリケーションを構築する場合SPFレコードを正しく設定するのはほぼ必須となる。
SPFレコードについてより詳しく知りたい方はこちらを参照して欲しい。
で、今回は、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"
のようになる。
ポイントは、こんな感じ。
- 変数としてIPアドレスを受け取る
- 実際にはEC2インスタンスの
public_ip
attributeを拾ってくることになる
- 実際にはEC2インスタンスの
- IPアドレスを複数渡せる
"template_file"
を使ってレコード文字列を組み立て- 冗長化したアプリケーションサーバそれぞれからメールが送られる設計の場合は複数のIPアドレスをセットできる必要がある
設定したら、こちらのサイトで確認しておこう。