目次
CloudWatch Logs 完全ガイド v2.0
ログ一元管理・検索・分析・保存の統合プラットフォーム
Amazon CloudWatch Logs は、AWS サービス・アプリケーション・オンプレミスサーバーのログを一元収集・検索・分析・保存するマネージドログサービスです。Log Groups・Log Streamsの階層構造、Logs Insights のSQLライククエリ、Live Tail によるリアルタイム監視、Anomaly Detection による自動異常検知、複数バックエンド への自動転送(Firehose・Lambda・OpenSearch)を提供します。本ドキュメントはCloudWatch Logsの本質・運用パターン・コスト最適化・2026年の最新機能を体系的に解説します。
ドキュメントの目的
本ガイドは以下を対象としています。
- 初心者向け: CloudWatch Logsとは何か、どう使うかを学びたい方
- 開発者向け: アプリケーションログの送信・Logs Insights クエリを実装したい方
- 運用・SRE向け: ログベースのアラーム・異常検知・コスト最適化を実現したい方
- 意思決定者向け: Datadog・Splunk・Loki との比較検討
2025-2026年のCloudWatch Logs最新動向
- Logs Anomaly Detection拡張(2026年1月):パターン認識・トークン変異検出・周期性異常の ML 精度向上
- Log Classes 最適化(2026年2月):Infrequent Access クラスで 50% コスト削減
- VPC Endpoint サポート(2026年4月1日):Live Tail・API が VPC 内でルーティング可能に
- Unified Query across Regions(2026年3月GA):複数リージョンのログを単一クエリで検索
- Data Protection Policy 拡張:マスキングルール追加・監査ログ生成
- Integration with Data Firehose:リアルタイムで S3・Redshift・Splunk 連携強化
- CloudWatch Logs Insights Performance:クエリ実行速度 40% 高速化
目次
- 概要
- CloudWatch Logsが解決する課題
- 主な特徴
- アーキテクチャ
- ログの階層構造
- ログ送信の方法
- CloudWatch Logs Insights クエリ
- メトリクスフィルター
- サブスクリプションフィルター
- Live Tail
- Anomaly Detection
- Log Classes・保持期間・暗号化
- 主要ユースケース
- 設定・操作の具体例
- 類似サービス比較
- ベストプラクティス
- トラブルシューティング
- 2025-2026最新動向
- 学習リソース
- 導入ロードマップ
- 実装チェックリスト
- まとめ
- 参考文献
概要
初心者向けメモ: CloudWatch Logs は「AWS の標準ログ管理サービス」です。SSH で EC2 にログイン して tail -f /var/log/app.log する時代から卒業し、すべてのログを CloudWatch Logs に集約。ブラウザから検索・分析・アラーム設定ができます。
CloudWatch Logs は Lambda・EC2・ECS・API Gateway・RDS・CloudTrail などの AWS サービスが自動送信するログを一元管理するマネージドサービスです。Log Groups(名前空間)→ Log Streams(ソース)→ Log Events(タイムスタンプ+メッセージ)の 3 層構造で整理され、Logs Insights でのアドホック分析、メトリクスフィルターでのアラーム自動化、サブスクリプションフィルターでの外部システム連携(S3・Firehose・Lambda・OpenSearch)を提供します。
CloudWatch Logsの位置づけ
ロギング・ログ管理プラットフォームの役割:
- ログ一元化:Lambda・EC2・ECS・RDS などのログを CloudWatch Logs に統一
- リアルタイム検索・分析:Logs Insights でアドホック分析が可能
- アラーム自動化:メトリクスフィルターでログパターン → メトリクス → アラーム
- 外部連携:サブスクリプションフィルターで Firehose・Lambda・OpenSearch に転送
- コスト最適化:Log Classes(Standard vs Infrequent Access)でコスト削減
CloudWatch Logsが解決する課題
CloudWatch Logs は、ログ管理における次の問いに答えるための基盤です。
| 課題 | CloudWatch Logsのソリューション |
|---|---|
| Lambda 関数のエラーログを確認したい | /aws/lambda/{function-name} ロググループに自動送信。Logs Insights でエラーフィルタ |
| EC2 インスタンスの syslog・アプリケーションログを集約 | CloudWatch Agent で複数ログファイルを収集。一元管理 |
| エラーログの出現回数をアラーム | メトリクスフィルターで ERROR カウント → CloudWatch Alarm |
| ログを外部 SIEM(Splunk・Datadog)に送信 | サブスクリプションフィルターで Firehose・Lambda 経由に転送 |
| 長期ログを S3 に保存してコスト削減 | Firehose で S3 に日次エクスポート。Athena で後から分析 |
| VPC フローログから不正通信を検出 | Logs Insights で REJECT フィルタ。異常検知アラート設定 |
| 特定ユーザーのリクエストログのみを検索 | user_id フィールドで絞り込み。Log Insights で高速検索 |
| ログから PII(個人識別情報)を隠す | Data Protection Policy でマスキング。コンプライアンス対応 |
| ログ分析を簡素化(複雑な正規表現不要) | Logs Insights で SQL ライク構文。初心者でも簡単分析 |
| リアルタイムにログエラーを表示 | Live Tail で新着ログをストリーミング。トラブルシューティング高速化 |
主な特徴
| 特徴 | 説明 |
|---|---|
| AWS ネイティブ統合 | Lambda・ECS・API Gateway・CloudTrail が自動送信。追加エージェント不要で開始 |
| Log Groups / Log Streams | 階層構造で柔軟なログ整理(命名規則:/aws/lambda/func1, /aws/ecs/service1) |
| Logs Insights クエリ言語 | SQL ライク構文で複雑なログ分析が可能。初心者向けテンプレート提供 |
| メトリクスフィルター | ログパターンをメトリクスに変換。アラーム・ダッシュボード統合 |
| サブスクリプションフィルター | リアルタイムでログを Lambda・Firehose・Kinesis に転送 |
| Live Tail | 新着ログをストリーミング表示。リアルタイムトラブルシューティング |
| Anomaly Detection | ML で異常なログパターン・ボリューム変化を自動検知 |
| Log Classes | Standard(全機能)vs Infrequent Access(低コスト・機能限定) |
| Data Protection Policy | PII マスキング・監査ログ自動生成。コンプライアンス対応 |
| CloudWatch Logs Centralization | 複数アカウント・リージョン間のログ集約 |
| KMS 暗号化 | ログ保存時の暗号化。セキュリティ強化 |
| フィールドインデックス | 頻出フィールドをインデックス化。Logs Insights クエリ高速化 |
アーキテクチャ
【図1】CloudWatch Logsのエコシステム:
graph TD
subgraph Sources[ログソース]
Lambda["Lambda<br/>自動送信"]
EC2["EC2<br/>CloudWatch Agent"]
ECS["ECS<br/>awslogs Driver"]
RDS["RDS<br/>自動送信"]
APIGW["API Gateway<br/>自動送信"]
VPC["VPC Flow Logs<br/>自動送信"]
end
subgraph CWLogs[CloudWatch Logs Service]
LG["Log Groups<br/>Namespace"]
LS["Log Streams<br/>Source"]
LE["Log Events<br/>Timestamp + Message"]
end
subgraph Analysis[分析・検索層]
INSIGHTS["Logs Insights<br/>SQL-like Query"]
LIVETAIL["Live Tail<br/>Streaming"]
ANOMALY["Anomaly Detection<br/>ML-based"]
end
subgraph Automation[自動化・通知層]
METRICFILTER["Metric Filters<br/>Log → Metric"]
SUBFILT["Subscription Filters<br/>Real-time Forward"]
DATAPROTECT["Data Protection<br/>PII Masking"]
end
subgraph Integration[統合・転送先]
S3["S3<br/>Long-term Storage"]
FIREHOSE["Firehose<br/>Buffering + Transform"]
LAMBDA["Lambda<br/>Custom Processing"]
OPENSEARCH["OpenSearch<br/>Full-text Search"]
SPLUNK["Splunk<br/>SIEM"]
DATADOG["Datadog<br/>Monitoring"]
end
Sources -->|Log Ingestion| CWLogs
CWLogs -->|Query| INSIGHTS
CWLogs -->|Stream| LIVETAIL
CWLogs -->|Pattern Detection| ANOMALY
ANOMALY -->|Alert| METRICFILTER
CWLogs -->|Pattern Extraction| METRICFILTER
METRICFILTER -->|CloudWatch Alarm| Automation
CWLogs -->|Forward| SUBFILT
SUBFILT -->|Route| FIREHOSE
SUBFILT -->|Invoke| LAMBDA
FIREHOSE -->|Deliver| S3
FIREHOSE -->|Stream| OPENSEARCH
LAMBDA -->|Send| SPLUNK
LAMBDA -->|Send| DATADOG
ログの階層構造
CloudWatch Logs
├── Log Group(ロググループ): /aws/lambda/OrderProcessing
│ ├── 属性: 保持期間、暗号化(KMS)、サブスクリプションフィルター
│ ├── 料金課金単位
│ │
│ └── Log Stream(ロググストリーム): 2024/01/15/[$LATEST]abc123def456
│ ├── 属性: ソース(Lambda 版、EC2 インスタンス ID等)
│ │
│ └── Log Event(ログイベント)
│ ├── Timestamp: 2026-04-26T10:30:45.123Z
│ ├── Message: "[ERROR] Payment failed: timeout after 30s"
│ └── Size: 256 bytes (max)
命名規則(ベストプラクティス)
/aws/lambda/{function-name} # Lambda関数
/aws/ecs/{cluster}/{service} # ECS サービス
/aws/rds/instance/{db-instance-name} # RDS
/aws/apigateway/{api-name} # API Gateway
/aws/vpc/{flow-logs} # VPC Flow Logs
/app/{environment}/{service} # カスタムアプリケーション
ログ送信の方法
1. AWS サービスの自動送信
Lambda: IAM ロールに logs:CreateLogGroup 権限があれば自動送信
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event, context):
logger.info(f"Processing order: {event['order_id']}")
# 自動的に /aws/lambda/{function-name} に送信
ECS: タスク定義で awslogs ドライバー指定
{
"containerDefinitions": [
{
"name": "my-app",
"image": "my-app:latest",
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/my-service",
"awslogs-region": "ap-northeast-1",
"awslogs-stream-prefix": "ecs"
}
}
}
]
}
RDS: DB パラメータグループで log_exports 設定
aws rds modify-db-instance \
--db-instance-identifier my-database \
--cloudwatch-logs-export-configuration LogTypesToEnable=error,general,slowquery
2. CloudWatch Agent(EC2 / オンプレ)
{
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/nginx/access.log",
"log_group_name": "/app/nginx/access",
"log_stream_name": "{instance_id}",
"timestamp_format": "%d/%b/%Y:%H:%M:%S %z",
"retention_in_days": 90
},
{
"file_path": "/var/log/app/application.log",
"log_group_name": "/app/service",
"log_stream_name": "{hostname}",
"retention_in_days": 30
}
]
}
}
}
}
3. SDK / API 直接送信
import boto3
logs_client = boto3.client('logs')
# ロググループ作成
logs_client.create_log_group(logGroupName='/myapp/events')
# ログストリーム作成
logs_client.create_log_stream(
logGroupName='/myapp/events',
logStreamName='stream-001'
)
# ログイベント送信
logs_client.put_log_events(
logGroupName='/myapp/events',
logStreamName='stream-001',
logEvents=[
{
'timestamp': int(time.time() * 1000),
'message': '{"user_id": "user-123", "action": "login", "status": "success"}'
}
]
)
4. 構造化ログ(JSON形式)
import json
import logging
logger = logging.getLogger()
def log_event(level, event_type, details):
log_entry = {
'timestamp': datetime.utcnow().isoformat(),
'level': level,
'event_type': event_type,
'details': details
}
logger.info(json.dumps(log_entry))
# 使用例
log_event('INFO', 'ORDER_CREATED', {
'order_id': 'ord-12345',
'customer_id': 'cust-67890',
'amount': 9999,
'currency': 'JPY'
})
CloudWatch Logs Insights クエリ
基本構文
- fields @timestamp, @message, @duration
- | filter @message like /ERROR/
- | stats count() as error_count by bin(5m)
- | sort error_count desc
クエリ例
1. エラーログの集計
fields @timestamp, @message, @logStream
| filter @message like /ERROR/ or @message like /Exception/
| stats count() as error_count, count_distinct(@logStream) as affected_streams by bin(1m)
| sort error_count desc
2. レスポンスタイム分析(Lambda)
fields @timestamp, @duration, @billedDuration, @memorySize, @maxMemoryUsed
| filter @type = "REPORT"
| stats
count() as invocations,
avg(@duration) as avg_duration,
pct(@duration, 50) as p50,
pct(@duration, 90) as p90,
pct(@duration, 99) as p99,
max(@memoryUsed) as peak_memory
3. HTTP ステータスコード別集計(API Gateway)
fields @timestamp, @message
| filter ispresent(status)
| stats count() as request_count by status
| sort status
4. トップエラーメッセージ
fields @message
| filter @message like /ERROR/
| stats count() as count by @message
| sort count desc
| limit 10
5. VPC フローログ(拒否された通信)
fields @timestamp, srcaddr, srcport, dstaddr, dstport, action, protocol
| filter action = "REJECT"
| stats count() as reject_count by srcaddr, dstaddr, dstport
| sort reject_count desc
6. ユーザーセッション追跡
fields @timestamp, @message, user_id, session_id, action
| filter ispresent(user_id)
| filter user_id = "user-12345"
| sort @timestamp asc
7. パフォーマンス異常検出
fields @timestamp, @duration, request_id, endpoint
| filter ispresent(@duration)
| stats
avg(@duration) as avg_duration,
pct(@duration, 99) as p99
by endpoint
| filter p99 > 1000 # 1秒超のエンドポイント抽出
8. コスト分析(API Gateway + Lambda)
fields @timestamp, httpMethod, resourcePath, @duration
| filter ispresent(httpMethod) and ispresent(resourcePath)
| stats
count() as api_calls,
sum(@duration) / 1000 as total_seconds # 料金計算用
by httpMethod, resourcePath
| sort api_calls desc
クエリ関数リファレンス
| 関数 | 説明 | 例 |
|---|---|---|
count() |
イベント数カウント | stats count() by level |
count_distinct() |
ユニーク値数 | count_distinct(user_id) |
pct(field, percentile) |
パーセンタイル | pct(@duration, 99) |
| 平均値 | ||
sum(field) |
合計値 | sum(@duration) |
ispresent(field) |
フィールド存在チェック | ispresent(error_code) |
bin(duration) |
時間ビン(集計) | bin(5m) |
like |
部分一致 | @message like /ERROR/ |
メトリクスフィルター
設定例
# ERROR ログをカウント
aws logs put-metric-filter \
--log-group-name "/aws/lambda/OrderProcessing" \
--filter-name "ErrorCount" \
--filter-pattern "[level=ERROR*]" \
--metric-transformations \
metricName=ErrorCount,metricNamespace=MyApp,metricValue=1,defaultValue=0
# HTTP 4xx エラーをカウント
aws logs put-metric-filter \
--log-group-name "/aws/api-gateway/prod-api" \
--filter-name "HTTP4xxCount" \
--filter-pattern "[..., status=4*, ...]" \
--metric-transformations \
metricName=ClientErrorCount,metricValue=1
フィルターパターン構文
[ERROR] # "ERROR" 文字列を含む
[level=ERROR] # level フィールドが ERROR
[ip, id, status=4*, ...] # 4 番目フィールドが 4xx(ワイルドカード)
"ERROR" || "Exception" # OR 条件
{ $.level = "ERROR" } # JSON フィールド条件($.記法)
{ $.timestamp > 1000000 } # 数値比較
アラーム作成
# メトリクスフィルターから生成されたメトリクスにアラームを設定
aws cloudwatch put-metric-alarm \
--alarm-name "High-Error-Rate" \
--metric-name ErrorCount \
--namespace MyApp \
--statistic Sum \
--period 300 \
--threshold 10 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 1 \
--alarm-actions arn:aws:sns:ap-northeast-1:123456789:alerts
サブスクリプションフィルター
1. Lambda への転送
# Lambda 関数にリアルタイム転送
aws logs put-subscription-filter \
--log-group-name "/aws/lambda/OrderProcessing" \
--filter-name "error-alert" \
--filter-pattern "ERROR" \
--destination-arn arn:aws:lambda:ap-northeast-1:123456789:function:HandleLogError
# Lambda 関数側で処理
import base64
import json
def lambda_handler(event, context):
# CloudWatch Logs が圧縮して Base64 エンコード
payload = base64.b64decode(event['awslogs']['data'])
log_data = json.loads(payload)
for log_event in log_data['logEvents']:
message = log_event['message']
timestamp = log_event['timestamp']
# Slack 通知など処理
2. Kinesis Data Firehose への転送
# S3 に日次エクスポート
aws logs put-subscription-filter \
--log-group-name "/aws/lambda/OrderProcessing" \
--filter-name "s3-export" \
--filter-pattern "" \
--destination-arn arn:aws:firehose:ap-northeast-1:123456789:deliverystream/logs-to-s3
# Firehose で変換
aws firehose update-delivery-stream \
--delivery-stream-name logs-to-s3 \
--s3-destination-update-configuration \
S3DestinationConfiguration='{
"RoleARN": "arn:aws:iam::123456789:role/FirehoseRole",
"BucketARN": "arn:aws:s3:::my-logs-bucket",
"Prefix": "logs/year=YYYY/month=MM/day=DD/",
"ErrorOutputPrefix": "errors/!{firehose:error-output-type}/year=YYYY/month=MM/day=DD/",
"CloudWatchLoggingOptions": {"Enabled": true, "LogGroupName": "/aws/kinesisfirehose"}
}'
3. OpenSearch Service への転送
# Lambda function: CloudWatch Logs → OpenSearch
import json
import base64
import boto3
from opensearchpy import OpenSearch
client = OpenSearch(hosts=['domain.ap-northeast-1.es.amazonaws.com'])
def lambda_handler(event, context):
# ログデータをデコード
payload = base64.b64decode(event['awslogs']['data'])
log_data = json.loads(payload)
# OpenSearch にインデックス化
for log_event in log_data['logEvents']:
doc = {
'timestamp': log_event['timestamp'],
'message': log_event['message'],
'logGroup': log_data['logGroup'],
'logStream': log_data['logStream']
}
client.index(
index=f"logs-{log_data['logGroup']}",
body=doc
)
Live Tail
リアルタイムストリーミング監視
# 特定のロググループを Live Tail で監視
aws logs tail /aws/lambda/OrderProcessing --follow
# フィルター適用
aws logs tail /aws/lambda/OrderProcessing \
--filter-pattern "ERROR" \
--follow
# 複数ロググループを監視
aws logs tail /aws/lambda --follow
# テキストハイライト
aws logs tail /aws/lambda/OrderProcessing \
--follow \
--format json \
--log-stream-names '[$LATEST]'
Console での使用
CloudWatch Console
→ Logs
→ Log groups
→ /aws/lambda/OrderProcessing
→ Live Tail(右上のアイコン)
→ フィルター入力: "ERROR", "timeout" など
セッション時間: 最大 3 時間
Anomaly Detection
ML ベース異常検知
# 異常検出器を作成
aws logs put-log-anomaly-detector \
--log-group-arn arn:aws:logs:ap-northeast-1:123456789:log-group:/aws/lambda/OrderProcessing \
--anomaly-visibility-time 7 \
--evaluation-frequency FIVE_MIN
検出対象
- パターン頻度変化:エラーパターン急増
- 新しいパターン:未知のエラータイプ出現
- トークン変異:既知パターンの異常値
- 周期性異常:通常周期の逸脱
- ボリューム異常:ログ量の急増・急減
Logs Insights で異常検出
fields @timestamp, @message
| anomaly @timestamp, @message
Log Classes と保持期間と暗号化
Log Classes
Standard Class(デフォルト)
料金:$0.76/GB(取り込み)+ $0.033/GB/月(保存)
機能:
- Logs Insights クエリ
- Live Tail
- Anomaly Detection
- メトリクスフィルター
- サブスクリプションフィルター
- データ保護ポリシー
Infrequent Access Class(2026年2月GA)
料金:$0.38/GB(取り込み)+ $0.011/GB/月(保存) # 50% 削減
機能:
- Logs Insights クエリ
- Live Tail
- メトリクスフィルター
- ❌ Anomaly Detection(未対応)
- ❌ データ保護ポリシー(2026年Q2対応予定)
推奨用途:
- 監査ログ(低頻度アクセス)
- アーカイブログ
- コンプライアンス保持期間中のログ
保持期間設定
# ロググループ保持期間設定
aws logs put-retention-policy \
--log-group-name "/aws/lambda/OrderProcessing" \
--retention-in-days 30
# 設定値
1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653
# 無期限の場合は指定しない
KMS 暗号化
# ロググループを KMS で暗号化
aws logs associate-kms-key \
--log-group-name "/aws/lambda/OrderProcessing" \
--kms-key-id arn:aws:kms:ap-northeast-1:123456789:key/12345678-1234-1234-1234-123456789012
主要ユースケース
1. Lambda エラー監視
- Lambda 関数出力 → CloudWatch Logs
- → Logs Insights で ERROR フィルタ
- → メトリクスフィルター → アラーム
2. マイクロサービスログ一元化
- 複数マイクロサービス → CloudWatch Logs
- → Logs Insights で統合検索
- → トレース ID でリクエスト追跡
3. VPC フローログ監視
- VPC Flow Logs → CloudWatch Logs
- → Logs Insights で REJECT / DROP フィルタ
- → 不正アクセス検出
4. コスト監視・最適化
- API Gateway ログ → CloudWatch Logs
- → Logs Insights で呼び出し数集計
- → メトリクスフィルター → 利用料予測
5. セキュリティ・コンプライアンス監査
- CloudTrail → CloudWatch Logs
- → Data Protection Policy で PII マスク
- → Logs Insights で監査クエリ
- → S3 Glacier で長期保存
6. リアルタイムアラート
- アプリケーションログ → CloudWatch Logs
- → Live Tail でリアルタイム監視
- → メトリクスフィルター → SNS/EventBridge 通知
7. ログ分析・ビジネスインサイト
- アプリケーションログ → 構造化 JSON
- → Logs Insights で集計・分析
- → ダッシュボード化
- → ビジネス指標可視化(アクティブユーザー数・売上等)
8. CI/CD パイプライン監視
- CodeBuild ビルドログ → CloudWatch Logs
- → Logs Insights でビルド失敗検出
- → EventBridge → 自動修復 Lambda
9. 複数 AWS アカウント・リージョン統合
Account A Region A → 中央アカウント Region A
Account A Region B ↗
Account B Region A → CloudWatch Logs Centralization
Account B Region B ↗
→ 統一分析
10. OpenSearch / Splunk 連携
- CloudWatch Logs → Firehose / Lambda
- → Splunk / OpenSearch
- → 高度な分析・ダッシュボード
設定・操作の具体例
AWS CLI
# ロググループ作成
aws logs create-log-group \
--log-group-name /app/myservice
# ロググループ一覧
aws logs describe-log-groups --query 'logGroups[*].logGroupName'
# ロググループ削除
aws logs delete-log-group --log-group-name /app/myservice
# ロググストリーム作成
aws logs create-log-stream \
--log-group-name /app/myservice \
--log-stream-name instance-001
# ログイベント取得
aws logs get-log-events \
--log-group-name /aws/lambda/OrderProcessing \
--log-stream-name '2024/01/15/[$LATEST]abc123' \
--limit 100
Terraform
resource "aws_cloudwatch_log_group" "app_logs" {
name = "/app/myservice"
retention_in_days = 30
kms_key_id = aws_kms_key.cloudwatch.arn
tags = {
Environment = "production"
Managed = "terraform"
}
}
resource "aws_cloudwatch_log_stream" "app_stream" {
name = "instance-001"
log_group_name = aws_cloudwatch_log_group.app_logs.name
}
resource "aws_cloudwatch_log_metric_filter" "error_count" {
name = "ErrorCount"
log_group_name = aws_cloudwatch_log_group.app_logs.name
filter_pattern = "[level=ERROR*]"
metric_transformation {
name = "ErrorCount"
namespace = "MyApp"
value = "1"
}
}
boto3
import boto3
logs = boto3.client('logs')
# ロググループ作成
logs.create_log_group(logGroupName='/app/myservice')
# メトリクスフィルター設定
logs.put_metric_filter(
logGroupName='/app/myservice',
filterName='ErrorCount',
filterPattern='[level=ERROR*]',
metricTransformations=[
{
'metricName': 'ErrorCount',
'metricNamespace': 'MyApp',
'metricValue': '1',
'defaultValue': 0
}
]
)
# ログイベント送信
logs.put_log_events(
logGroupName='/app/myservice',
logStreamName='stream-001',
logEvents=[
{
'timestamp': int(time.time() * 1000),
'message': '{"level": "ERROR", "message": "Database timeout"}'
}
]
)
類似サービス比較
CloudWatch Logs vs Datadog Logs
| 観点 | CloudWatch Logs | Datadog Logs |
|---|---|---|
| AWS統合 | ✅ ネイティブ | API連携(有料) |
| UI/UX | 基本的 | 豊富・直感的 |
| クエリ言語 | Logs Insights | Datadog Query Language |
| マルチクラウド | ❌ AWS のみ | ✅ AWS・Azure・GCP |
| コスト | `0.76/GB取込 | `0.10/GB取込 |
| ログ保持 | カスタマイズ可能 | Datadog側で管理 |
| 異常検知 | ML統合 | Advanced Analytics(有料) |
選択: AWS専用なら CloudWatch Logs、マルチクラウド・高度な分析なら Datadog。
CloudWatch Logs vs Loki(OSS)
| 観点 | CloudWatch Logs | Loki |
|---|---|---|
| セットアップ | マネージド(簡単) | Kubernetes・Helm必要 |
| AWS統合 | ネイティブ | API連携 |
| コスト | $0.76/GB | インフラ費用(OSS) |
| スケーラビリティ | AWS自動スケーリング | 自管理(複雑) |
| ダッシュボード | CloudWatch統合 | Grafana |
選択: AWS環境ならCloudWatch Logs、Kubernetes・OSS重視ならLoki。
CloudWatch Logs vs Splunk
| 観点 | CloudWatch Logs | Splunk |
|---|---|---|
| AWS統合 | ✅ ネイティブ | API連携 |
| エンタープライズ機能 | 基本的 | 豊富 |
| SIEM | 限定的 | 強力 |
| コスト | 低コスト | 高コスト(要見積) |
ベストプラクティス
1. ロググループ命名規則
✅ 推奨: 階層的・明確な名前
/aws/lambda/{function-name}
/aws/ecs/{cluster}/{service}
/app/{environment}/{service}/{component}
❌ 避ける: 曖昧な名前
- /logs
- /app-logs
- /my-logs-123
2. 保持期間最適化
✅ 推奨: 用途に応じた設定
- Lambda ログ: 30 日
- API Gateway ログ: 14 日
- 監査ログ: 1 年 or 無期限
❌ 避ける: すべて無期限(コスト爆発)
3. ログフォーマット統一
✅ 推奨: 構造化ログ(JSON)
import json
logger.info(json.dumps({
'timestamp': datetime.utcnow().isoformat(),
'level': 'INFO',
'service': 'OrderAPI',
'user_id': user_id,
'action': 'order_created',
'order_id': order_id,
'amount': amount
}))
❌ 避ける: 非構造化テキスト
- 2026-04-26 10:30:45 Order created for user 123
4. Log Classes の活用(2026年2月GA)
✅ 推奨: 低頻度アクセスログは Infrequent Access
- Standard: Lambda・API Gateway ログ(頻繁にアクセス)
- Infrequent: 監査ログ・アーカイブ(低頻度)
5. Data Protection Policy でマスキング
✅ 推奨: PII を自動マスク
aws logs put-data-protection-policy \
--log-group-name /app/myservice \
--policy-document '{
"Name": "MaskCreditCards",
"Version": "21.06",
"Statement": [
{
"Sid": "Mask",
"DataIdentifier": ["arn:aws:dataprotection::aws:data-identifier/CreditCardNumber"],
"Operation": {"Mask": {}}
}
]
}'
6. メトリクスフィルター精度
✅ 推奨: 正確なフィルターパターン
[level=ERROR*]
[..., status=5*, ...]
{ $.error_code = "TIMEOUT" }
❌ 避ける: 過度に広いパターン
- [ERROR] # これだけだと誤検知が多い
トラブルシューティング
ログが表示されない
| 原因 | 対応方法 |
|---|---|
| ロググループ未作成 | aws logs create-log-group |
| IAM 権限不足 | logs:CreateLogGroup, logs:PutLogEvents 付与 |
| CloudWatch Agent 停止(EC2) | sudo systemctl start amazon-cloudwatch-agent |
| ECS タスク定義の awslogs ドライバー未設定 | タスク定義で logConfiguration 追加 |
Logs Insights クエリが遅い
| 原因 | 対応方法 |
|---|---|
| 検索範囲が広い | 時間範囲を1時間に短縮 |
| フィルター条件不足 | より具体的な filter 追加 |
| インデックスなしフィールド | フィールドインデックス作成 |
メトリクスフィルターが機能しない
| 原因 | 対応方法 |
|---|---|
| パターン構文エラー | フィルターパターン検証 |
| ロググループに適用前のログ | 設定後のログに適用される |
| メトリクス名誤字 | アラーム設定でメトリクス名再確認 |
2025-2026最新動向
1. Log Classes 最適化
2026年2月GA: Infrequent Access クラスで 50% 以上コスト削減
- Standard: $0.76/GB 取込 + $0.033/GB/月
- Infrequent: $0.38/GB 取込 + $0.011/GB/月 # 50% 削減
2. Logs Insights パフォーマンス向上
2026年3月: クエリ実行速度 40% 高速化
3. VPC Endpoint サポート
2026年4月1日: Live Tail・Logs Insights が VPC 内で実行可能に
- stream-logs.ap-northeast-1.amazonaws.com # 新エンドポイント
4. Unified Query across Regions
2026年3月GA: 複数リージョンのログを単一クエリで検索
fields @timestamp, @message, @logGroup
| filter region = "ap-northeast-1" or region = "ap-southeast-1"
| stats count() as total_errors by region
5. Data Protection Policy 拡張
2026年Q2: Infrequent Access クラスでも PII マスキング対応予定
学習リソース
公式ドキュメント
- Amazon CloudWatch Logs User Guide
- CloudWatch Logs Insights Query Syntax
- Logs Anomaly Detection
- CloudWatch Logs Centralization
OSS・比較
導入ロードマップ
Week 1-2 Week 3-4 Week 5-6 Week 7+
┌──────────┬──────────┬──────────┬──────────────┐
│基礎・基本│ 実装展開 │ 発展機能│ 運用・最適化 │
│セットアップ│ │ │ │
│・概念理解│・Lambda │・Logs │・コスト最適化│
│・ロググ │・EC2 計装│Insights│・ADOT 移行 │
│ループ作成│・アラーム│複雑ク │・複数リージ│
│ │設定 │エリ │ョン統合 │
└──────────┴──────────┴──────────┴──────────────┘
実装チェックリスト
Phase 1:基本セットアップ
- [ ] CloudWatch Logs コンソールアクセス確認
- [ ] Lambda 関数の自動ログ送信を確認
- [ ] ロググループを手動作成
Phase 2:ログ収集・送信
- [ ] EC2 に CloudWatch Agent インストール
- [ ] ECS タスク定義で awslogs ドライバー設定
- [ ] RDS ログを CloudWatch Logs に送信
Phase 3:分析・クエリ
- [ ] Logs Insights で基本クエリ実行(エラーフィルタ等)
- [ ] メトリクスフィルター作成(ERROR カウント)
- [ ] CloudWatch アラーム設定
Phase 4:自動化・連携
- [ ] サブスクリプションフィルターで Firehose 転送設定
- [ ] Lambda で Logs → Slack 通知実装
- [ ] Live Tail で リアルタイム監視確認
Phase 5:発展機能
- [ ] Anomaly Detection 有効化
- [ ] Data Protection Policy で PII マスキング設定
- [ ] Log Classes 最適化(Standard vs Infrequent Access)
Phase 6:統合・最適化
- [ ] 複数アカウント・リージョン統合(Centralization)
- [ ] ログ保持期間最適化
- [ ] S3 長期保存・Athena 分析環境構築
まとめ
初心者向けメモ: CloudWatch Logs は「AWS の標準ログ管理サービス」です。Lambda・EC2・ECS・RDS など AWS サービスのログが自動的に送信され、Logs Insights で簡単に検索・分析できます。
CloudWatch Logs を使うべき3つの理由
- AWS ネイティブ統合:Lambda・ECS・API Gateway が自動送信。エージェント不要で開始可能。
- Logs Insights で簡単分析:SQL ライク構文で複雑なログ分析が可能。初心者向けテンプレート提供。
- メトリクスフィルターでアラーム自動化:ログパターン → メトリクス → アラーム で自動通知。
次のステップ
- Lambda 関数で自動ログ送信を確認
- Logs Insights でエラー検索
- メトリクスフィルターでアラーム設定
- サブスクリプションフィルターで外部連携
- Log Classes で コスト最適化
参考文献
公式ドキュメント
- Amazon CloudWatch Logs User Guide
- CloudWatch Logs Insights Query Syntax
- CloudWatch Logs Anomaly Detection
- CloudWatch Logs Live Tail
- CloudWatch Logs Log Classes
- Data Protection in CloudWatch Logs
- CloudWatch Logs Pricing
- AWS CloudWatch Logs Centralization
ログ管理・可観測性
関連ブログ・記事
- AWS Messaging and Targeting Blog
- AWS Cloud Operations Blog
- CloudWatch Logs Anomaly Detection & Pattern Analysis(Grafana Labs)
最終更新:2026-04-26 バージョン:v2.0