サイトアイコンmaita tomoya dev io

AWS CloudWatch

DevOps/インフラ

AWS CloudWatch

CloudWatchとは

Amazon CloudWatchは、AWSリソースとアプリケーションのモニタリング(監視)サービス。メトリクス(数値データ)の収集・可視化、ログの集約・分析、アラームによる異常検知、ダッシュボードによる一元監視を提供する。

AWSの運用において「何が起きているか」を把握するための中核サービス。サーバーの健康状態、アプリケーションのパフォーマンス、コストの異常など、あらゆる側面を監視できる。

モニタリングの重要性

目的説明CloudWatchの機能
障害検知問題をいち早く発見するアラーム
パフォーマンス分析ボトルネックを特定するメトリクス、X-Ray
キャパシティプランニング将来の需要を予測するメトリクスの時系列分析
コスト最適化リソースの無駄を検出するメトリクス、アノマリー検出
コンプライアンス操作の記録と監査ログ
デバッグ問題の根本原因を調査するログ、X-Ray

メトリクス

メトリクスは、CloudWatchに送信される時系列の数値データ。AWSサービスは自動的にメトリクスをCloudWatchに送信する。

主なAWSサービスのメトリクス

サービスメトリクス例説明
EC2CPUUtilizationCPU使用率(%)
EC2NetworkIn / NetworkOutネットワーク通信量
LambdaDuration関数の実行時間
LambdaErrorsエラー数
LambdaThrottlesスロットリング数
RDSDatabaseConnectionsDB接続数
RDSFreeStorageSpace空きストレージ
SQSApproximateNumberOfMessagesVisibleキュー内のメッセージ数
ALBRequestCountリクエスト数
ALBTargetResponseTimeレスポンス時間

メトリクスの構造

Namespace: AWS/EC2
MetricName: CPUUtilization
Dimensions:
  InstanceId: i-1234567890abcdef0
