DNSレコードをTerraformで管理してたけどやめた
2019-07-15

DNSレコードをTerraformで管理していたドメインがありました。(Route53)
IaC(Infrastructure as Code)は当然のようになっていてこのドメインもTerraformで管理していました。

しかし運用していくにつれ今の構成に不満点も出てきてて, なんかいい感じに出来ないかな~と思っていました。

  • Terraformで管理しているけど, 管理するレコード数が多くなるにつれ terraform planterraform apply の実行に時間がかかるようになってきた
  • CircleCI使って自動化してるからデプロイ待たないで違うことしてればいいんだけど, そこまで何か違うことできるほど時間かかるわけじゃないから結局待っちゃってストレス
  • そもそもコード化してるけど, このドメインに関していうとプルリク作ってレビューしてapply!みたいな慎重な手順は踏む必要がなくどちらかという柔軟にどんどん変更加えられた方がいい
  • マネジメントコンソールとかaws-cliからサクッと変更しちゃいたい
  • 別サービスとの連携等で自動でレコード追加とかされても気にしたくない

でもコード化していることによるメリットももちろんあります。

  • ログが残る
  • なのでロールバックもできる

他にもいろいろあると思いますが, このDNSレコード管理においてはログが残っていてロールバックできるようになっていれば十分だと考えました。

それを満たしつつ不満点をちょっとでも解消できないかな~と思っていろいろ考えた結果, Terraformでの管理をやめました。

Terraformはダメだという意図は全くありません!
今回のユースケースに合わなくなっただけで, 別のところではバリバリ使っています!

変更手段は自由にしたい

でもログを残したい! ということで考えたものです。

https://github.com/heptagon-inc/r53rw

r53rw

処理の流れ

  • マネジメントコンソール等からDNSレコードを修正する
  • CloudTrailに流れてCloudWatchEventsで拾ってLambda FunctinとCodeBuildを起動する
  • Lambda Functionで変更内容をSlackに通知する
  • CodeBuildでRoadworkerを動かし, 対象ホストゾーンのDNSレコード情報をエクスポートし, S3にPutする
  • CodeBuildのステータスがFailedになったらSlackに通知

構成について

とりあえずこんな感じで作ってみて実際運用を始めています。
もしロールバックしたいようなことがあればS3にあるRoutefileを取ってきて roadworker --apply すればいいか~って感じです。S3バケットはVersioning設定してるので古いものも取得できるしそれで十分だと思います。
(ちょっとしたした修正ならマネジメントコンソールから戻しちゃうと思うけど)

まだやり始めたばかりなのでこれから課題出そうですが, とりあえずこれでやっていこうと思います。