AWSの障害イベントをZabbixに通知する方法について

こんにちは、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のログ監視機能で障害を検知し、障害通知メールを通知します。

CloudWatchのZabbix監視連携イメージ図

 

 

環境設定について

■Zabbixマネージャサーバ側の設定

以下のパッケージをインストールする

パッケージ名 用途
python3.8 AWS CLI前提パッケージ
aws cli v3 CloudWatch、RDSサブスクリプションのデータ取得
jq json形式整形ツール

Zabbixマネージャインスタンスに以下のロールを付与する。

ReadOnlyAccess(既存)

■CloudWatchの設定

1.監視対象のCloudWatchアラーム毎に、メトリックト条件の設定を行う。

CloudWatchアラーム設定

2.CloudWatchイベントルールの設定を行う。

  ①カスタムイベントパターンを定義しイベント発生時に、Zabbixにログ通知させるスクリプトを実行される。

    【CloudWatch監視の場合】

“CloudWatch Alarm State Change”を定義し、「アラーム状態」に変更時に、CloudWatchアラームを通知するスクリプトをZabbixマネージャサーバで実行される。

イベントソース設定(Clowdwatch)

 

 

 

 

 

【RDSサブスクリプション監視の場合】

“notification”、”availability”、”failure”のイベントを定義し、RDSのイベント発生時に、RDSの障害を通知するスクリプトをZabbixマネージャサーバで実行させる。

イベントルール設定(RDSサブスクリプション)

 

 

 

 

 

 

 

➁ターゲット欄には、以下画像の設定内容を参考にて登録する。

ターゲット値 : ZabbixマネージャのInstance IDを指定

Commands : Zabbixマネージャで実行させるスクリプトのパス情報を指定<CloudWatch通知用、RDSサブスクリプション用>

Cloudwatchターゲット設定

 

 

 

 

 

監視スクリプトについて

■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以上の場合は、新規アラートとしてログ出力処理と、前回ログに上書き出力します。 

ログ出力イメージ

Cloudwatch出力ログイメージ

 

 

 

 

 

 

 

■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 

ログ出力イメージ

RDSサブスクリプションログ出力イメージ

 

 

 

最後に

CloudwatchイベントアラームをZabbixに連携する方法は「ZabbixのLLD(ローディスカバリー)機能」を利用した方式に関して、幾つか情報がありましたが、監視対象、各監視メトリックを含めた総数が数百となり、EC2で稼働するZabbixサーバの負荷を考慮し、今回のログ監視方式となりました。

実行させるスクリプトコードについて概要のみの記載となりましたが、ロジックは単純なため監視スクリプト概要を参照して作成可能なレベルと思いますので、頑張ってください。

最後までお読みいただきありがとうございました、少しでも皆様のお役に立てたら幸いです。

 

タイトルとURLをコピーしました