AWS Cloud Map

マイクロサービスのサービスディスカバリを提供し、DNS または API 経由でサービスの場所を解決するサービス

概要

AWS Cloud Map は、クラウドリソースのサービスディスカバリを提供するフルマネージドサービスです。マイクロサービスアーキテクチャにおいて、サービスの IP アドレスやポート番号を動的に解決し、サービス間の通信を実現します。DNS ベースのディスカバリ (Route 53 と統合) と API ベースのディスカバリの 2 つの方式を提供し、コンテナ、Lambda、EC2 など異なるコンピュートプラットフォーム上のサービスを統一的に管理できます。ECS や EKS との深い統合により、コンテナのデプロイ・スケーリング時にサービスレジストリが自動更新されます。

名前空間とサービス登録の仕組み

Cloud Map の名前空間は、サービスを論理的にグループ化するコンテナです。名前空間には HTTP 名前空間 (API ベースのディスカバリ専用) と DNS 名前空間 (パブリック DNS またはプライベート DNS) の 3 種類があります。プライベート DNS 名前空間は VPC 内のサービス間通信に最も多く使われ、例えば internal.myapp.local のような内部ドメインを作成します。名前空間の配下にサービスを登録し、各サービスにインスタンス (実際のエンドポイント) を紐づけます。インスタンスには IP アドレス、ポート番号、カスタム属性 (バージョン、環境、リージョン等) を設定できます。カスタム属性は API ベースのディスカバリで活用でき、「version=v2 かつ region=ap-northeast-1 のインスタンスのみ取得」といったフィルタリングが可能です。サービスの登録・解除は API 経由で行い、ECSEKS のサービスディスカバリ統合を使えば、タスクやポッドのライフサイクルに連動して自動的にインスタンスが登録・解除されます。名前空間あたりのサービス数やインスタンス数にはソフトリミットがあり、大規模環境では上限緩和申請が必要になる場合があります。

DNS ベースと API ベースのディスカバリ

DNS ベースのディスカバリは、標準的な DNS クエリでサービスのエンドポイントを解決する方式です。Cloud Map が Route 53 のプライベートホストゾーンにレコードを自動管理し、payment.internal.myapp.local のような DNS 名でサービスにアクセスできます。A レコード (IP アドレス) と SRV レコード (IP + ポート) に対応しており、SRV レコードを使えばポート番号の動的解決も可能です。DNS ベースの利点はクライアント側の変更が不要な点で、既存のアプリケーションがそのまま DNS 名でサービスを呼び出せます。一方、DNS キャッシュの TTL (最短 10 秒) により、インスタンスの変更が反映されるまでに遅延が生じます。API ベースのディスカバリは DiscoverInstances API を直接呼び出す方式で、DNS キャッシュの影響を受けずにリアルタイムのインスタンス情報を取得できます。カスタム属性によるフィルタリングや、ヘルスチェック状態の即時反映が必要な場合に適しています。ただし、アプリケーション側に AWS SDK の呼び出しコードを組み込む必要があります。DiscoverInstances API にはリージョンレベルのキャッシュが組み込まれており、高頻度の呼び出しでも低レイテンシで応答します。

ECS・EKS との統合とヘルスチェック

ECS サービスで Cloud Map のサービスディスカバリを有効にすると、タスクの起動時に自動でインスタンスが登録され、タスクの停止時に自動で解除されます。ECS の awsvpc ネットワークモードでは各タスクに固有の ENI (IP アドレス) が割り当てられるため、Cloud Map に正確な IP が登録されます。Fargate との組み合わせでは、タスクのスケーリングに応じてサービスレジストリがリアルタイムに更新され、ロードバランサーなしでサービス間の直接通信が実現します。EKS 環境では、ExternalDNS コントローラーを使って Kubernetes Service リソースと Cloud Map を同期させる構成が一般的です。ヘルスチェックは Route 53 ヘルスチェック (DNS 名前空間の場合) またはカスタムヘルスチェック (API 経由で手動報告) の 2 種類があります。Route 53 ヘルスチェックは HTTP/HTTPS/TCP のエンドポイント監視を行い、異常なインスタンスを DNS 応答から自動除外します。カスタムヘルスチェックは、アプリケーション固有のヘルスロジック (データベース接続確認、依存サービスの応答確認等) を実装し、UpdateInstanceCustomHealthStatus API で状態を報告します。料金はインスタンス登録数と DiscoverInstances API の呼び出し回数に基づく従量課金で、小規模な構成であれば月額数ドル程度に収まります。

共有するXB!