🛕

[Terraform]AWS・GCPのDNSにSPF(TXT)レコードを設定するtfファイル実装例

2020/10/01に公開

published_at: 2019-11-03 13:39


じぶん G Suite をひとり運用しているのですが、ちょっと思いつきでドメインエイリアス追加はじめたら
なんやかや気づいたし、意外に情報がなかったので試行錯誤して個人的にたのしかったついでに投稿。

refs

設定する tf ファイル例

for GCP Cloud DNS

.terraform-version

0.11.14

clouddns.tf


resource "google_dns_managed_zone" "mydomain" {
  name     = "(任意のゾーン名)"
  dns_name = "(ドメイン名)."     # 末尾の `.` は必要っぽい
}

resource "google_dns_record_set" "spf_TXT" {
  managed_zone = "${google_dns_managed_zone.mydomain.name}"
  name         = "${google_dns_managed_zone.mydomain.dns_name}"
  type         = "TXT"
  ttl          = 3600
  rrdatas      = ["\"v=spf1 include:_spf.google.com ~all\""]
}

for AWS Route53

.terraform-version

0.12.13

route53.tf


resource "aws_route53_record" "spf_TXT" {
  zone_id = var.zone_id
  name    = var.zone_name
  ttl     = "3600"
  type    = "TXT"
  records = ["v=spf1 include:_spf.google.com ~all"]
}

variables.tf


# ・・・(他にも変数あるんですが省略)

variable "zone_id"   {}
variable "zone_name" {}

コメントなど

  • G Suite で ドメイン認証が完了してしまえば google-site-verification=XXXXX... の TXT レコードは削除してしまっても大丈夫そう
    • かわりにSPFのTXTレコードを投入したかたち。複数行のTXTレコードの書き方は把握しておきたい
  • G Suite のヘルプに書いてあった、名前 / ホスト / エイリアス - 「@」と入力するか、空白のままにします。
    • 空白のまま のほうが妥当そう。terraform apply で 以下のようになる
      • (google) google_dns_record_set.spf_txt: Error creating DNS RecordSet: googleapi: Error 400: Invalid value for 'entity.change.additions[0].name': '@', invalid
      • (aws) エラーが出ずに Route53 に適用されるが、空白にして apply し直したあともマネージドコンソールにレコードが残る。どうしようもなかったので手動削除した。
  • google は rrdatas でダブルクオートをエスケープしないとならない(スペースで区切られてしまう)のに対して、aws の records はエスケープ不要
  • TTLは一発目は 300 くらいにして apply して、5分後くらいに以下を確認したあとで 3600 で apply し直した
    • SPFチェッカーでグリーンな感じ
    • テストメールを送ってメールヘッダーorメッセージのソースを確認して SPFが PASS となる
  • apply 後の状況を tf ファイルで収集しておきたくて terraformer で以下のコマンドで回収を試みたのがだ、google のが回収できていない。v0.12 に upgrade が必要そう。。
    • (aws: 回収成功) terraformer import aws --regions=ap-northeast-1 --resources=route53
      • @ のレコードがあると、終わりはするのだが以下のようなエラーがコンソール出力される
        ERROR: Read resource response is null for resource aws_route53_record.tfer--...._TXT_
        ERROR: Unable to refresh resource tfer--...._TXT_
    • (google: 回収できてない) terraformer import google --resources=dns --projects=(PROJECT_NAME)
      • 以下のコンソール出力
        google importing project (PROJECT_NAME) region global
        google importing... dns
        plugin error 1: Incompatible API version with plugin. Plugin version: 4, Client versions: [5]
        Incompatible API version with plugin. Plugin version: 4, Client versions: [5]

SPFチェッカー

Discussion