ECSのサービスディスカバリで名前解決ができない。VPCのDNSホスト名の設定を確認しよう

2021.10.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、岩城です。

小ネタですが、サービスディスカバリを初めて触った時に地味にハマったので備忘録として残しておきます。

結論

サービスディスカバリを利用する時は、VPCのDNSホスト名を有効化する必要があります。

やってみた

本エントリ用の検証環境を図に起こすと以下のとおりです。

今回はサービスディスカバリの動作確認が主目的なので、サービス1のWebコンテナにECS Execで入ってから、サービス2のWebコンテナにcurlしてみました。

$ aws ecs execute-command --cluster <クラスター名> --task <タスクID> --container <コンテナ名> --interactive --command "/bin/sh"
$ curl http://app.example.com
curl: (6) Could not resolve host: app.example.com

名前解決できないと怒られましたね。

AWS公式ドキュメントを読むと以下の記載があります。

VPC DNS 属性は、適切な DNS 解決のために設定する必要があります。属性の設定方法については、Amazon VPC ユーザーガイド の VPC での DNS サポートを参照してください。

さらに読み進めていくと以下の記載を見つけました。

属性の両方が true に設定されている場合、次のようになります。

・パブリック IP アドレスを持つインスタンスは、対応するパブリック DNS ホスト名を受け取ります。

・Amazon Route 53 Resolver サーバーは、Amazon が提供するプライベート DNS ホスト名を解決できます。

この属性とは、VPCのDNSホスト名とDNS解決を指しているようです。

コンソールからVPCを作成した場合、DNS解決はデフォルトで有効化されますが、DNSホスト名は無効化されていることを思い出しました。

そこでDNSホスト名を有効化してみることにしました。

もう一度curlしてみます。

$ aws ecs execute-command --cluster <クラスター名> --task <タスクID> --container <コンテナ名> --interactive --command "/bin/sh"
$ curl http://app.example.com
<html>

<body>
    <h1>Hello World!</h1>
</body>

</html>

名前解決されてレスポンスが返ってきました!

ちなみにタスク再起動せずとも、2〜3分すると名前解決できました。

おわりに

ECSのサービスディスカバリを利用する時は、VPCのDNSホスト名が有効化されているか確認しましょう。

本エントリがどなたかのお役に立てれば幸いです。

リファレンス

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/service-discovery.html https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-dns.html#vpc-dns-support