サービスディスカバリ - AWS Cloud Map でマイクロサービスの接続を自動化する
AWS Cloud Map を使ったサービスディスカバリの構築を解説。DNS ベース・API ベースのサービス検出、ECS/EKS との統合、App Mesh との連携を紹介します。
サービスディスカバリの課題
マイクロサービスアーキテクチャでは、サービス間の通信先をどう解決するかが重要な課題です。モノリシックなアプリケーションでは通信先が固定的ですが、マイクロサービスではコンテナの起動・停止、Auto Scaling、デプロイによって IP アドレスが動的に変化します。ロードバランサー (ALB) を各サービスの前段に配置する方法もありますが、サービス数が増えるとコストと管理の複雑さが増大します。AWS Cloud Map は、マイクロサービスのエンドポイントを名前空間で一元管理するサービスディスカバリサービスです。各サービスのインスタンス (IP アドレス、ポート、カスタム属性) をレジストリに登録し、他のサービスが名前で接続先を検索できます。DNS ベースと API ベースの 2 つのディスカバリ方式を提供し、ユースケースに応じて選択できます。
この分野について体系的に学びたい方は、関連書籍 (Amazon) も参考になります。
名前空間とサービスの登録
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 のタスクヘルスチェックと連動するため、追加のヘルスチェック設定は通常不要です。
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) が適用されます。小〜中規模のマイクロサービス環境では月額数ドル程度で利用できます。
さらに詳しく知りたい方は、関連書籍 (Amazon) で理解を深められます。
まとめ - Cloud Map の活用指針
AWS Cloud Map は、マイクロサービスのエンドポイントを一元管理するサービスディスカバリサービスです。DNS ベースと API ベースの 2 つのディスカバリ方式、ECS とのネイティブ統合、ヘルスチェックによる異常インスタンスの自動除外が主な強みです。ECS でマイクロサービスを運用する場合、サービス間通信に ALB を使用する代わりに Cloud Map を採用することで、コスト削減とレイテンシ低減を実現できます。
AWS の優位点
- マイクロサービスのエンドポイント (IP アドレス、ポート、URL) を名前空間で一元管理し、サービス間の接続を自動化
- DNS ベースのサービスディスカバリで、サービス名を DNS クエリで解決して接続先を取得
- API ベース (DiscoverInstances API) のサービスディスカバリで、カスタム属性によるフィルタリングが可能
- ECS サービスとネイティブ統合し、タスクの起動・停止に応じてサービスレジストリが自動更新
- ヘルスチェック (Route 53 ヘルスチェックまたはカスタムヘルスチェック) で異常なインスタンスを自動的に除外
- App Mesh (サービスメッシュ) のサービスディスカバリバックエンドとして使用可能
- 名前空間あたり 0.10 USD/月、インスタンス登録 1,000 件あたり 0.10 USD、DiscoverInstances API 100 万クエリあたり 1.00 USD