- AWS App MeshはEnvoyプロキシベースのサービスメッシュで、マイクロサービス間の通信を透過的に管理
- トラフィック分割・リトライ・サーキットブレーカー・mTLS認証をアプリコード変更なしで実装可能
- サービスメッシュスキルを持つSESエンジニアの単価は月85〜130万円と高水準
「マイクロサービスが10個を超えたあたりから、サービス間通信の障害切り分けに時間がかかりすぎる」——大規模マイクロサービス運用の現場で頻繁に聞かれる悩みです。
AWS App Meshは、マイクロサービス間の通信をアプリケーションコードを変更せずに制御・監視できるフルマネージドサービスメッシュです。 Envoyプロキシをサイドカーとしてデプロイすることで、トラフィック管理、可観測性、セキュリティを透過的に実現します。
本記事はAWS完全攻略シリーズ Ep.53として、App Meshの基礎からECS/EKSでの実装、SES案件での活用までを網羅的に解説します。
- App Meshの基本概念とEnvoyプロキシの仕組み
- ECS FargateおよびEKSでのApp Meshセットアップ
- トラフィック管理(カナリアデプロイ・サーキットブレーカー)
- mTLS認証による通信の暗号化
- X-Ray・CloudWatchとの統合による可観測性
- SES案件でのサービスメッシュスキル活用
サービスメッシュとは何か
マイクロサービス通信の課題
マイクロサービスアーキテクチャでは、サービス間の通信が飛躍的に増加します。ECS FargateやEKS上に多数のサービスをデプロイした場合、以下の課題が顕在化します。
- 通信の可視性: どのサービスがどのサービスを呼んでいるか把握できない
- 障害の伝播: 一つのサービスの障害がカスケード障害を引き起こす
- リトライ/タイムアウト: 各サービスで個別に実装する必要がある
- セキュリティ: サービス間通信が平文で流れている
- デプロイ制御: カナリアリリースやBlue/Greenデプロイの実装が複雑
サービスメッシュによる解決
サービスメッシュは、アプリケーションコードから通信制御のロジックを分離し、インフラ層で一元管理するアーキテクチャパターンです。
従来のアプローチ:
[Service A] ---(リトライ/認証/ログ付きHTTPクライアント)--→ [Service B]
↑ アプリケーションコードに通信制御が混在
サービスメッシュ:
[Service A] → [Envoyプロキシ] ===(暗号化・リトライ・ログ)=== [Envoyプロキシ] → [Service B]
↑ アプリケーションは通信制御を意識しない
App Meshの基本概念
コアコンポーネント
App Meshは以下の4つのコアコンポーネントで構成されます。
1. Mesh(メッシュ) サービスメッシュの論理的なコンテナ。1つのアプリケーション(マイクロサービス群)に1つのメッシュを作成します。
2. Virtual Node(仮想ノード) 各マイクロサービスの論理的な表現。ECSサービスやKubernetes Deploymentに対応します。
3. Virtual Router(仮想ルーター) トラフィックのルーティングルールを定義。トラフィック分割やヘッダーベースルーティングが可能です。
4. Virtual Service(仮想サービス) サービスの名前解決エンドポイント。クライアントが実際に接続する仮想的なサービス名です。
構成イメージ:
┌──────────── Mesh: e-commerce ────────────┐
│ │
│ VirtualService: order.local │
│ └→ VirtualRouter: order-router │
│ ├→ VirtualNode: order-v1 (80%) │
│ └→ VirtualNode: order-v2 (20%) │
│ │
│ VirtualService: user.local │
│ └→ VirtualNode: user-v1 │
│ │
└──────────────────────────────────────────┘
Envoyプロキシの役割
App Meshは、各サービスにEnvoyプロキシをサイドカーとしてデプロイします。Envoyは以下の機能を提供します。
- ロードバランシング: ラウンドロビン、最小接続数、ランダム
- ヘルスチェック: バックエンドサービスの死活監視
- リトライ: 失敗時の自動再試行(回数・間隔を設定可能)
- サーキットブレーカー: 障害サービスへのリクエストを自動遮断
- TLS終端: サービス間通信のmTLS暗号化
- メトリクス収集: リクエスト数、レイテンシ、エラー率をX-Rayに送信

