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_ipattributeを拾ってくることになる
- 実際にはEC2インスタンスの
- IPアドレスを複数渡せる
"template_file"を使ってレコード文字列を組み立て- 冗長化したアプリケーションサーバそれぞれからメールが送られる設計の場合は複数のIPアドレスをセットできる必要がある
設定したら、こちらのサイトで確認しておこう。