15
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DatadogAdvent Calendar 2019

Day 6

DataDog の Synthetics IP range を terraform で WAF に突っ込んで CloudFront を通過させる

Last updated at Posted at 2019-12-05

はじめに

この記事はDatadog Advent Calendar 2019の6日目の記事です。

みんな大好き DataDog の Synthetics で SSL 監視やら API テストやらする時に CloudFront が挟まってると 403 になっちゃうケースがあると思います。
IP アドレスで制限してたり、UserAgentで制限してたり、Geo Match だったり。
面倒なんで DataDog の IP Range を WAF の IP Address に突っ込んでやれば手っ取り早い。ということで。
社内からはOK、社外からはNG、DataDog などは通したい、とかあるあるですね。

前提

代替手段

  • そもそも制限しない(まぁ開発中とか本番以外の環境では閉じるよね)
  • WAF じゃないところ、例えば LB や Web Server で制限
  • UserAgent などの HTTP Header で判断。その場合はこの辺りを参照
  • terraform を使わないなら前述のIP RangeのjsonからIPを取得して何かに登録して許可する

まぁぶっちゃけ通常の手段はそれなりに運用が面倒かなって。

コード(の必要なとこ)

terraform が使えるならこれだけで十分(のはず)

provider_datadog.tf
variable "datadog_api_key" {
  description = "DataDog Integration API Key"
  type        = string
}

variable "datadog_app_key" {
  description = "DataDog Integration Application Key"
  type        = string
}

provider "datadog" {
  api_key = var.datadog_api_key
  app_key = var.datadog_app_key
}

aws_waf.tf
data "datadog_ip_ranges" "this" {}

resource "aws_waf_ipset" "datadog_ip" {
  name = "datadog_ip"

  dynamic "ip_set_descriptors" {
    for_each = data.datadog_ip_ranges.this.synthetics_ipv4

    content {
      type  = "IPV4"
      value = ip_set_descriptors.value
    }
  }
}

DataDog Provider は AWS Provider と違って api/app key を環境変数から自動的に読み込む機能が今の所ないので、いちいち書かないといけないのちょっと面倒。

2019/12/16 修正ここから

provider required なので書かないとダメだと思っていた API_KEYとAPP_KEYについて、ドキュメント内でも DATADOG_API_KEYDATADOG_APP_KEYで環境変数渡しできると書いてあると Twitter で教えてもらいました。
試してみたところ確かにいけたので、prodiver_datadog.tfは書かなくても大丈夫です。
k_bigwheel さん、ありがとうございました。

2019/12/16 修正ここまで

値はいちいち入力するよりも direnv 等を使って適当に export するの楽でおすすめ。
github actions に突っ込んじゃうのも楽で可。

できた WAF の IP Address Conditions は普通に rule に組み込めるので、例えば PATH(/)やPATH(ヘルスチェックパス)と組み合わせてルールにして、ACL にして CloudFront に食わせてから Synthetics はそのパスを見にいくようにすればOK

気になる料金

Condition だけならお金はかからない、はず(なんの意味もないけどw)
WAFの料金は ACL(5USD) と Rule(1USD) と処理量(100万リクエスト辺り0.60USD) のはずなので、適当に計算してください。
WAF料金

最後に

以前の DataDog Provider は対応機能不足や、APIの仕様バグのせいで terraform 使う必要ないなって感じだったけど、このdatadog_ip_range data source ができたのと、 terraform v0.12 で追加された Dynamic blocks のおかげで面倒な IP 管理から解放された。。。。うれしさのあまりつい記事にしてしまいました。

15
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?