ECS FargateでのApp Meshセットアップ
ステップ1: メッシュの作成
# App Meshの作成
aws appmesh create-mesh \
--mesh-name e-commerce \
--spec egressFilter={type=ALLOW_ALL}
# Virtual Nodeの作成(order-serviceの例)
aws appmesh create-virtual-node \
--mesh-name e-commerce \
--virtual-node-name order-v1 \
--spec '{
"listeners": [{
"portMapping": {"port": 8080, "protocol": "http"}
}],
"serviceDiscovery": {
"awsCloudMap": {
"namespaceName": "e-commerce.local",
"serviceName": "order"
}
},
"backends": [{
"virtualService": {
"virtualServiceName": "user.e-commerce.local"
}
}]
}'
ステップ2: Virtual RouterとRouteの設定
# Virtual Routerの作成
aws appmesh create-virtual-router \
--mesh-name e-commerce \
--virtual-router-name order-router \
--spec '{
"listeners": [{
"portMapping": {"port": 8080, "protocol": "http"}
}]
}'
# Routeの作成(トラフィック分割)
aws appmesh create-route \
--mesh-name e-commerce \
--virtual-router-name order-router \
--route-name order-route \
--spec '{
"httpRoute": {
"match": {"prefix": "/"},
"action": {
"weightedTargets": [
{"virtualNode": "order-v1", "weight": 80},
{"virtualNode": "order-v2", "weight": 20}
]
},
"retryPolicy": {
"maxRetries": 3,
"perRetryTimeout": {"value": 2, "unit": "s"},
"httpRetryEvents": ["server-error", "gateway-error"]
}
}
}'
ステップ3: ECSタスク定義にEnvoyサイドカーを追加
{
"family": "order-service",
"networkMode": "awsvpc",
"requiresCompatibilities": ["FARGATE"],
"cpu": "512",
"memory": "1024",
"proxyConfiguration": {
"type": "APPMESH",
"containerName": "envoy",
"properties": [
{"name": "IgnoredUID", "value": "1337"},
{"name": "ProxyIngressPort", "value": "15000"},
{"name": "ProxyEgressPort", "value": "15001"},
{"name": "AppPorts", "value": "8080"},
{"name": "EgressIgnoredIPs", "value": "169.254.170.2,169.254.169.254"}
]
},
"containerDefinitions": [
{
"name": "order-app",
"image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/order:latest",
"portMappings": [{"containerPort": 8080}],
"essential": true,
"dependsOn": [{"containerName": "envoy", "condition": "HEALTHY"}]
},
{
"name": "envoy",
"image": "840364872350.dkr.ecr.ap-northeast-1.amazonaws.com/aws-appmesh-envoy:v1.29.0",
"essential": true,
"environment": [
{"name": "APPMESH_RESOURCE_ARN", "value": "arn:aws:appmesh:ap-northeast-1:123456789012:mesh/e-commerce/virtualNode/order-v1"}
],
"healthCheck": {
"command": ["CMD-SHELL", "curl -s http://localhost:9901/server_info | grep state | grep -q LIVE"],
"interval": 5,
"timeout": 2,
"retries": 3,
"startPeriod": 10
}
}
]
}
トラフィック管理
カナリアデプロイメント
新バージョンのサービスに段階的にトラフィックを流すカナリアデプロイメントは、App Meshの最も強力なユースケースです。
# フェーズ1: 10%のトラフィックを新バージョンに
aws appmesh update-route \
--mesh-name e-commerce \
--virtual-router-name order-router \
--route-name order-route \
--spec '{
"httpRoute": {
"match": {"prefix": "/"},
"action": {
"weightedTargets": [
{"virtualNode": "order-v1", "weight": 90},
{"virtualNode": "order-v2", "weight": 10}
]
}
}
}'
# メトリクスを確認して問題なければ...
# フェーズ2: 50%
# フェーズ3: 100%
サーキットブレーカー
障害のカスケードを防ぐサーキットブレーカーは、本番運用で必須の機能です。
{
"outlierDetection": {
"maxServerErrors": 5,
"interval": {"value": 10, "unit": "s"},
"baseEjectionDuration": {"value": 30, "unit": "s"},
"maxEjectionPercent": 50
}
}
この設定では、10秒間に5回以上サーバーエラーを返したノードを30秒間ルーティング対象から除外します。
ヘッダーベースルーティング
テスト環境やフィーチャーフラグと連携したルーティングも可能です。
{
"httpRoute": {
"match": {
"prefix": "/",
"headers": [{
"name": "x-canary",
"match": {"exact": "true"}
}]
},
"action": {
"weightedTargets": [
{"virtualNode": "order-v2", "weight": 100}
]
}
}
}
セキュリティ:mTLS認証
ACM Private CAを使ったmTLS設定
サービス間通信を暗号化し、相互認証を実現するmTLS(mutual TLS)は、VPCネットワーク設計と組み合わせて多層防御を構築する上で重要です。
# ACM Private CAの作成
aws acm-pca create-certificate-authority \
--certificate-authority-type SUBORDINATE \
--certificate-authority-configuration '{
"KeyAlgorithm": "RSA_2048",
"SigningAlgorithm": "SHA256WITHRSA",
"Subject": {"CommonName": "e-commerce.local"}
}'
# Virtual NodeにTLS設定を追加
aws appmesh update-virtual-node \
--mesh-name e-commerce \
--virtual-node-name order-v1 \
--spec '{
"listeners": [{
"portMapping": {"port": 8080, "protocol": "http"},
"tls": {
"mode": "STRICT",
"certificate": {
"acm": {
"certificateArn": "arn:aws:acm:ap-northeast-1:123456789012:certificate/xxx"
}
},
"validation": {
"trust": {
"acm": {
"certificateAuthorityArns": ["arn:aws:acm-pca:..."]
}
}
}
}
}]
}'
可観測性の統合
X-Rayトレーシング
App MeshのEnvoyプロキシはX-Rayと自動統合されます。
# X-Rayデーモンをサイドカーとして追加
# ECSタスク定義に以下を追加:
{
"name": "xray-daemon",
"image": "amazon/aws-xray-daemon:latest",
"portMappings": [{"containerPort": 2000, "protocol": "udp"}],
"essential": false
}
CloudWatch Container Insights
# Container Insightsの有効化
aws ecs update-cluster-settings \
--cluster e-commerce \
--settings name=containerInsights,value=enabled
カスタムダッシュボード
# CloudWatchダッシュボードにApp Meshメトリクスを追加
# 主要メトリクス:
# - envoy_http_downstream_rq_total(リクエスト総数)
# - envoy_http_downstream_rq_xx(ステータスコード別カウント)
# - envoy_cluster_upstream_rq_time(レイテンシ)
# - envoy_cluster_membership_healthy(ヘルシーノード数)
Terraformによるインフラのコード化
App Mesh全体のTerraform定義
resource "aws_appmesh_mesh" "main" {
name = "e-commerce"
spec {
egress_filter {
type = "ALLOW_ALL"
}
}
}
resource "aws_appmesh_virtual_node" "order_v1" {
name = "order-v1"
mesh_name = aws_appmesh_mesh.main.name
spec {
listener {
port_mapping {
port = 8080
protocol = "http"
}
}
service_discovery {
aws_cloud_map {
namespace_name = aws_service_discovery_private_dns_namespace.main.name
service_name = "order"
}
}
backend {
virtual_service {
virtual_service_name = aws_appmesh_virtual_service.user.name
}
}
}
}
SES案件でのサービスメッシュスキル活用
サービスメッシュ案件の市場動向
マイクロサービスの普及に伴い、サービスメッシュスキルを持つエンジニアの需要は急速に拡大しています。
| スキルレベル | 単価目安(月額) | 求められるスキル |
|---|---|---|
| 基本 | 65〜85万円 | App Meshの設定・運用 |
| 中級 | 85〜110万円 | トラフィック管理・可観測性設計 |
| 上級 | 110〜130万円 | メッシュ全体設計・障害対応・パフォーマンスチューニング |
スキルアップロードマップ
- ECS Fargateの基本操作を習得
- Envoyプロキシの基本概念を理解
- App Meshでトラフィック管理を実装
- mTLS・X-Rayを統合した本番運用を経験
- CloudWatchモニタリングとの連携で可観測性を強化
トラブルシューティング
よくある問題と解決方法
Q: Envoyサイドカーがヘルスチェックに失敗する
- Envoyの起動ログを確認(
/var/log/envoy/envoy_err.log) APPMESH_RESOURCE_ARN環境変数が正しいか確認- IAMロールにApp Meshの権限があるか確認
Q: サービス間通信がタイムアウトする
- セキュリティグループでEnvoyポート(15000/15001)が許可されているか確認
- WAF/Shieldの設定が通信をブロックしていないか確認
- Virtual Nodeのバックエンド設定で対象サービスが登録されているか確認
Q: カナリアデプロイでエラー率が高い
- X-Rayで新バージョンのトレースを確認
- 新旧バージョンのAPIの後方互換性をチェック
- CloudWatch Logsでアプリケーションエラーの詳細を確認
まとめ — App Meshでマイクロサービス通信を制御する
AWS App Meshは、マイクロサービスの通信課題を解決するための強力なツールです。
App Mesh活用のポイント:
- Envoyサイドカーにより、アプリケーションコードを変更せずに通信制御を実装できる
- トラフィック分割でカナリアデプロイメントを安全に実行し、リリースリスクを低減
- mTLS認証でサービス間通信のセキュリティを確保
- X-Ray・CloudWatch統合でサービス間通信の可観測性を確立
サービスメッシュのスキルを身につけて、大規模マイクロサービス案件で活躍できるエンジニアを目指しましょう。SES BASE でマイクロサービス・クラウドインフラ案件をチェックしてみてください。