メインコンテンツまでスキップ

Amazon CloudWatch とは?メトリクス・ログ・アラームの基本を学ぼう

タグ:

AWS 上でシステムを運用する際、リソースの状態を把握して異常を早期に検知することは欠かせないです。Amazon CloudWatch は AWS リソースやアプリケーションの監視・オブザーバビリティ(システムの内部状態を外部から観測・把握できる性質)を一元管理できるマネージドサービスです。本記事では CloudWatch の基本概念からメトリクス・ログ・アラームの仕組み、AWS CLI を使った基本操作まで説明します。

Amazon CloudWatch とは​

CloudWatch は AWS が提供するフルマネージドな監視・オブザーバビリティサービスです。EC2 インスタンスや RDS、Lambda などの AWS リソースから自動的にメトリクスを収集し、ダッシュボードや通知、ログ管理など幅広い監視機能を提供します。

CloudWatch を活用することで、システムの状態をリアルタイムに把握し、問題が発生した際にアラームで通知を受け取ったり、ログを分析して原因を特定したりできます。

主な機能​

CloudWatch は大きく分けて 4 つの機能で構成されています。

機能概要
メトリクスCPU 使用率やネットワーク転送量などのパフォーマンスデータを時系列で収集・表示する
ログアプリケーションや AWS サービスが出力するログを収集・保存・検索できる
アラームメトリクスが閾値を超えた際に通知や自動アクションを実行する
ダッシュボード複数のメトリクスやログを 1 つの画面にまとめて可視化する

これらの機能を組み合わせることで、インフラとアプリケーション両方の観点から包括的な監視体制を構築できます。

メトリクス​

メトリクスは CloudWatch の中核となる機能です。AWS サービスのパフォーマンスデータを時系列で保存し、グラフとして可視化します。

EC2 や RDS などの AWS サービスは標準メトリクスを自動で送信します。独自のアプリケーション固有のデータを送りたい場合は、カスタムメトリクスとして任意の値を CloudWatch に送信することもできます。

メトリクスは名前空間(Namespace)でグループ化されており、AWS サービスのメトリクスは AWS/EC2 や AWS/RDS のような名前空間に分類されます。各メトリクスはディメンション(Dimension)と呼ばれるキーと値のペアで識別されます。たとえば EC2 のメトリクスはインスタンス ID をディメンションとして持ちます。

項目内容
解像度AWS サービスのデフォルトは 5 分間隔(詳細モニタリング有効時は 1 分間隔、高解像度メトリクスは 1 秒間隔)
保存期間解像度に応じて 3 時間〜15 ヶ月間保存される
無料枠カスタムメトリクス 10 件、API リクエスト 100 万件/月まで無料

CloudWatch Logs​

CloudWatch Logs はアプリケーションや AWS サービスが出力するログを一元管理する機能です。

ログはロググループ(Log Group)という単位で管理され、その中に複数のログストリーム(Log Stream)が存在します。たとえば Lambda 関数では関数ごとにロググループが作成され、実行ごとにログストリームが追加されます。

ログの検索・分析には CloudWatch Logs Insights というクエリ機能を使います。SQL に近い構文でログをフィルタリングや集計できます。たとえばエラーログの件数を時系列で集計したり、特定のリクエスト ID を含むログを絞り込んだりすることができます。

アラーム​

アラームはメトリクスの値を継続的に監視し、設定した条件を満たしたときに通知やアクションを自動実行する機能です。

アラームを設定する際は「閾値(Threshold)」と「評価期間(Evaluation Period)」の 2 つが重要です。閾値はアラームが発火する境界値で、評価期間は何回連続して閾値を超えたらアラーム状態とみなすかを指定します。一時的なスパイクでは発報させたくない場合は評価期間を複数回に設定しましょう。

アラームには 3 つの状態があり、条件を満たすと OK から ALARM に遷移します。

状態意味
OKメトリクスが設定した閾値の範囲内にある
ALARMメトリクスが閾値を超えてアラーム条件を満たしている
INSUFFICIENT_DATAデータ不足でアラームの状態を判断できない

アラーム状態になったとき、Amazon SNS トピックを通じてメールや Slack に通知を送ったり、EC2 インスタンスの停止・再起動などのアクションを実行したりできます。

ダッシュボード​

