こんにちは、SCSKの加古です。
アマゾン ウェブ サービス(AWS)上のサービスを監視する方法として、Amazon CloudWatchを使用した障害監視することが一般的ですが、オンプレミス環境で構築したノウハウや使い慣れた障害監視ツールを使用されたいと言ったご要件をお客様から頂きます。
今回はAWSで構築したサービスの障害を、Zabbixで検知させる方法についてご紹介します。
AWSの障害対象サービス
Amazon CloudWatchアラーム、RDSサブスクリプションは設定により、全て障害検知可能と思います。
某プロジェクトで検知対象としてサービス一覧となります。
■RDSサブスクリプション
Category | Description |
availability | The DB instance restarted. |
availability | DB instance shutdown. |
availability | An error has occurred while restarting MySQL. |
■CloudWatchイベント
AWSサービス | メトリク名 | 説明 |
EC2 | StatusCheckFailed | インスタンス・システムステータスチェックの結果 |
CPUUtilization | CPU使用率 | |
RDS | CPUUtilization | CPU使用率 |
DiskQueueDepth | ディスクI/Oキュー数 | |
SwapUsage | スワップ使用量 | |
ReadLatency | 読み込みレイテンシ | |
WriteLatency | 書き込みレイテンシ | |
ReadThroughput | 読み込みスループット | |
WriteThroughput | 書き込みスループット | |
FreeableMemory | 空きメモリ量 | |
FreeStorageSpace | 空きディスクスペース量 | |
ReadIOPS | 読み込みIOPS | |
WriteIOPS | 書き込みIOPS | |
ELB | UnHealthyHostCount | 異常ターゲット数 |
HTTPCode_ELB_4XX_Count | 4xx系(クライアントエラー)HTTPレスポンスコード数 | |
HTTPCode_ELB_5XX_Count | 5xx系(サーバエラー)HTTPレスポンスコード数 | |
HTTPCode_Target_3XX_Count | 3xx(ユーザアクション)系のHTTPレスポンスコードの数(Target) | |
HTTPCode_Target_4XX_Count | 4xx(クライアントエラー)系のHTTPレスポンスコードの数(Target) | |
S3 | 4xx Errors | HTTP 4xx クライアント エラー ステータス コード要求数 |
5xx Errors | HTTP 5xx クライアント エラー ステータス コード要求数 | |
FSx | FreeStorageCapacity | 使用可能なストレージ容量 |
DirectConnect | ConnectionState | 接続状態 |
WAF | BlockedRequests | ブロックされたウェブリクエストの数 |
Zabbixサーバヘの障害連携について
■監視方法の概要
①CloudWatch、RDSサブスクリプションで検知したアラートを、CloudwachイベントルールをトリガーにしてZabbix連携スクリプトを起動します。
➁対象アラートは、監視用スクリプトを実行してZabbixサーバでログ監視に必要な文字列をログを出力します。
監視対象ログファイルは、Zabbixサーバ自身のローカルDISKに出力します。
➂Zabbixのログ監視機能で障害を検知し、障害通知メールを通知します。
環境設定について
■Zabbixマネージャサーバ側の設定
以下のパッケージをインストールする
パッケージ名 | 用途 |
python3.8 | AWS CLI前提パッケージ |
aws cli v3 | CloudWatch、RDSサブスクリプションのデータ取得 |
jq | json形式整形ツール |
Zabbixマネージャインスタンスに以下のロールを付与する。
ReadOnlyAccess(既存)
■CloudWatchの設定
1.監視対象のCloudWatchアラーム毎に、メトリックト条件の設定を行う。
2.CloudWatchイベントルールの設定を行う。
①カスタムイベントパターンを定義しイベント発生時に、Zabbixにログ通知させるスクリプトを実行される。
【CloudWatch監視の場合】
“CloudWatch Alarm State Change”を定義し、「アラーム状態」に変更時に、CloudWatchアラームを通知するスクリプトをZabbixマネージャサーバで実行される。
【RDSサブスクリプション監視の場合】
“notification”、”availability”、”failure”のイベントを定義し、RDSのイベント発生時に、RDSの障害を通知するスクリプトをZabbixマネージャサーバで実行させる。
➁ターゲット欄には、以下画像の設定内容を参考にて登録する。
ターゲット値 : ZabbixマネージャのInstance IDを指定
Commands : Zabbixマネージャで実行させるスクリプトのパス情報を指定<CloudWatch通知用、RDSサブスクリプション用>
監視スクリプトについて
■Cloudwatch監視用スクリプトの概要
Cloudwatchイベントの重複したアラートを検知・除外させるため、3種類のログファイルを作成しています。 # Zabbixログ監視 累積ファイル # 前回アラートログ # 最新のアラートログ # 最新のアラート取得 最新のアラートログを「cloudwatch describe-alarms」コマンドで取得し最新アラートログとして保存します。 aws cloudwatch describe-alarms --state-value ALARM --output json | jq '.MetricAlarms | map({"AlarmName": .AlarmName, "StateUpdatedTimestamp": .StateUpdatedTimestamp})' > /cloudwatch-log/logs/aws_alams_check.tmp2 前回アラートと最新アラートを「diffコマンド」で比較し、変更行から重複アラートの有無を判断し変更行を変数にセットします。 変更行が1以上の場合は、新規アラートとしてログ出力処理と、前回ログに上書き出力します。
ログ出力イメージ
■RDSサブスクリプション監視用スクリプト
・RDSの過去1分間のイベントを取得し、結果が0以外であれば、Zabboxのログ監視ファイルにイベント内容を出力します。 ・出力するイベントは「event-categories availability」を設定し、「RDSの停止、再起動」のイベントに絞ります。 aws rds describe-events \ --duration 1 \ --event-categories availability \ --source-type db-instance \ --output text | grep EVENTS
ログ出力イメージ
最後に
CloudwatchイベントアラームをZabbixに連携する方法は「ZabbixのLLD(ローディスカバリー)機能」を利用した方式に関して、幾つか情報がありましたが、監視対象、各監視メトリックを含めた総数が数百となり、EC2で稼働するZabbixサーバの負荷を考慮し、今回のログ監視方式となりました。
実行させるスクリプトコードについて概要のみの記載となりましたが、ロジックは単純なため監視スクリプト概要を参照して作成可能なレベルと思いますので、頑張ってください。
最後までお読みいただきありがとうございました、少しでも皆様のお役に立てたら幸いです。