はじめに
この記事はDatadog Advent Calendar 2019の6日目の記事です。
みんな大好き DataDog の Synthetics で SSL 監視やら API テストやらする時に CloudFront が挟まってると 403 になっちゃうケースがあると思います。
IP アドレスで制限してたり、UserAgentで制限してたり、Geo Match だったり。
面倒なんで DataDog の IP Range を WAF の IP Address に突っ込んでやれば手っ取り早い。ということで。
社内からはOK、社外からはNG、DataDog などは通したい、とかあるあるですね。
前提
- https://aws.amazon.com/jp/cloudfront/
- https://aws.amazon.com/jp/waf/
- https://www.datadoghq.com/
- https://docs.datadoghq.com/ja/synthetics/
- Synthetics の IP Range https://ip-ranges.datadoghq.com/synthetics.json
- あと terraform
代替手段
- そもそも制限しない(まぁ開発中とか本番以外の環境では閉じるよね)
- WAF じゃないところ、例えば LB や Web Server で制限
- UserAgent などの HTTP Header で判断。その場合はこの辺りを参照
- terraform を使わないなら前述のIP RangeのjsonからIPを取得して何かに登録して許可する
まぁぶっちゃけ通常の手段はそれなりに運用が面倒かなって。
コード(の必要なとこ)
terraform が使えるならこれだけで十分(のはず)
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
}
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_KEY
とDATADOG_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 管理から解放された。。。。うれしさのあまりつい記事にしてしまいました。