目次
CloudWatch Application Signals 完全ガイド v2.0
ゼロコード自動計装による APM と SLO 一元管理
Amazon CloudWatch Application Signals は、EKS・EC2・ECS 上のマイクロサービスアプリケーションの APM(Application Performance Monitoring)を コード変更なし で実現するサービスです。ADOT(AWS Distro for OpenTelemetry)による自動計装でトレース・メトリクスを収集し、サービスマップ・SLO 定義・Error Budget 管理を提供します。2023 年 GA 以来、X-Ray との統合・SLO 機能拡張が進み、2026 年には Recommendations 機能で最適 SLO 値を自動提案します。本ドキュメントはApplication Signals の本質・セットアップ・SLO 運用・2026 年最新動向を体系的に解説します。
ドキュメントの目的
本ガイドは以下を対象としています。
- 初心者向け: Application Signals とは何か、なぜ必須かを学びたい方
- 開発者向け: EKS/EC2 アプリケーションの自動計装・トレース取得を実装したい方
- SRE / 運用向け: SLO 定義・Error Budget 追跡・アラート運用を実現したい方
- 意思決定者向け: Datadog APM・New Relic との比較検討
2025-2026年のApplication Signals最新動向
- SLO Recommendations(2026年3月):30日の自動分析で推奨SLO値を自動提案
- Service-Level SLOs(2026年2月):複数エンドポイント統合のサービス全体SLO
- SLO Performance Report(2026年1月):カレンダーベースの達成率分析
- Transaction Search(CloudWatch Logs統合):トレーススパン単位でLogs Insightsで全文検索
- CloudWatch Application Signals EKS デフォルト有効化(2026年2月):新EKSクラスタで自動有効化
- Lambda統合強化:ゼロコード計装でLambda関数間の依存関係を自動検出
- AI Operations(Kiro IDE):AI アシスタントによる自動トラブルシューティング
目次
- 概要
- Application Signalsが解決する課題
- 主な特徴
- アーキテクチャ
- EKS セットアップ
- EC2/ECS セットアップ
- SLO 定義と管理
- サービスマップ
- トレース・メトリクス収集
- 主要ユースケース
- 設定・操作の具体例
- 類似サービス比較
- ベストプラクティス
- トラブルシューティング
- 2025-2026最新動向
- 学習リソース
- 導入ロードマップ
- 実装チェックリスト
- まとめ
- 参考文献
概要
初心者向けメモ: Application Signals は「マイクロサービスの自動監視」です。通常、Datadog・New Relic は Agent をインストール・SDK を組み込む必要がありますが、Application Signals は EKS Pod にアノテーション 1 行追加するだけで、自動的に Java・Python・Node.js のトレース・メトリクスを取得します。
Application Signals は EKS・EC2・ECS 上のアプリケーション(Java・Python・Node.js・.NET・Go)をゼロコード自動計装し、HTTP リクエスト・AWS SDK 呼び出し・データベースクライアント動作を自動トレース。サービスマップでマイクロサービス間の依存関係を可視化し、SLO(Service Level Objective)を定義して Error Budget を追跡します。X-Ray との深い統合でトレース詳細を参照可能。AWS ネイティブで低コストな APM として Datadog・New Relic の代替選択肢となります。
対応言語・フレームワーク
Java: Spring Boot / Tomcat / Jersey / Quarkus
Python: Django / Flask / FastAPI / asyncio
Node.js: Express / Next.js / Fastify
.NET: ASP.NET Core
Go: Gin / HTTP / gRPC
Application Signalsが解決する課題
Application Signals は、マイクロサービス運用における次の問いに答えるための基盤です。
| 課題 | Application Signalsのソリューション |
|---|---|
| マイクロサービス間のレイテンシを分析したい | サービスマップでリクエスト経路を自動生成。各サービス間のレイテンシを表示 |
| どのサービスが SLO 違反しているか | SLO ダッシュボードでリアルタイム達成率表示。Error Budget 消費速度表示 |
| コード変更なしで APM を実装 | EKS Pod アノテーション追加だけで自動計装。ゼロコード |
| エラーが何番目のサービスで発生したか | トレース表示で各サービスでのエラー有無を表示 |
| P99 レイテンシ目標を設定・追跡 | SLO 定義で P99 < 200ms を設定。達成率リアルタイム監視 |
| Datadog・New Relic より低コスト | AWS ネイティブで月額固定料金。ホスト/トランザクション単価が安い |
| 複数リージョン・アカウント統合 | CloudWatch 統合で単一ダッシュボード管理 |
| AI による自動トラブルシューティング | Kiro IDE が異常検知時に自動提案(2026年) |
主な特徴
| 特徴 | 説明 |
|---|---|
| ゼロコード自動計装 | EKS Pod アノテーション or EC2 Agent 設定だけ。SDK インストール不要 |
| サービスマップ自動生成 | マイクロサービス間の依存関係を自動検出・可視化 |
| SLO 一元管理 | 可用性・レイテンシ・エラー率目標を定義。Error Budget 追跡 |
| X-Ray 統合 | 個別トレースで詳細確認可能 |
| CloudWatch Logs 統合 | トレーススパン単位で Logs Insights で検索 |
| 対応言語豊富 | Java・Python・Node・.NET・Go の自動計装 |
| 低コスト | $0.10/1000 メトリクス/月 の vended metrics で月額数千円程度 |
| AWS ネイティブ | IAM・KMS・VPC 統合が自動 |
アーキテクチャ
【図1】Application Signals データフロー:
graph TD
subgraph EKS[EKS Cluster]
Pod1["Pod: Java App<br/>アノテーション:<br/>instrumentation.opentelemetry.io/inject-java"]
Pod2["Pod: Python App<br/>アノテーション:<br/>instrumentation.opentelemetry.io/inject-python"]
end
subgraph ADOT[ADOT Operator]
JAVA_INSTRUMENTATION["Java Agent<br/>aws-opentelemetry-agent.jar"]
PYTHON_INSTRUMENTATION["Python SDK<br/>opentelemetry-instrumentation"]
end
subgraph Collection[データ収集]
OTEL_COLLECTOR["OpenTelemetry Collector<br/>OTLP Receiver"]
end
subgraph Processing[処理・分析]
CW_SIGNALS["CloudWatch<br/>Application Signals"]
SERVICEMAP["Service Map<br/>Dependency Graph"]
SLO_DASHBOARD["SLO Dashboard<br/>Error Budget"]
end
subgraph Integration[統合・監視]
XRAY["X-Ray<br/>Trace Details"]
CWLOGS["CloudWatch Logs<br/>Log Query"]
ALARMS["CloudWatch Alarms<br/>SLO Violations"]
end
Pod1 -->|Auto Instrumented| JAVA_INSTRUMENTATION
Pod2 -->|Auto Instrumented| PYTHON_INSTRUMENTATION
JAVA_INSTRUMENTATION -->|OTLP| OTEL_COLLECTOR
PYTHON_INSTRUMENTATION -->|OTLP| OTEL_COLLECTOR
OTEL_COLLECTOR -->|Metrics + Traces| CW_SIGNALS
CW_SIGNALS -->|Generate| SERVICEMAP
CW_SIGNALS -->|Generate| SLO_DASHBOARD
SLO_DASHBOARD -->|Detail Lookup| XRAY
SLO_DASHBOARD -->|Log Search| CWLOGS
SLO_DASHBOARD -->|Violation| ALARMS
EKS セットアップ
1. CloudWatch Observability Addon インストール
# Addon を EKS に追加
aws eks create-addon \
--cluster-name my-cluster \
--addon-name amazon-cloudwatch-observability \
--addon-version v1.x.x \
--service-account-role-arn arn:aws:iam::123456789012:role/CWObservabilityRole
# または eksctl で一括設定
eksctl create addon \
--name amazon-cloudwatch-observability \
--cluster my-cluster
2. IAM ロール作成
# CloudWatch Observability 用 IAM ロール
aws iam create-role \
--role-name CWObservabilityRole \
--assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"Federated": "arn:aws:iam::123456789012:oidc-provider/oidc.eks.ap-northeast-1.amazonaws.com/id/EXAMPLEID"},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {"StringEquals": {"oidc.eks.ap-northeast-1.amazonaws.com/id/EXAMPLEID:sub": "system:serviceaccount:amazon-cloudwatch:cloudwatch-observability"}}
}]
}'
# ポリシーをアタッチ
aws iam attach-role-policy \
--role-name CWObservabilityRole \
--policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy
3. Pod にアノテーション追加
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-api
spec:
replicas: 3
template:
metadata:
annotations:
# Java アプリケーションの自動計装
instrumentation.opentelemetry.io/inject-java: "true"
# または Python
# instrumentation.opentelemetry.io/inject-python: "true"
spec:
containers:
- name: order-api
image: myapp:1.0
ports:
- containerPort: 8080
env:
- name: OTEL_SERVICE_NAME
value: "order-api"
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://localhost:4317"
または Namespace 全体に適用:
# Namespace レベルでアノテーション設定
kubectl annotate namespace production \
instrumentation.opentelemetry.io/inject-java=true \
--overwrite
4. 設定ファイル(OpenTelemetry Collector)
apiVersion: v1
kind: ConfigMap
metadata:
name: otel-collector-config
namespace: amazon-cloudwatch
data:
collector.yaml: |
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
exporters:
awscloudwatch:
namespace: "AWS/ApplicationSignals"
region: "ap-northeast-1"
awsxray:
region: "ap-northeast-1"
service:
pipelines:
traces:
receivers: [otlp]
exporters: [awsxray, awscloudwatch]
metrics:
receivers: [otlp]
exporters: [awscloudwatch]
EC2/ECS セットアップ
EC2(CloudWatch Agent経由)
{
"agent": {
"region": "ap-northeast-1",
"metrics_collection_interval": 60
},
"application_signals": {
"enabled": true
},
"traces": {
"traces_collected": {
"application_signals": {}
}
}
}
ECS(CloudWatch Agent コンテナ)
{
"containerDefinitions": [
{
"name": "cloudwatch-agent",
"image": "public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest",
"environment": [
{"name": "OTEL_SERVICE_NAME", "value": "my-service"},
{"name": "OTEL_EXPORTER_OTLP_ENDPOINT", "value": "http://localhost:4317"}
],
"portMappings": [{"containerPort": 4317, "protocol": "tcp"}]
},
{
"name": "my-app",
"image": "my-app:latest",
"environment": [
{"name": "OTEL_EXPORTER_OTLP_ENDPOINT", "value": "http://localhost:4317"}
],
"links": ["cloudwatch-agent:localhost"]
}
]
}
SLO 定義と管理
SLO 作成(CLI)
# API P99 レイテンシ < 200ms を目標
aws cloudwatch create-service-level-objective \
--name "OrderAPI-P99-Latency" \
--service-name "order-api" \
--operation "GET /api/v1/orders" \
--sli '{
"RequestBasedSli": {
"RequestBasedSliMetric": {
"MetricType": "LATENCY",
"OperationName": "GET /api/v1/orders",
"MetricThreshold": 200000 # 200ms in microseconds
}
}
}' \
--goal '{
"Interval": {
"RollingInterval": {
"DurationUnit": "DAY",
"Duration": 28
}
},
"AttainmentGoal": 99.5,
"WarningThreshold": 99.8
}'
# 可用性 99.9% を目標(エラー率 < 0.1%)
aws cloudwatch create-service-level-objective \
--name "OrderAPI-Availability" \
--service-name "order-api" \
--operation "GET /api/v1/orders" \
--sli '{
"RequestBasedSli": {
"RequestBasedSliMetric": {
"MetricType": "AVAILABILITY"
}
}
}' \
--goal '{
"Interval": {"RollingInterval": {"Duration": 28, "DurationUnit": "DAY"}},
"AttainmentGoal": 99.9
}'
SLO ダッシュボード表示
Service: order-api / GET /api/v1/orders
SLO 1: P99 Latency < 200ms
目標: 99.5% (28日ローリング)
現在達成率: 99.45% ⚠️ WARNING(99.8%未満)
Error Budget 残: 12.6 分(28日中)
期間別:
過去 1時間: 100% ✅
過去 24時間: 99.5% ✅
過去 7日: 99.4% ⚠️
過去 28日: 99.45% ⚠️
SLO 2: Availability 99.9%
目標: 99.9% (28日ローリング)
現在達成率: 99.92% ✅
Error Budget 残: 28.8 秒
Total Error Budget 消費速度:
平均: 5 分/日 → 目標達成 OK
過去 7日トレンド: 上昇傾向(注意)
Terraform による SLO 管理
resource "aws_cloudwatch_service_level_objective" "order_api_latency" {
name = "OrderAPI-P99-Latency"
service_name = "order-api"
operation_name = "GET /api/v1/orders"
sli {
request_based {
metric_type = "LATENCY"
metric_threshold = 200 # ms
}
}
goal {
interval {
rolling_interval {
duration = 28
duration_unit = "DAY"
}
}
attainment_goal = 99.5
warning_threshold = 99.8
}
tags = {
Service = "OrderAPI"
Team = "Platform"
}
}
サービスマップ
自動生成される情報
┌─────────────────┐
│ API Gateway │
└────────┬────────┘
│ 50ms avg
↓
┌──────────────────┐
│ Order API (Java) │ ← エラー率: 0.5% / P99: 150ms
└────────┬─────────┘
│ 80ms avg
├──────────→ [DynamoDB] (10ms, 99% success)
│
├──────────→ [RDS MySQL] (200ms, 95% success) ⚠️
│
└──────────→ [Lambda ProcessOrder] (500ms, 98% success)
│
└──→ [SQS Queue]
表示情報:
- ノードサイズ:トラフィック量
- ノード色:エラー率(赤=高)
- エッジ:各接続のレイテンシ・スループット・エラー率
トレース・メトリクス収集
自動計装される操作
HTTP Request:
✅ Incoming HTTP リクエスト
✅ Outgoing HTTP リクエスト
AWS SDK:
✅ S3 GetObject, PutObject
✅ DynamoDB Query, PutItem
✅ SQS SendMessage, ReceiveMessage
✅ Lambda Invoke
✅ RDS Database Queries
Database:
✅ JDBC Queries(MySQL, PostgreSQL)
✅ psycopg2(Python)
✅ node-postgres(Node.js)
RPC:
✅ gRPC Calls
自動収集メトリクス
Vended Metrics(Application Signals固有):
- Service Call Count (by operation)
- Service Call Duration (P50, P90, P99)
- Service Error Rate
- Dependency Latency
- Dependency Error Rate
CloudWatch Metrics:
- Availability % (from SLO)
- Error Budget Remaining
- Error Budget Burn Rate
主要ユースケース
1. マイクロサービスの性能分析
EKS Pod アノテーション追加 →
→ Application Signals が自動計装 →
→ サービスマップで全サービス可視化 →
→ ボトルネック(RDSが200ms)特定 →
→ インデックス追加で改善
2. SLO ベース運用
SLO 定義: P99 < 200ms, 99.5% 達成率
→ リアルタイムダッシュボードで監視
→ Error Budget 消費速度が 10分/日 超えた
→ 特定エンドポイント(/api/expensive)を特定
→ キャッシュ追加で解決
3. デプロイの影響分析
- 新バージョンデプロイ →
- → SLO パフォーマンスレポートで差分表示
- → P99が 150ms → 300ms に悪化(検出)
- → デプロイロールバック or コード修正
4. コスト分析
- API エンドポイントごとの SLO 監視 →
- → 重い操作(/api/search)が 80% のエラーバジェット消費
- → 非同期化・キャッシング実装
- → 目標達成 + コスト最適化
設定・操作の具体例
kubectl でアノテーション一括適用
# 既存 Deployment に追加
kubectl patch deployment order-api \
-p '{"spec":{"template":{"metadata":{"annotations":{"instrumentation.opentelemetry.io/inject-java":"true"}}}}}'
# 全 Namespace に適用
kubectl annotate namespace --all \
instrumentation.opentelemetry.io/inject-java=true --overwrite
Terraform で Application Signals 設定
# EKS Addon
resource "aws_eks_addon" "cloudwatch_observability" {
cluster_name = aws_eks_cluster.main.name
addon_name = "amazon-cloudwatch-observability"
addon_version = "v1.x.x"
service_account_role_arn = aws_iam_role.cloudwatch_observability.arn
}
# SLO 複数定義
resource "aws_cloudwatch_service_level_objective" "apis" {
for_each = {
"list_orders" = {operation = "GET /api/v1/orders", latency = 200}
"create_order" = {operation = "POST /api/v1/orders", latency = 500}
"get_order" = {operation = "GET /api/v1/orders/{id}", latency = 150}
}
name = "OrderAPI-${each.key}"
service_name = "order-api"
operation_name = each.value.operation
sli {
request_based {
metric_type = "LATENCY"
metric_threshold = each.value.latency
}
}
goal {
interval {
rolling_interval {
duration = 28
duration_unit = "DAY"
}
}
attainment_goal = 99.5
}
}
類似サービス比較
Application Signals vs Datadog APM
| 観点 | Application Signals | Datadog APM |
|---|---|---|
| セットアップ | ゼロコード(アノテーション) | Agent インストール |
| AWS統合 | ネイティブ | API連携(有料) |
| SLO管理 | 組み込み | ✅ |
| ダッシュボード | シンプル | 豊富・高度 |
| コスト | 低(月額数千円) | $31+/ホスト/月 |
| マルチクラウド | ❌ AWS only | ✅ |
選択: AWS 専用・低コスト → Application Signals、豊富機能・マルチクラウド → Datadog。
Application Signals vs New Relic
| 観点 | Application Signals | New Relic |
|---|---|---|
| 自動計装 | ゼロコード | Agent ベース |
| SLO | 組み込み | ✅ |
| UI | シンプル | 豊富 |
| コスト | 低 | $25+/ホスト/月 |
ベストプラクティス
✅ 推奨:
- SLO を段階的に設定(P50 → P90 → P99)
- エンドポイント単位で SLO 定義
- Error Budget 消費速度を weekly review
- Namespace ごとにアノテーション管理
❌ 避けるべき:
- SLO なしで Application Signals のみ運用
- Error Budget 無視してリリース
- 全エンドポイント 99.99% 目標(不切実)
トラブルシューティング
トレースが送信されない
| 原因 | 対応方法 |
|---|---|
| Addon 未インストール | aws eks create-addon で再度インストール |
| IAM ロール権限不足 | CloudWatchAgentServerPolicy 確認 |
| アノテーション未設定 | kubectl annotate で Pod に追加 |
| OTEL_SERVICE_NAME 環境変数未設定 | Deployment env に追加 |
SLO が表示されない
| 原因 | 対応方法 |
|---|---|
| SLO 定義から 24 時間未満 | 作成後 24 時間待機してから確認 |
| トレース数が少ない | 最小 100 トレース/時間 必要 |
2025-2026最新動向
1. SLO Recommendations(2026年3月)
30 日のデータから最適 SLO 値を自動提案
- CloudWatch Console の “SLO Recommendations” に:
- 推奨 P99 目標: 180ms(実績の平均)
- 推奨達成率: 99.5% → 99.2% に緩和提案
2. Service-Level SLOs(2026年2月)
複数エンドポイントの統合 SLO
Service: order-api(全体)
- GET /orders(P99: 150ms)
- POST /orders(P99: 500ms)
- DELETE /orders/{id}(P99: 100ms)
合計達成率: 98.5%
3. Lambda 自動計装強化
Lambda → Lambda 関数呼び出しの自動トレース
4. Kiro IDE(AI Operations)
異常検知時に AI アシスタントが自動提案
学習リソース
- AWS CloudWatch Application Signals
- Application Signals SLO Management
- AWS Observability Workshop
- OpenTelemetry Documentation
導入ロードマップ
- Week 1-2: CloudWatch Observability Addon インストール
- Week 3-4: Pod アノテーション設定・トレース確認
- Week 5-6: SLO 定義・ダッシュボード設定
- Week 7+: 運用・最適化
実装チェックリスト
- [ ] CloudWatch Observability Addon インストール
- [ ] IAM ロール作成・付与
- [ ] Pod にアノテーション追加
- [ ] トレース送信を CloudWatch Console で確認
- [ ] SLO 定義(3〜5個のエンドポイント)
- [ ] SLO ダッシュボード確認
- [ ] X-Ray で個別トレース検証
- [ ] CloudWatch Alarms で SLO 違反アラート設定
まとめ
Application Signals は 「マイクロサービスの自動 APM」 です。Datadog・New Relic と異なり、EKS Pod アノテーション 1 行追加するだけで、コード変更なしに Java・Python・Node.js のトレース・メトリクスが自動的に取得されます。
SLO 定義で「API P99 < 200ms」「可用性 99.5%」などの目標を設定し、Error Budget 消費速度をリアルタイムで監視。AWS ネイティブで低コストな APM として、Datadog(月 $31+/ホスト)比で 80% 以上のコスト削減が実現可能です。
2026 年以降は SLO Recommendations・Service-Level SLO・Kiro IDE による AI アシスタント機能で、運用がさらに簡素化されます。
参考文献
- CloudWatch Application Signals Developer Guide
- OpenTelemetry Documentation
- AWS Observability Best Practices
- OpenSLO Standard
- AWS CloudWatch Pricing
最終更新:2026-04-26 バージョン:v2.0