DNSのレコードをGitHubで管理 & 自動反映する

最近調布技研という団体のDNSのネームサーバーをCloudflareに変えてみた。 Cloudflareは無料でAPIつきのネームサーバーとCDNが使えてとても便利そうだったので。

www.cloudflare.com

APIつきのネームサーバーが使えるようになったので、レコード管理 & 反映の自動化をやってみた。

DNSレコードをGitHubで管理する

管理するために作ったのがこちら。

github.com

TerraformにCloudflareのproviderがあったので、これを使ってレコード設定を記述するようにした。

Provider: Cloudflare - Terraform by HashiCorp

Cloudflareの設定 (cloudflare.tf)

variable "cloudflare_email" {
  description = "cloudflare email"
}

variable "cloudflare_apikey" {
  description = "cloudflare api key"
}

provider "cloudflare" {
  email = "${var.cloudflare_email}"
  token = "${var.cloudflare_apikey}"
}

上記がTerraformのCloudflare providerを使うために必要な設定で、CloudflareのAPIキーをここに書いても動くけど、publicなリポジトリなので実行時に環境変数で渡すことにした。

レコードの設定 (record.tf)

resource "cloudflare_record" "chofu_tech_A" {
    domain = "chofu.tech"
    name = "chofu.tech"
    value = "151.101.100.133"
    type = "A"
}

resource "cloudflare_record" "www_chofu_tech_A" {
    domain = "chofu.tech"
    name = "www.chofu.tech"
    value = "151.101.100.133"
    type = "A"
}

こんな感じでレコードを列挙していく。ただのテキストファイルなのでこれでプルリクベースで管理できるようになった。

DNSレコードの設定変更が自動反映されるようにする

プルリクのマージ後に自動で実行するためのツールとしてCircleCIを使った。

circleci.com

CircleCIは実行時に渡す環境変数が設定できて、その環境変数は外部から読めないようにできるのでAPIキーを隠しておきたい場合に便利。

TF_VAR_cloudflare_email = "hoge@example.com"
TF_VAR_cloudflare_apikey = "hogehoge"

環境変数はこの2つを設定しておいた。 TF_VAR_ で始まる環境変数はTerraform内のパラメータとして使える。
あとは、CircleCIの設定ファイルに master ブランチに変更があった場合は terraform plan のみ実行(反映はされない)、 production ブランチに変更があった場合は terraform apply を実行(実際に反映される) されるようにして反映が自動で行われるようにした。

chofutech-public-dns-record/circle.yml at master · chofutech/chofutech-public-dns-record · GitHub

これでしばらく運用してみて便利そうだったら自分のドメインもこんな感じで管理してみようかなと思う。