ECS Service Discovery DNSのTTLを変更する
ECSのServiceを作成する際に、Service Discoveryを追加することができます。これはServiceのアクセス先をELBを使わずにDNSのSRVレコードで知る仕組みです。AWSコンソールで作ると強制的にTTL300秒で作成され、Service作成後にTTLを変更しようとすると、AWSコンソール上には変更するUIがありません。
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
srv-xxxの部分(Service ID)はAWSコンソールであれば、AWS CloudMap > Namespaces > Serviceで該当のServiceDiscoveryを選ぶと詳細に出てきます。CLIであれば、servicediscovery list-servicesを使って取得可能です。
update-serviceを実行すると、変更することができます。
注意点として、update-serviceのCLI/APIの呼び出しは、結構Limit rateが低いようで、15秒おきぐらいに複数回やっていたら4,5回ほどでRateLimit引っかかってしまいます。とりあえずバッと変更しようとスクリプト組むと、Limitに引っかかるのでエラーをちゃんと拾いましょう。
AWS若干マイナーな部分は、API呼ばないとできなかったりするのと、データ構造上できると見せかけてAPI呼んでみたらそれは許可しない*4とかあったりします。こう言うのは需要(要望)があったら作られるんだと思います。
TTLを変更したら、新しいコンテナがデプロイされてもその時間で追従されるので、ストレスなく動作確認ができるようになりました。
2020/07/29追記
コマンド作りました。