AWS Cloud Map でサービスディスカバリを実現 - マイクロサービス間の動的な名前解決

DNS ベースと API ベースの 2 方式でマイクロサービスのエンドポイントを動的に検出する。ECS・EKS との統合でサービスの登録・解除を自動化する手法を紹介します。

Cloud Map の概要

Cloud Map はアプリケーションリソースのサービスディスカバリを提供するサービスです。マイクロサービスアーキテクチャでサービス A がサービス B を呼び出す際、サービス B のエンドポイントをハードコードせず、Cloud Map に問い合わせて動的に解決します。DNS ベースと API ベースの 2 種類のディスカバリ方式を提供し、ECSEKS と統合してサービスの登録・解除を自動化します。

DNS と API ディスカバリ

DNS 名前空間はサービスを DNS レコードとして登録し、service-b.my-namespace.local のような DNS 名で解決します。既存のアプリケーションは DNS クエリでサービスを検出でき、コード変更が不要です。HTTP 名前空間は DiscoverInstances API でサービスインスタンスを取得し、カスタム属性 (version=v2、environment=prod) でフィルタリングできます。ECS サービスディスカバリはタスクの起動時に Cloud Map にインスタンスを自動登録し、タスクの停止時に自動解除します。Route 53 ヘルスチェックで異常なインスタンスを検出し、ディスカバリ結果から除外します。

ECS と EKS との統合

ECS サービスで Cloud Map を有効にすると、タスクの起動・停止に連動してサービスインスタンスが自動的に登録・解除されます。 DNS ベースのディスカバリでは Route 53 に SRV または A レコードが作成され、クライアントは DNS 名でサービスを解決します。 API ベースのディスカバリでは DiscoverInstances API でヘルスチェック済みのインスタンス一覧を取得し、クライアント側でロードバランシングを実装します。 EKS では AWS Cloud Map MCS Controller を使い、 Kubernetes Service を Cloud Map に自動同期できます。ヘルスチェックは Route 53 ヘルスチェックまたはカスタムヘルスチェック (アプリケーションが UpdateInstanceCustomHealthStatus API を呼び出す方式) を選択できます。 サービスディスカバリの構成パターンを網羅的に学ぶなら、技術書 (Amazon)を参照してください。

Cloud Map の料金と運用

Cloud Map の料金はリソースの登録数と API コール数で決まります。DNS クエリは Route 53 の標準料金が適用され、DiscoverInstances API は 100 万リクエストあたり 1 ドルです。インスタンスの登録・解除が頻繁に発生するオートスケーリング環境では API コール数が増加するため、クライアント側でキャッシュを実装してコストを抑えます。名前空間の設計では、環境 (dev/staging/prod) ごとに名前空間を分離し、サービス名は環境間で統一することで、アプリケーションコードの環境依存を排除します。CloudWatch メトリクスで DiscoverInstances の呼び出し回数とレイテンシを監視し、異常な増加を検知します。

まとめ

Cloud Map の導入は、ECS サービスディスカバリとの統合が最も手軽な入口です。ECS サービスで Cloud Map を有効にするだけで、タスクの起動・停止に連動したサービス登録が自動化されます。既存のアプリケーションが DNS で名前解決している場合は DNS 名前空間、カスタム属性によるフィルタリングが必要な場合は HTTP 名前空間を選択します。名前空間の設計では、環境 (dev/staging/prod) ごとに分離し、サービス名は環境間で統一することを推奨します。