AWS App Mesh で構築するサービスメッシュ - マイクロサービス間通信の制御と可観測性
Envoy サイドカーによるカナリアデプロイ、リトライポリシー、mTLS 暗号化を宣言的に設定し、X-Ray 統合でサービス間の依存関係を可視化する手法を紹介します。
App Mesh の概要
App Mesh はマイクロサービス間の通信を制御・監視するサービスメッシュです。各サービスに Envoy プロキシをサイドカーとして配置し、サービス間のトラフィックをプロキシ経由でルーティングします。アプリケーションコードを変更せずに、トラフィックの重み付け、リトライ、タイムアウト、サーキットブレーカーを設定できます。
トラフィック制御と可観測性
仮想ルーターでトラフィックの重み付けを設定し、カナリアデプロイで新バージョンに 10% のトラフィックを流すといった制御が可能です。重み付けを段階的に変更 (10% → 25% → 50% → 100%) することで、安全にトラフィックを移行できます。リトライポリシーでは HTTP 503 エラー時に最大 3 回リトライし、指数バックオフで待機する設定を宣言的に定義します。サーキットブレーカーは外れ値検出で実装され、エラー率が閾値を超えたエンドポイントを一時的にルーティング対象から除外します。X-Ray との統合で Envoy プロキシが自動的にトレースデータを送信し、サービス間の呼び出しチェーン、レイテンシ、エラー率を可視化できます。CloudWatch メトリクスでリクエスト数、レイテンシ、エラー率をサービスごとに監視できます。なお、クロス VPC やクロスアカウントのサービス間通信が主な要件であれば、Envoy の運用が不要な VPC Lattice も検討に値します。
mTLS とアクセス制御
App Mesh は Envoy プロキシ間の通信を mTLS で暗号化できます。 ACM Private CA で発行した証明書を仮想ノードに設定すると、プロキシ間のハンドシェイクで相互認証が行われ、なりすましを防止します。 SDS (Secret Discovery Service) により証明書のローテーションも自動化されます。アクセス制御では、仮想ノードのバックエンドとして許可するサービスを明示的に定義し、意図しないサービス間通信を遮断します。 Envoy のアクセスログを CloudWatch Logs に送信し、どのサービスがどのエンドポイントにアクセスしたかを監査できます。 App Mesh のネットワーク設計を深く理解するには、専門書籍 (Amazon)が役立ちます。
App Mesh の料金体系と最適化
App Mesh 自体に追加料金は発生しません。コストは Envoy プロキシが消費するコンピューティングリソース (CPU・メモリ) に依存します。ECS タスクや EKS Pod のサイドカーとして動作するため、タスク定義でプロキシに割り当てるリソースを適切にサイジングすることが重要です。プロキシ 1 台あたり 256 MB のメモリと 0.25 vCPU が目安ですが、トラフィック量が多いサービスでは増量が必要です。X-Ray トレーシングを有効にする場合はトレースデータの保存料金が発生するため、サンプリングレートを調整してコストと可観測性のバランスを取ります。
まとめ
App Mesh はマイクロサービス間の通信を Envoy プロキシで制御・監視するサービスメッシュです。トラフィックの重み付けによるカナリアデプロイ、リトライポリシー、サーキットブレーカーを宣言的に設定し、mTLS で通信を暗号化します。X-Ray 統合で分散トレーシングを実現し、サービス間の依存関係とレイテンシを可視化します。