ダッシュボードは複数のメトリクスやログを 1 つの画面にまとめて可視化する機能です。グラフ・数値・テキストなどのウィジェットを自由に配置でき、複数の AWS サービスや複数のリージョンをまたいだメトリクスも 1 つのダッシュボードにまとめられます。

ウィジェットの配置は JSON で定義します。コンソールで作成した内容もこの JSON 形式でエクスポートできるため、同じ構成を別のダッシュボードとして複製したり、コードで管理したりする際に活用できます。

AWS CLI で CloudWatch を使ってみる​

AWS CLI を使ってメトリクスの確認とアラームの作成・削除を体験してみましょう。

メトリクスを確認する​

EC2 インスタンスの CPU 使用率メトリクスを一覧表示します。--namespace で対象の名前空間、--metric-name でメトリクス名を指定します。

❯ aws cloudwatch list-metrics \
--namespace AWS/EC2 \
--metric-name CPUUtilization
{
"Metrics": [
{
"Namespace": "AWS/EC2",
"MetricName": "CPUUtilization",
"Dimensions": [
{
"Name": "InstanceId",
"Value": "i-0a1b2c3d4e5f67890"
}
]
}
]
}

メトリクスの統計値を取得する​

直近 1 時間の CPU 使用率の平均値を 5 分間隔で取得します。--start-time と --end-time で期間を、--period で集計間隔(秒)を指定します。

❯ aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 \
--metric-name CPUUtilization \
--dimensions Name=InstanceId,Value=i-0a1b2c3d4e5f67890 \
--start-time 2026-04-25T01:30:00Z \
--end-time 2026-04-25T02:30:00Z \
--period 300 \
--statistics Average
{
"Label": "CPUUtilization",
"Datapoints": [
{
"Timestamp": "2026-04-25T11:00:00+09:00",
"Average": 0.2966666666666667,
"Unit": "Percent"
},
{
"Timestamp": "2026-04-25T10:55:00+09:00",
"Average": 0.2502405052421769,
"Unit": "Percent"
}
]
}

アラームを作成する​

CPU 使用率が 80% を超えたときにアラーム状態になる設定をします。--alarm-actions に SNS トピックの ARN を指定することで通知を送ることができます。

❯ aws cloudwatch put-metric-alarm \
--alarm-name high-cpu-alarm \
--metric-name CPUUtilization \
--namespace AWS/EC2 \
--dimensions Name=InstanceId,Value=i-0a1b2c3d4e5f67890 \
--statistic Average \
--period 300 \
--evaluation-periods 2 \
--threshold 80 \
--comparison-operator GreaterThanOrEqualToThreshold \
--alarm-actions arn:aws:sns:ap-northeast-1:123456789012:exrecord-topic

アラームの状態を確認する​

作成したアラームの現在の状態を確認します。StateValue が OK であればメトリクスは正常範囲内です。ALARM になっている場合は閾値を超えていることを意味します。

実行結果
❯ aws cloudwatch describe-alarms --alarm-names high-cpu-alarm
{
"MetricAlarms": [
{
"AlarmName": "high-cpu-alarm",
"AlarmArn": "arn:aws:cloudwatch:ap-northeast-1:123456789012:alarm:high-cpu-alarm",
"AlarmConfigurationUpdatedTimestamp": "2026-04-25T11:13:07.691000+09:00",
"ActionsEnabled": true,
"OKActions": [],
"AlarmActions": [
"arn:aws:sns:ap-northeast-1:123456789012:exrecord-topic"
],
"InsufficientDataActions": [],
"StateValue": "OK",
"StateReason": "Threshold Crossed: 2 datapoints [0.3124812407599757 (25/04/26 02:09:00), 0.3033163083601058 (25/04/26 02:04:00)] were not greater than or equal to the threshold (80.0).",
"StateReasonData": "{\"version\":\"1.0\",\"queryDate\":\"2026-04-25T02:14:13.262+0000\",\"startDate\":\"2026-04-25T02:04:00.000+0000\",\"statistic\":\"Average\",\"period\":300,\"recentDatapoints\":[0.3033163083601058,0.3124812407599757],\"threshold\":80.0,\"evaluatedDatapoints\":[{\"timestamp\":\"2026-04-25T02:09:00.000+0000\",\"sampleCount\":4.0,\"value\":0.3124812407599757}]}",
"StateUpdatedTimestamp": "2026-04-25T11:14:13.263000+09:00",
"MetricName": "CPUUtilization",
"Namespace": "AWS/EC2",
"Statistic": "Average",
"Dimensions": [
{
"Name": "InstanceId",
"Value": "i-0a1b2c3d4e5f67890"
}
],
"Period": 300,
"EvaluationPeriods": 2,
"Threshold": 80.0,
"ComparisonOperator": "GreaterThanOrEqualToThreshold",
"StateTransitionedTimestamp": "2026-04-25T11:14:13.263000+09:00"
}
],
"CompositeAlarms": []
}