Period: 300(5分)
Statistic: Average
Value: 45.2
Timestamp: 2026-04-02T10:00:00Z
要素説明
Namespaceメトリクスのカテゴリ(例: AWS/EC2AWS/Lambda
MetricNameメトリクスの名前
Dimensionsメトリクスを識別する属性(インスタンスID等)
Periodデータポイントの集約期間(秒)
Statistic集約方法(Average、Sum、Minimum、Maximum、SampleCount)

カスタムメトリクス

独自のメトリクスをCloudWatchに送信できる。

import {
  CloudWatchClient,
  PutMetricDataCommand,
} from '@aws-sdk/client-cloudwatch';

const client = new CloudWatchClient({ region: 'ap-northeast-1' });

await client.send(
  new PutMetricDataCommand({
    Namespace: 'MyApp/Orders',
    MetricData: [
      {
        MetricName: 'OrderProcessingTime',
        Value: 1250,
        Unit: 'Milliseconds',
        Dimensions: [
          { Name: 'Environment', Value: 'production' },
          { Name: 'OrderType', Value: 'premium' },
        ],
      },
      {
        MetricName: 'OrderCount',
        Value: 1,
        Unit: 'Count',
        Dimensions: [
          { Name: 'Environment', Value: 'production' },
        ],
      },
    ],
  })
);

メトリクス解像度

解像度間隔料金ユースケース
標準(Standard)60秒(1分)無料(AWSサービス標準)通常のモニタリング
高解像度(High-Resolution)1秒追加料金リアルタイム性が重要な場合
詳細モニタリング(EC2)60秒(1分)追加料金EC2の詳細データ

EC2のデフォルトメトリクスは5分間隔。詳細モニタリングを有効にすると1分間隔になる。

Metric Math

複数のメトリクスを演算して新しいメトリクスを生成できる。

# エラー率の計算
errorRate = errors / requests * 100

# 使用率の計算
utilizationPercent = (usedCapacity / totalCapacity) * 100

CloudWatch Logs

CloudWatch Logsは、AWSサービスやアプリケーションのログを集約・保存・検索するサービス。

ログの構造

graph TD A[ロググループ] --> B[ログストリーム1] A --> C[ログストリーム2] A --> D[ログストリーム3] B --> E[ログイベント] B --> F[ログイベント] B --> G[ログイベント]
概念説明
ロググループログの論理的なグループ/aws/lambda/my-function
ログストリームログの発生源ごとの時系列データLambda実行環境ごとに1つ
ログイベント個々のログエントリタイムスタンプ + メッセージ

ログの送信元

送信元自動/手動説明
Lambda自動console.logの出力が自動送信
ECS/Fargate設定で自動awslogsドライバーで送信
EC2手動(エージェント)CloudWatch Agentをインストール
API Gateway設定で自動アクセスログ、実行ログ
VPC Flow Logs設定で自動ネットワークトラフィックログ
カスタムアプリSDK/CLIPutLogEventsで送信

構造化ログの推奨

// 非推奨: 平文ログ
console.log('Order processed: 12345, amount: 15000, status: success');

// 推奨: JSON構造化ログ
console.log(
  JSON.stringify({
    level: 'INFO',
    message: 'Order processed',
    orderId: '12345',
    amount: 15000,
    status: 'success',
    timestamp: new Date().toISOString(),
  })
);

構造化ログにすると、CloudWatch Logs InsightsやMetric Filterで効率的にクエリ・分析できる。

ログの保持期間

ロググループごとに設定可能。デフォルトは「無期限」(永久保存)。

保持期間ユースケース
1日〜7日開発・テスト環境
30日〜90日本番環境の通常ログ
1年〜10年コンプライアンス要件のあるログ
S3エクスポート長期保存・低コスト

注意: 保持期間を適切に設定しないと、ログのストレージ料金が膨れ上がる。

サブスクリプションフィルター

ログをリアルタイムに別サービスに配信する。

CloudWatch Logs → サブスクリプションフィルター → Lambda(リアルタイム処理)
                                               → Kinesis Data Firehose → S3
                                               → Kinesis Data Streams
                                               → 他アカウントのCloudWatch Logs

CloudWatch Logs Insights

CloudWatch Logs Insightsは、ログデータに対してSQLライクなクエリを実行できる分析ツール。大量のログから必要な情報を高速に検索・集計できる。

クエリ構文

-- 直近のエラーログを検索
fields @timestamp, @message
| filter @message like /ERROR/
| sort @timestamp desc
| limit 20
-- Lambda関数の実行時間統計
filter @type = "REPORT"
| stats avg(@duration), max(@duration), min(@duration), count(*) by bin(5m)
-- APIエンドポイント別のエラー率
fields @timestamp, @message
| parse @message '"path":"*"' as path
| parse @message '"statusCode":*,' as statusCode
| filter statusCode >= 400
| stats count(*) as errorCount by path
| sort errorCount desc

主なコマンド

コマンド説明
fields表示するフィールドを選択fields @timestamp, @message
filter条件でフィルタfilter @message like /ERROR/
stats集計関数stats count(*), avg(duration)
sortソートsort @timestamp desc
limit件数制限limit 50
parseテキストからフィールド抽出parse @message '"key":"*"' as value
display最終出力のフィールド選択display @timestamp, errorMessage

組み込みフィールド

フィールド説明
@timestampログイベントのタイムスタンプ
@messageログメッセージ本文
@logStreamログストリーム名
@logロググループ名
@ingestionTimeログが取り込まれた時刻

実践的なクエリ例

-- 5xxエラーの発生頻度を5分単位で集計
fields @timestamp, @message
| filter @message like /HTTP\/1\.\d" 5\d{2}/
| stats count(*) as errorCount by bin(5m)
| sort @timestamp

-- 特定ユーザーのアクション追跡
fields @timestamp, @message
| filter @message like /userId.*USR-001/
| sort @timestamp
| limit 100

-- Lambdaのコールドスタート検出
filter @message like /Init Duration/
| parse @message "Init Duration: * ms" as initDuration
| stats avg(initDuration), max(initDuration), count(*) by bin(1h)

-- メモリ使用率の高いLambda実行を特定
filter @type = "REPORT"
| parse @message "Memory Size: * MB" as memorySize
| parse @message "Max Memory Used: * MB" as memoryUsed
| fields memoryUsed / memorySize * 100 as memoryUtil
| filter memoryUtil > 80
| sort memoryUtil desc

CloudWatch アラーム

アラームは、メトリクスが特定の閾値を超えた場合にアクション(通知、Auto Scaling、Lambda実行等)をトリガーする機能。

アラームの状態

状態説明
OKメトリクスが閾値内
ALARMメトリクスが閾値を超過
INSUFFICIENT_DATAデータが不足して判定不能

アラームの設定例

graph LR A[メトリクス: CPUUtilization] --> B{閾値: 80%超過が<br>3回連続?} B -->|ALARM| C[SNSトピック] C --> D[メール通知] C --> E[Slack通知<br>(Lambda経由)] C --> F[Auto Scaling<br>スケールアウト] B -->|OK| G[何もしない]

Terraform での定義例

resource "aws_cloudwatch_metric_alarm" "high_cpu" {
  alarm_name          = "high-cpu-utilization"
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = 3
  metric_name         = "CPUUtilization"
  namespace           = "AWS/EC2"
  period              = 300
  statistic           = "Average"
  threshold           = 80
  alarm_description   = "CPU使用率が80%を3回連続で超過"

  dimensions = {
    InstanceId = aws_instance.web.id
  }

  alarm_actions = [aws_sns_topic.alerts.arn]
  ok_actions    = [aws_sns_topic.alerts.arn]
}

複合アラーム(Composite Alarm)

複数のアラームを論理演算(AND/OR/NOT)で組み合わせた高度なアラーム。

複合アラーム = (CPUアラーム AND メモリアラーム) OR ディスクアラーム

アラームノイズを減らし、真に対応が必要な状況でのみ通知する。

アノマリー検出

機械学習を使って、メトリクスの通常パターンから逸脱した異常を自動検出する。

resource "aws_cloudwatch_metric_alarm" "anomaly_detection" {
  alarm_name          = "api-latency-anomaly"
  comparison_operator = "GreaterThanUpperThreshold"
  evaluation_periods  = 3
  threshold_metric_id = "ad1"

  metric_query {
    id          = "m1"
    return_data = true
    metric {
      metric_name = "TargetResponseTime"
      namespace   = "AWS/ApplicationELB"
      period      = 300
      stat        = "Average"
    }
  }

  metric_query {
    id          = "ad1"
    expression  = "ANOMALY_DETECTION_BAND(m1, 2)"
    label       = "Anomaly Detection Band"
    return_data = true
  }
}

CloudWatch ダッシュボード

カスタマイズ可能な監視画面。複数のメトリクス、ログ、アラームを1つの画面に集約して表示する。

ダッシュボードの構成要素

ウィジェット説明ユースケース
Line(折れ線グラフ)時系列データの推移CPU使用率、リクエスト数
Stacked Area積み上げ面グラフ複数インスタンスの合計
Number単一の数値現在のエラー数
Gaugeゲージ使用率の可視化
Bar棒グラフカテゴリ別の比較
Textテキスト/マークダウン説明、リンク集
Alarm Statusアラームの状態表示全アラームの一覧
Logs Insightsログクエリ結果エラーログの表示
Explorerメトリクスの探索タグベースのメトリクス集約

ダッシュボード設計のポイント

  • レイヤー別: インフラ層、アプリケーション層、ビジネス層に分けてダッシュボードを作成
  • 1画面完結: スクロールなしで重要な情報が見えるようにする
  • アラームを含める: 現在のアラーム状態をダッシュボードに含める
  • クロスアカウント: 複数アカウントのメトリクスを1つのダッシュボードに集約可能

AWS X-Ray

X-Rayは、分散アプリケーションのトレーシングサービス。リクエストがシステム内をどのように流れるかを可視化し、パフォーマンスのボトルネックやエラーの発生箇所を特定する。

X-Rayの基本概念

graph LR A[API Gateway] -->|セグメント| B[Lambda A] B -->|サブセグメント| C[DynamoDB] B -->|サブセグメント| D[Lambda B] D -->|サブセグメント| E[S3] style A fill:#f9f,stroke:#333 style B fill:#bbf,stroke:#333 style D fill:#bbf,stroke:#333 style C fill:#bfb,stroke:#333 style E fill:#bfb,stroke:#333
概念説明
トレース1つのリクエストの全体的な流れ
セグメント各サービスの処理単位
サブセグメントサービス内の個別処理(DB呼び出し、外部API呼び出し等)
サービスマップサービス間の依存関係の可視化
アノテーショントレースに付与するキーバリューペア(検索可能)
メタデータトレースに付与する追加情報(検索不可)

X-Rayの有効化(Lambda)

LambdaではX-Rayのアクティブトレーシングを有効にするだけで自動的にトレースが収集される。

import { DynamoDBClient, GetItemCommand } from '@aws-sdk/client-dynamodb';

// AWS SDK v3は自動的にX-Rayトレースを生成
const client = new DynamoDBClient({ region: 'ap-northeast-1' });

export const handler = async (event) => {
  // このDynamoDB呼び出しが自動的にサブセグメントとして記録される
  const result = await client.send(
    new GetItemCommand({
      TableName: 'Orders',
      Key: { OrderId: { S: event.orderId } },
    })
  );

  return result.Item;
};

CloudWatch ServiceLens

X-Ray、CloudWatch Logs、CloudWatchメトリクスを統合して、アプリケーションの健全性を一元的に把握するダッシュボード。サービスマップ上で各サービスのレイテンシ、エラー率、ログを確認できる。


CloudWatch Agent

EC2インスタンスやオンプレミスサーバーからメトリクスとログを収集するエージェント。

収集できるデータ

データ標準メトリクスでは取得不可Agent で取得可能
メモリ使用率不可可能
ディスク使用率不可可能
プロセス情報不可可能
アプリケーションログ不可可能
カスタムメトリクス不可可能

注意: EC2の標準メトリクスにはメモリ使用率とディスク使用率が含まれない。CloudWatch Agentをインストールして取得する必要がある。

Agent設定ファイルの例

{
  "metrics": {
    "namespace": "MyApp/EC2",
    "metrics_collected": {
      "mem": {
        "measurement": ["mem_used_percent"],
        "metrics_collection_interval": 60
      },
      "disk": {
        "measurement": ["disk_used_percent"],
        "resources": ["/"],
        "metrics_collection_interval": 60
      }
    }
  },
  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [
          {
            "file_path": "/var/log/my-app/app.log",
            "log_group_name": "/myapp/application",
            "log_stream_name": "{instance_id}",
            "timezone": "UTC"
          }
        ]
      }
    }
  }
}

