01 Jan 2018, 07:34

TerraformでCloudFlareのDNS設定を操る

あけましておめでとうございます。今年も本ブログおよびmosuke5をよろしくお願いします。
新年元旦のブログなので軽く。年末年始は普段できない開発をやっていて、そこでできたちょっとしたメモを。

趣味で作っているサービスで、基盤はAWSを利用し、CloudFlareも利用したい理由もありDNSの設定などはRoute53ではなくCloudFlareで制御する必要があった。複数のサービスをまたいで設定を管理できるTerraformの出番なわけだが、その設定方法についてメモしておく。

設定方法

まずはAWS側の設定を見ておく。
今回はELB使うわけではなかったので、EC2インスタンスにElasticIPをバインドした。 aws側のTerraformのコードでいつも通りEIPを購入する。

# aws.tf
resource "aws_eip" "main" {
  instance = "${aws_instance.main.id}"
  vpc      = true
}

次に、CloudFlare側のコードをみる。
CloudFlareをTerraformで扱うには3つの情報が必要なのでここは変数化しておくとよい。
providerを指定し、あとはresouceを書いていく。

# cloudflare.tf
variable "cloudflare_email" {}
variable "cloudflare_token" {}
variable "cloudflare_domain" {}

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

resource "cloudflare_record" "gill-search-manage" {
  domain = "${var.cloudflare_domain}"
  name   = "gill-search-manage"
  value  = "${aws_eip.main.public_ip}"
  type   = "A"
  ttl    = 1
  proxied = false
}

resource "cloudflare_record" "gill-search" {
  domain = "${var.cloudflare_domain}"
  name   = "gill-search"
  value  = "${aws_eip.main.public_ip}"
  type   = "A"
  ttl    = 1
  proxied = true
}
  • domainはCloudFlareで管理しているドメイン名を入力。今回の場合はmosuke.techを管理しているのでそれを入力。
  • nameは今回Aレコードなのでサブドメインに当たる部分。
  • valueは実際にIPアドレス。なので今回はAWS EIPの値が入る。${aws_eip.main.public_ip}
  • typeはAレコードなりCNAMEなり。
  • ttlは名前の通り、TTLの値。1にすると、CloudFlareの設定で言うAutomaticになる。
  • proxiedはCloudFlareの仕組みによるもの。次に説明する。

CloudFlareのDNS

設定すると下記のようになるのだが、右側のオレンジやグレーの雲マークが注目だ。
cloudflare_proxy

CloudFlareでのDNSは、普通のDNSとちがってProxyの設定のON/OFFが必要だ。なぜなら、もともとCloudFlareはHTTP Proxyであり、それによってキャッシュしたりセキュリティを高めたりするものだからだ。 なので、例えばSSHで接続などHTTPプロトコル以外を通そうとするとCloudFlareが邪魔になる。 そのため、サービスで利用するHTTP用のアクセスルートと管理で利用するSSH用のアクセスルートを分けておくといい。

cloudflare_proxy

comments powered by Disqus
このエントリーをはてなブックマークに追加