この1年半はインフラエンジニアっぽい仕事から離れて、LookML 開発者として仕事をしています。自分としてはジョブチェンジで、モチベーションはめっちゃ高いです。うぉー!🔥

LookML 開発に出来るだけ専念できるように配慮して頂いたり、自分でもそう心がけていますが、それでも DNS レコードの登録依頼や、その他諸々の相談がちょいちょいあります。

DNS レコードは Route 53 で管理しています。言われるがままに登録していけば悩みはないのですが、何のために登録するのか?や、登録されているこのレコードは何だ?とか考え始めると地味に悩ましいものがあります。

今の仕事では Terraform は使っていないし、このためだけに Terraform を導入するのはオーバー過ぎます。

Terraform を導入したらアップデートし続けない選択肢はありませんが、変なエラーでハマって何時間も浪費することがあります。今の仕事の性質上、それは絶対に避けたいので、Terraform 以外で Route 53 の DNS レコードを管理する方法を調べてみました。

SAM で管理できるか?

つまり CloudFormation 管理下に置くか?ということです。

Terraform ではツールのアップデートに追随する必要がありますが、SAM なら serverless-application-model のバージョンに追随すれば良いだけです。最新は 2016/10/31 なので、あまり考えなくて良さそうです。

結論としては、止めたほうが良いと思いました。良くも悪くも CloudFormation 管理下に置かれるので、Route 53 Console 上で気軽に変更するとコードと乖離してしまいます。そのため常に SAM で変更する必要があります。もっとカジュアルに管理したいのです。

ちなみにこんな template.yaml で DNS レコードを作れます。ただ更新がうまく出来なかった。それ以上は調べてない…。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Managed by AWS SAM

Resources:
  Hoge:
    Type: AWS::Route53::RecordSet
    Properties:
      HostedZoneId: xxxxxxxxxxxxxx
      Name: hoge.masutaka.net.
      Type: TXT
      TTL: 300
      ResourceRecords:
      - '"abcdefgxyz"'

AWS CLI で管理できるか?

そもそもエネルギーを注ぐところではないので、新しいツールは増やしたくないところ。そういう意味では AWS CLI でどこまで出来るかは興味がありました。

AWS CLI を使った DNS レコードの設定方法はクラスメソッドさんのブログ記事が分かりやすいです。
AWS CLI で Route53 のホストゾーンのレコードを操作してみた|DevelopersIO

作成したいレコード設定を書いて、それに対して CREATE/DELETE/UPSERT をするイメージです。UPSERT は UPDATE+INSERT の造語です。なければ作るし、あれば更新する。

こんな Makefile があれば管理できるか検討しました。latest-update.json に変更したい設定を書き、route53-records.json に現在のレコードを全部記録します。

AWS := aws
IGNORE_EXIT_STATUS := || :
JSON_FILE := latest-update.json
ROUTE53_RECORDS := route53-records.json
WAIT_SEC := 5
ZONE_ID := xxxxxxxxxxxxxx

.PHONY: list
list:
	@$(AWS) route53 list-resource-record-sets --hosted-zone-id $(ZONE_ID)

.PHONY: apply
apply:
	@$(AWS) route53 change-resource-record-sets --hosted-zone-id $(ZONE_ID) --change-batch file://$(JSON_FILE) $(IGNORE_EXIT_STATUS)
	@echo "Wait $(WAIT_SEC) seconds..."
	@sleep $(WAIT_SEC)
	@make --no-print-directory list > $(ROUTE53_RECORDS)

結論としては、変更は出来るけど管理をするのは難しいと思いました。

運用できなくはないのですが、管理のための管理になる気がしました。特に DELETE ではレコード名以外に TTL など現在の設定を全て指定する必要があります。面倒です。

せめて各レコードのコメントを route53-records.json に残せれば良いのですが、json にはコメントを書けないので、コード管理する旨味がありません。

Roadworker で管理できるか?

最後に Roadworker を検討しました。

Roadworker は Ruby 製のツールです。"$ roadwork -e -o Routefile" で Routefile ファイルにエクスポートして、以後は Routefile を変更し、"$ roadwork -a" で Route 53 に適用します。

Routefile は Ruby の DSL なので、各レコードにコメントも残せます。

Route 53 Console 上で変更するとコードと乖離するのは SAM と同じですが、状態もコードも Routefile に集約されるので、そこまで気にしなくて良いかもしれません。
※ SAM は状態が CloudFormation に、コードは template.yaml に分かれるという理解。

問題は Routefile 自体にはバージョンがないため、Roadworker 自体のバージョンを気にする必要があることでしょうか。Gemfile で Roadworker のバージョンを管理した方が良いと思います。

でも今回のコンテキストではやりたくありません。まあ、気にせずグローバルにインストールすれば良いのですがね。自分が気にし過ぎなのか…。

結論

DNS レコード一覧の esa 記事作って、ゆるふわで把握することにします。(なんだそりゃ

今回の課題を掘り下げると、DNS レコードにメモを残したいだけなんですよね。特に TXT レコードはよく分からないものが残りがちで、消して良いのか判断が難しいです。

今回の中では Roadworker が及第点ではありますが、Routefile のための GitHub リポジトリが増える、新たなツールが登場するなど、デメリットがメリットを地味に上回り、オーバーだと判断しました。

Route 53 の各レコードに「メモ」を書きたいだけだった。😭