Metric Filter

ログデータからメトリクスを自動生成する機能。特定のパターンにマッチするログイベントをカウントしたり、ログ内の数値を抽出してメトリクスにできる。

使用例

ログ: {"level":"ERROR","message":"Payment failed","orderId":"12345"}

Metric Filter Pattern: { $.level = "ERROR" }
→ カスタムメトリクス: ErrorCount に +1
→ アラーム: エラー数が閾値を超えたら通知

フィルターパターンの構文

パターン説明
単語一致特定の文字列を含むERROR
JSONJSONフィールドでフィルタ{ $.level = "ERROR" }
スペース区切り位置ベースの値抽出[ip, user, timestamp, request]

料金体系

主な料金項目

項目無料枠料金
カスタムメトリクス10個$0.30/メトリクス/月
ダッシュボード3つ(50メトリクスまで)$3.00/ダッシュボード/月
アラーム(標準)10個$0.10/アラーム/月
ログ取り込み5GB$0.76/GB(東京)
ログ保存5GB$0.033/GB/月(東京)
Logs Insightsクエリ$0.0076/GBスキャン
API呼び出し100万$0.01/1,000リクエスト

コスト最適化のポイント

  • ログの保持期間を適切に設定する(デフォルトの「無期限」を避ける)
  • 不要なメトリクスの送信を止める
  • ログをS3にエクスポートして長期保存する(CloudWatch Logsより安い)
  • Embedded Metric Formatを使って効率的にカスタムメトリクスを送信する

ベストプラクティス

メトリクス

  • AWSサービスの標準メトリクスを活用する(追加料金なし)
  • EC2ではCloudWatch Agentでメモリ・ディスクメトリクスを取得する
  • Metric Mathでビジネスメトリクスを計算する(エラー率、成功率等)
  • 高解像度メトリクスは本当に必要な場合のみ使用する

ログ

  • 構造化ログ(JSON)を出力する
  • ログレベルを適切に設定する(本番ではINFO以上)
  • 保持期間を設定してコストを管理する
  • 機密情報(パスワード、トークン)をログに含めない

アラーム

  • アラームの閾値を適切に設定する(誤検知を減らす)
  • 複合アラームでノイズを減らす
  • アノマリー検出を活用して動的な閾値を設定する
  • アラーム発火時の対応手順(ランブック)を事前に用意する

全体

  • ダッシュボードを作成して重要なメトリクスを一元管理する
  • X-Rayを有効にして分散トレーシングを実現する
  • CloudWatch Logs InsightsでログのAd-hoc分析を行う
  • Embedded Metric Formatでログとメトリクスを同時に送信する

参考リンク