アラームを削除する​

不要になったアラームを削除します。アラームを削除してもメトリクスのデータ自体は残るため、データへの影響はないです。

❯ aws cloudwatch delete-alarms --alarm-names high-cpu-alarm

ログを検索する(Logs Insights)​

CloudWatch Logs Insights でログを検索します。クエリの実行は非同期で、まずクエリを開始してクエリ ID を取得し、そのクエリ ID を使って結果を取得する 2 段階の操作になります。--start-time・--end-time は Unix タイムスタンプ(エポック秒)で指定します。

❯ aws logs start-query \
--log-group-name /aws/lambda/exrecord-hello \
--start-time 1745500200 \
--end-time 1745503800 \
--query-string 'fields @timestamp, @message | filter @message like /ERROR/'
{
"queryId": "0a1b2c3d-4e5f-6789-abcd-0a1b2c3d4e5f"
}

クエリの実行には数秒かかるため、少し待ってから queryId を使って結果を取得します。

❯ aws logs get-query-results --query-id 0a1b2c3d-4e5f-6789-abcd-0a1b2c3d4e5f
{
"results": [],
"status": "Complete"
}

status が Complete になっていれば、クエリの実行が完了しています。results が空配列の場合は、条件に一致するログが見つからなかったことを意味します。

ダッシュボードを作成する​

ウィジェットの配置を JSON で定義し、ダッシュボードを作成します。ここでは EC2 の CPU 使用率をグラフとして表示するシンプルなダッシュボードを作成します。

❯ cat > dashboard-body.json << 'EOF'
{
"widgets": [
{
"type": "metric",
"x": 0,
"y": 0,
"width": 12,
"height": 6,
"properties": {
"metrics": [
["AWS/EC2", "CPUUtilization", "InstanceId", "i-0a1b2c3d4e5f67890"]
],
"period": 300,
"stat": "Average",
"region": "ap-northeast-1",
"title": "EC2 CPU Utilization"
}
}
]
}
EOF
❯ aws cloudwatch put-dashboard \
--dashboard-name exrecord-dashboard \
--dashboard-body file://dashboard-body.json
{
"DashboardValidationMessages": []
}

DashboardValidationMessages が空配列であれば、JSON の構文やウィジェット定義に問題ないことを意味します。作成したダッシュボードの内容は get-dashboard で確認できます。

❯ aws cloudwatch get-dashboard --dashboard-name exrecord-dashboard
{
"DashboardName": "exrecord-dashboard",
"DashboardArn": "arn:aws:cloudwatch::123456789012:dashboard/exrecord-dashboard",
"DashboardBody": "{\"widgets\":[{\"type\":\"metric\",\"x\":0,\"y\":0,\"width\":12,\"height\":6,\"properties\":{\"metrics\":[[\"AWS/EC2\",\"CPUUtilization\",\"InstanceId\",\"i-0a1b2c3d4e5f67890\"]],\"period\":300,\"stat\":\"Average\",\"region\":\"ap-northeast-1\",\"title\":\"EC2 CPU Utilization\"}}]}"
}

不要になったダッシュボードは削除しましょう。

❯ aws cloudwatch delete-dashboards --dashboard-names exrecord-dashboard

まとめ​

Amazon CloudWatch の基本概念と AWS CLI を使った監視設定の手順について説明しました。AWS 上でシステムを運用するなら、以下のポイントを押さえて監視体制を整えましょう。

  • Amazon CloudWatch は AWS リソースとアプリケーションの監視・オブザーバビリティをまとめて扱えるマネージドサービス
  • メトリクスで CPU やネットワークなどのパフォーマンスデータを時系列に収集・可視化できる
  • CloudWatch Logs でアプリケーションや AWS サービスのログを一元管理でき、Logs Insights でクエリ分析も可能
  • アラームでメトリクスの閾値を監視し、条件達成時に SNS 通知や EC2 操作などのアクションを自動実行できる
  • ダッシュボードで複数のメトリクスやログを 1 つの画面にまとめて可視化できる