年中アイス

いろいろつらつら

ECS Service Discovery DNSのTTLを変更する

ECSのServiceを作成する際に、Service Discoveryを追加することができます。これはServiceのアクセス先をELBを使わずにDNSSRVレコードで知る仕組みです。AWSコンソールで作ると強制的にTTL300秒で作成され、Service作成後にTTLを変更しようとすると、AWSコンソール上には変更するUIがありません。

ECS Service作成時のServiceDiscovery追加設定

ECS Service詳細

DNSなのでRoute53のコンソール画面で直接TTLを変更しようとすると、まずはHealtchCheckの設定で怒られ、HealthCheckをOFFにしても保存時にCloudMapのエントリだからダメだよとエラーになります。

次にCloudMapに移動すると、そこで定義一覧は見れますが、ここでも同様に変更メニューはありません。

なぜTTLを変更したくなったか

以前紹介したmoguraを使っていたのですが、いつからか新しいコンテナをデプロイしたあと、新しいコンテナに向き先が変わる(SRVレコードが更新される)のが極端に遅くなりました。よくよく調べると、moguraがSRVレコードを解決してから必ずTTLが経過するまで、変化がなかったのです。

moguraは適宜intervalでDNSを引きに行っていたので、新しいSRVレコードがあれば早めに反映されていました。TTLは守るべきですがmoguraはコンテナデプロイ時に追従しないと困るので、無視していた状態です。しかし、DNS側に何か変更があったのか、間にキャッシュが挟まるような形で強制的にTTLを守らせる状態に変わったようです。*1

そのため、適切なTTLに変更しようとしましたが、AWSコンソール上になく、調べていくとCLI/APIで行えることが分かったのでした。*2

AWS CLIまたはAPIを使う

変更するためには、AWS CLIを使うか直接APIを呼ぶ必要があり、使うのはECSではなくservicediscoveryサービス*3です。 AWS CLIを使う場合だと以下になります

aws servicediscovery update-service --id srv-XXX --service '{"DnsConfig":{"DnsRecords":[{"Type":"SRV","TTL":30}]}}'

update-service — AWS CLI 1.18.97 Command Reference

UpdateService - AWS Cloud Map

srv-xxxの部分(Service ID)はAWSコンソールであれば、AWS CloudMap > Namespaces > Serviceで該当のServiceDiscoveryを選ぶと詳細に出てきます。CLIであれば、servicediscovery list-servicesを使って取得可能です。

update-serviceを実行すると、変更することができます。

TTL30秒に変更されています

注意点として、update-serviceのCLI/APIの呼び出しは、結構Limit rateが低いようで、15秒おきぐらいに複数回やっていたら4,5回ほどでRateLimit引っかかってしまいます。とりあえずバッと変更しようとスクリプト組むと、Limitに引っかかるのでエラーをちゃんと拾いましょう。

AWS若干マイナーな部分は、API呼ばないとできなかったりするのと、データ構造上できると見せかけてAPI呼んでみたらそれは許可しない*4とかあったりします。こう言うのは需要(要望)があったら作られるんだと思います。

TTLを変更したら、新しいコンテナがデプロイされてもその時間で追従されるので、ストレスなく動作確認ができるようになりました。

2020/07/29追記

コマンド作りました。

reiki4040.hatenablog.com

*1:ただこれGoからのみ確認していて、EC2からdigコマンドの場合はTTL関係なく最新の情報が返ってきていました。同じプロセス?からのDNS問い合わせとかで判断されている?

*2:AWS document上で見つけたはずなんですが、そのリンクが行方不明

*3:名前ややこしい

*4:一つのECS Serviceに対して複数のServiceDiscovery設定できるデータ構造ですが、やるとエラーになります