サービスディスカバリ - AWS Cloud Map でマイクロサービスの接続を自動化する

AWS Cloud Map を使ったサービスディスカバリの構築を解説。DNS ベース・ API ベースのサービス検出、ECS/EKS との統合、App Mesh との連携を紹介します。

サービスディスカバリの課題

マイクロサービスアーキテクチャでは、サービス間の通信先をどう解決するかが重要な課題です。モノリシックなアプリケーションでは通信先が固定的ですが、マイクロサービスではコンテナの起動・停止、Auto Scaling、デプロイによって IP アドレスが動的に変化します。ロードバランサー (ALB) を各サービスの前段に配置する方法もありますが、サービス数が増えるとコストと管理の複雑さが増大します。AWS Cloud Map は、マイクロサービスのエンドポイントを名前空間で一元管理するサービスディスカバリサービスです。各サービスのインスタンス (IP アドレス、ポート、カスタム属性) をレジストリに登録し、他のサービスが名前で接続先を検索できます。DNS ベースと API ベースの 2 つのディスカバリ方式を提供し、ユースケースに応じて選択できます。

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

Cloud Map は名前空間 (Namespace) → サービス (Service) → インスタンス (Instance) の 3 層構造で管理します。名前空間は DNS ベース (パブリック DNS またはプライベート DNS) と API ベース (HTTP) の 2 種類があります。DNS 名前空間では、サービス名が DNS レコードとして登録され、標準的な DNS クエリで接続先を解決できます。たとえば payment.myapp.local という DNS 名で payment サービスの IP アドレスを取得できます。API 名前空間では、DiscoverInstances API でサービスを検索し、カスタム属性 (バージョン、環境、リージョンなど) によるフィルタリングが可能です。 ```bash # プライベート DNS 名前空間の作成 aws servicediscovery create-private-dns-namespace \ --name myapp.local \ --vpc vpc-12345 \ --region ap-northeast-1 # サービスの登録 aws servicediscovery create-service \ --name payment \ --namespace-id ns-xxxx \ --dns-config '{"DnsRecords":[{"Type":"A","TTL":10}]}' ``` インスタンスの登録・解除は手動 (API 呼び出し) または ECS/EKS との統合で自動的に行われます。

ECS 統合とヘルスチェック

Cloud Map と ECS のネイティブ統合により、 ECS サービスのタスクが起動すると自動的に Cloud Map にインスタンスが登録され、タスクが停止すると自動的に解除されます。 ECS サービス定義で serviceRegistries を指定するだけで統合が完了します。これにより、サービス間通信で ALB を経由せずに、 Cloud Map の DNS 名で直接タスクの IP アドレスを解決して通信できます。 ALB のコスト (月額約 22 USD 〜/台) を削減でき、レイテンシも低減します。ヘルスチェックは 2 種類をサポートします。 Route 53 ヘルスチェックはパブリック IP を持つインスタンスに対して HTTP/HTTPS/TCP のヘルスチェックを実行します。カスタムヘルスチェックはアプリケーション側から UpdateInstanceCustomHealthStatus API を呼び出してヘルス状態を報告します。 ECS 統合の場合、 ECS のタスクヘルスチェックと連動するため、追加のヘルスチェック設定は通常不要です。 ネットワーク設計の知見を広げたい場合はAmazon の専門書も活用できます。

App Mesh との連携と料金

AWS App Mesh (サービスメッシュ) は Cloud Map をサービスディスカバリバックエンドとして使用します。App Mesh の仮想サービスに Cloud Map のサービスを関連付けることで、Envoy プロキシが Cloud Map からエンドポイントを自動取得し、トラフィックルーティング、リトライ、サーキットブレーカーなどのメッシュ機能を適用します。EKS 環境では、AWS Cloud Map Controller for Kubernetes を使用して、Kubernetes の Service リソースと Cloud Map を自動同期できます。料金は名前空間あたり 0.10 USD/月、インスタンス登録 1,000 件あたり 0.10 USD、DiscoverInstances API 100 万クエリあたり 1.00 USD です。DNS クエリは Route 53 の料金 (100 万クエリあたり 0.40 USD) が適用されます。小〜中規模のマイクロサービス環境では月額数ドル程度で利用できます。

まとめ - Cloud Map の活用指針

AWS Cloud Map は、マイクロサービスのエンドポイントを一元管理するサービスディスカバリサービスです。DNS ベースと API ベースの 2 つのディスカバリ方式、ECS とのネイティブ統合、ヘルスチェックによる異常インスタンスの自動除外が主な強みです。ECS でマイクロサービスを運用する場合、サービス間通信に ALB を使用する代わりに Cloud Map を採用することで、コスト削減とレイテンシ低減を実現できます。