EC2 のログを CloudWatch Logs に集約し Logs Insights で分析する
Amazon CloudWatch Logs は、EC2・Lambda・ECS などのログをリアルタイムで収集・保存・検索できるマネージドサービスです。ログデータを一元管理し、障害調査や監査、パフォーマンス分析に活用できます。
| コンポーネント | 説明 |
|---|---|
| ロググループ | ログの論理的なグループ。保存期間をここで設定する |
| ログストリーム | 同一ソース(EC2 インスタンス等)からのログの流れ |
| CloudWatch Agent | EC2 にインストールして OS・アプリログを CWL へ転送するエージェント |
| Logs Insights | 専用クエリ言語でログを検索・集計・可視化する機能 |
| メトリクスフィルター | ログのパターンを検出してメトリクスに変換し、アラームを設定できる |
EC2 にインストールするデーモンプロセスです。/var/log/nginx/access.log などの任意のファイルをリアルタイムに監視し、CloudWatch Logs へ転送します。SSM Parameter Store に設定を保存して複数サーバーに一括適用することも可能です。
/nginx/access | /nginx/error | /var/log/messages
| リソース | 名前 / 値 | 備考 |
|---|---|---|
| EC2 インスタンス | 既存またはハンズオン用に新規作成 | Amazon Linux 2023 推奨 |
| IAM ロール | handson-cwl-ec2-role | CloudWatch Agent 実行用 |
| ロググループ | /handson/nginx/access など | 保存期間 7 日 |
| メトリクスフィルター | NginxError5xx | HTTP 5xx をカウント |
| CloudWatch アラーム | handson-nginx-5xx-alarm | 5 分で 3 件以上で警告 |
CloudWatch Agent が CloudWatch Logs にログを書き込むための IAM ロールを作成します。
CloudWatchAgentServerPolicy — CloudWatch Logs への書き込み権限AmazonSSMManagedInstanceCore — Session Manager 接続用(SSH 不要にする場合)handson-cwl-ec2-role を選択 → 「IAM ロールを更新」Amazon Linux 2023 では dnf で直接インストールできます。
status: stopped と表示されれば正常にインストールされています(まだ設定前なので stopped は正常)。
以下の設定ファイルを EC2 上に作成します。Nginx のアクセスログ・エラーログと OS のシステムログを収集します。
status: running になれば起動成功です。
/handson/nginx/access、/handson/nginx/error、/handson/system/messages の 3 つが作成されていることを確認/handson/nginx/access をクリック → ログストリーム(インスタンス ID)をクリック → ログイベントを確認running か確認(-a status)ls /var/log/nginx/)sudo cat /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.logCloudWatch Logs Insights は、専用のクエリ言語でログを検索・集計・可視化できます。
/handson/nginx/access を選択fields @timestamp, @message | sort @timestamp desc | limit 20
右上の 「クエリの実行」 をクリックして実行します。
fields @timestamp, @message | parse @message '"* * HTTP/*" * *' as method, path, status, size | stats count(*) as count by status | sort count desc
fields @timestamp, @message | filter @message like / [45][0-9][0-9] / | sort @timestamp desc | limit 50
fields @timestamp | stats count() as requests by bin(5m) | sort @timestamp asc
クエリ実行後、「可視化」タブ をクリックすると棒グラフで表示されます。
| コマンド | 説明 | 例 |
|---|---|---|
fields | 表示するフィールドを指定 | fields @timestamp, @message |
filter | 条件でフィルタリング | filter @message like /ERROR/ |
parse | ログから値を抽出 | parse @message "* * *" as a,b,c |
stats | 集計 | stats count(*) by status |
sort | ソート | sort @timestamp desc |
limit | 件数制限 | limit 100 |
ログに HTTP 5xx エラーが出現したらアラームを発火させる設定を行います。
/handson/nginx/access をクリック[host, ident, authuser, date, request, status=5*, size]
HandsonMetrics → Nginx5xxCount を選択handson-nginx-5xx-alarm → 「アラームの作成」handson-nginx-5xx-alarm を削除NginxError5xx を削除/handson/nginx/access・/handson/nginx/error・/handson/system/messages を削除sudo systemctl stop amazon-cloudwatch-agenthandson-cwl-ec2-role を削除(EC2 からデタッチ後)