CloudflareのDNSレコードをTerraformで管理する

何番煎じだけどTerraformやってみたくなったのでメモ。

準備

Terraform

Terraformを入れる。tfenvを使っておくと後々便利そう。

$ brew install tfenv
$ tfenv list-remote
1.12.0-alpha20250319
1.12.0-alpha20250312
1.12.0-alpha20250213
1.11.2
1.11.1

見た感じ新しそうな1.11.2を使うことにした。

$ tfenv install 1.11.2
$ tfenv use 1.11.2

確認

$ terraform --version
Terraform v1.11.2
on darwin_arm64

cf-terraforming

Cloudflareから既存の設定を持ってきてくれるやつ。 なぜかbrewでインストールするとTapが壊れるのでgo installした。

$ go install github.com/cloudflare/cf-terraforming/cmd/cf-terraforming@latest

キー類の取得

APIトークンの取得

「Cloudflare>プロフィール>APIトークン>トークンを作成する」と辿るとトークンを作成する画面に行ける。今回はDNSレコードを編集したいだけなので、「ゾーンIDを編集する」を選んだ。

Cloudflareのトークンを作成する画面

ここで作成したキーを控えておく。

ゾーンIDの取得

操作対象のドメインの「概要>API>ゾーンID」も控えておく。

事初め

最初にプロバイダーを書く。

# provider.tf
terraform {
    required_providers {
        cloudflare = {
            source = "cloudflare/cloudflare"
            version = "~> 5"
        }   
    }
}

provider "cloudflare" { }

次に、書いた設定を元にinitする。

$ terraform init

CloudflareのDNSレコードのインポート

Cloudflareに既にあるDNSレコードの情報をとってくる。

$ export CLOUDFLARE_API_TOKEN='<取得してきたAPIトークン>'
$ export CLOUDFLARE_ZONE_ID='<取得してきたゾーンID>'
$ cf-terraforming generate  --resource-type "cloudflare_dns_record"  --zone $CLOUDFLARE_ZONE_ID > records.tf
$ cf-terraforming import  --resource-type "cloudflare_dns_record"  --zone $CLOUDFLARE_ZONE_ID | sh

これで上手く取得できているはず。 最後に差分がないことを確認しておく。

$ terraform plan
No changes. Your infrastructure matches the configuration.

いかにもよさそう。

DNSレコードの追加

records.tfにこんな感じで追記してみた。

resource "cloudflare_dns_record" "test_resource" {
  content  = "this is test"
  name     = "ドメイン"
  proxied  = false
  ttl      = 1
  type     = "TXT"
  zone_id  = "ゾーンID"
  settings = {}
}

変更の確認

$ terraform plan
Plan: 1 to add, 0 to change, 0 to destroy.

大丈夫そうなら反映する。

$ terraform apply
Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

これでとりあえず入門はできたかな。 次はGitHubでCI/CDしたいよね。

参考

zenn.dev

github.com

registry.terraform.io

dev.classmethod.jp