■はじめに
CloudWatch、SNSトピックを利用してログに特定文字列が出力されたらアラーム発報し、メールを送信するところまで試しに構築してみたので手順をまとめました。
■対象者
本記事はAWS初学者向けの情報共有として構築手順をまとめています。
また、自分用の手順メモでもあります。
■構成図
- EC2からCloudWatch logsへ/var/log/messagesを送信し監視対象とする。
- CloudWatchは"ERROR"文字列を検知した場合、アラーム発報する。
- アラーム発報すると関連付けられたSNSトピックは指定の宛先にメール通知を行う。
■作業内容
大まかに以下。
- EC2にCloudWatchエージェントのインストール
- EC2にCloudWatch logsへログを送信するための権限を付与
- CloudWatchメトリクス作成
- CloudWatchアラーム作成
- 検知、メール送信テスト
■作業手順詳細
1. EC2にCloudWatchエージェントのインストール
1-3. 以下コマンドでawscli.conf編集 [default]タグにregionという項目があるので、us-east-1 から ap-northeast-1 に変更する【awscli.conf編集】
# vi awscli.conf
※cloudwatchエージェントがどのリージョン(のEC2)で動作するのかを設定。今回は東京リージョン。
awslogs.confはどのようなログをCloudWatchに送るかとその方法を指定する 1-4. 以下コマンドでサービス自動起動設定する 1-5. 以下コマンドを実行し、awslogsdを起動【awslogs.conf編集】
変更を加えた場合はCloudWatchエージェントの再起動が必要
デフォルトで/var/log/messagesの記述があるので今回は編集しない。
項目
説明
datetime_fomat
日時のフォーマット指定
file
どのファイルをCloudWatch logsに送るか指定
buffer_duration
送信間隔をミリ秒で指定 もしくは32kbite出力で送信
log_stream_name
どのインスタンスのログかラベルをつけて表示する。 {instance_id}でインスタンスIDの変数が表示される
initial_position
start_of_fileでログの上から読み、end_of_fileでログの下から読む
log_group_name
マネジメントコンソールに表示される名称を指定
# systemctl enable awslogsd
# systemctl start awslogsd
2. EC2にCloudWatch logsへログを送信するための権限を付与
2-7. EC2画面で EC2を選択 - アクション - セキュリティ - IAMロールを変更を選択 2-8. IAMロールに「CloudWatchAgentServerPolicy」と入力し、保存を選択 CloudWatch画面 - ロググループに ロググループ名「/var/log/messages」が表示される また、そのロググループ名「/var/log/messages」を選択 - ログストリームタブをみると awslogs.confのlog_stream_nameとlog_group_nameはここの表示名を指定している。 【補足 ログの保持期間】 これはロググループのログの保持期間。デフォルトでは期限なしで明示的に削除しないと保持される。【IAMロールアタッチ】
ログストリーム名はEC2のインスタンスIDとなっている。
ロググループのカラムに「保持」というものがある。
アクション - 保持設定を編集で変更可能
3. CloudWatchメトリクス作成
3-1. CloudWatch画面でロググループにチェックを入れ、アクション - メトリクスフィルターを作成を押下 3-2. 「パターンを定義」画面 3-3. 「メトリクスの割り当て」画面 ・フィルター名を作成 ・メトリクスの詳細 「保存」押下 3-4. CloudWatch - メトリクス - すべてのメトリクスを選択【ログ メトリクスフィルター作成】
フィルターパターンに ERROR と入力し、Next押下
※フィルターパターンには検知文字列を入力する
項目名
入力値
フィルター名
test_messages_error
項目名
値
説明
メトリクスの名前空間
test_messages_name_space
後述の「メトリクス」画面での表示名
メトリクス名
test_messages_name
後述の「メトリクス」画面での表示名
メトリクス値
1
検知した場合にカウントアップする数値
デフォルト値
未入力
検知していない期間中の値
4. CloudWatchアラーム作成
4-1. CloudWatch - アラーム - すべてのアラームを選択 - 「アラームの作成」押下 4-2. 「メトリクスと条件の指定」画面 4-3. 「メトリクスの選択」画面 4-4. 「メトリクス」画面 ・グラフ ・条件 4-5. 「アクションの設定」画面 ・通知 4-6. 「名前と説明を追加」画面 ・名前と説明 4-7. 「プレビューと作成」画面 「アラームの作成」押下 【補足 SNSトピック新規作成】【メトリクスの指定と監視条件設定】
「メトリクスの選択」押下
カスタム名前空間 test_messages_name_space - ディメンションなしのメトリクス - メトリクス名 test_messages_name にチェックを入れ、「メトリクスの選択」押下
項目
入力値
統計
合計
期間
1分
項目
入力値
しきい値の種類
静的
xxxが次の時
より大きい
xxxよりも
5
項目
入力値
アラーム状態トリガー
アラーム状態
SNSトピックの選択
既存のSNSトピックを選択 ※なければ新しいトピックの作成を選択
通知の送信先
任意のアドレス
項目
入力値
アラーム名
test_message_alarm
アラームの説明
test_message_alarm
新規作成した場合、以下のようなメッセージが出る。
トピック作成時に登録したアドレスに確認メールが送られるので Confirm subscriptionを選択すればよい
5. 検知、メール送信テスト
5-1. EC2にログインし、以下コマンド実行 ※閾値が 「5より大きい」なので、6回以上実行 5-2. アラーム状態が変化し、メールが送信されることを確認 【補足 意図的にログに出力する方法】 【補足 時刻表示の変更】 ※/usr/share/zoneinfo にある国に変更可能 【コマンド実行、メール受信確認】
# logger "ERROR"
以下の方法でも可能
1. CloudWatch - ロググループ - /var/log/messages を押下
CloudWatchの各画面の時刻表示がUTCとなっている
※実行したのは夜だが昼間の時間になっている
◎ログの時刻表示変更
1.EC2にログインし以下を実行する。# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# vi /etc/sysconfig/clock
ZONE="UTC" を ZONE="Asia/Tokyo" に変更
◎グラフの時刻表示の変更
1.以下を選択
2.右上 Local time zone を選択し、時間に表示したい時刻に変更
以上
■おわりに
この記事はAWS初学者を導く体系的な動画学習サービス
「CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com