Partner SA 酒徳です。2017年最初のやってみようシリーズ投稿は、去年一年通し反響の大きかったZabbixをテーマに、第6回目の投稿になりです。本日はTIS安達様にご紹介頂きます。
TIS株式会社の安達です。TISから提供しているTISエンタープライズOSSサポートサービスの取り組みの一環として行っているAWSとZabbixの効果的な連携検証の結果を連載にてご紹介しています。最後となる第6回ではAWS Lambdaとの連携をご紹介します。
AWS ○○×Zabbixによる運用管理の効率化
第1回~第5回までにご紹介した内容により、Cloud WatchやAuto Scaling等とZabbixを連携させることで様々な情報をZabbix上に集約し、監視の一元化や監視設定の自動化等を行えるようになりました。しかし実際の運用では監視しているだけではなく、監視結果に応じた何らかの作業を手動で行う必要があります。
作業には、
①一定のルールに従った人手を必要としない自動化可能な作業
②人による判断を必要とする自動化が難しい作業
の2種類が存在します。
そこで、本記事では①の自動化及び②を効率化するための方法についてご紹介します。
AWS Lambda×Zabbix連携の紹介・特徴
AWS Lambda(以下、Lambdaと呼称する)は他のAWSサービスや任意の外部サービスからのLambda APIの呼び出しをトリガーとし、サーバーレスにプログラムを実行するためのイベント駆動型のサービスです。Lambdaを組み合わせることにより、下記のようなサービスを実現することもできます。
Lambdaの応用例:
・AWS S3へのファイルのアップロードをトリガーとしてLambdaを呼び出し、アップロードされたファイルを別システムに送信する
LambdaとZabbixを連携させた例として、Zabbixの監視結果またはユーザからの手動操作をトリガーとしてLambda functionを呼び出し、Lambdaから任意の処理(AWS/外部サービスへの連携やある特定の処理)を実行させる方法をご紹介します。LambdaとZabbixを連携させることにより、監視結果に応じた作業を自動化させたり、AWSコンソールを開くことなくZabbix上でEC2インスタンス等の操作が可能になります。さらにこれまでの第1回から第5回までにご紹介した内容を組み合わせることで、より幅広い情報にもとづいた作業の自動化が可能になります。
AWS Lambda連携とZabbix単体との比較
Zabbixにはアクションと呼ばれる、監視結果にもとづいてZabbixサーバやエージェント上で任意のスクリプトを実行する機能があります。この機能を使うことで監視結果にもとづいた各種AWSサービスとの連携を実現することができます。Zabbixのアクション機能をLambdaと連携させることで下記のようなメリットがあります。
・実行権限の管理
ZabbixとAWSの各サービスを直接連携させる場合には、サービスを外部から実行させるための権限を付与する必要があります。そこでLambdaと連携させることにより、Lambda APIを呼び出す権限を付与するだけで済むようになるため、設定の手間やセキュリティ上のリスクを軽減できます。
・コードの集約管理
実行する処理を全てLambdaに集約することができるため、コードの管理が楽になります。また既にLambdaを使っている場合には、Zabbixから既存のLambda functionを呼び出すように設定することで、大きな変更をすることなくZabbixの監視結果と既存のLambda functionの呼び出しを紐付けできます。
・Zabbixサーバ/エージェントの負荷軽減
実際のサービスの操作はLambda上で実行されるため、スクリプトによるZabbixサーバ/エージェントへの負荷を軽減できます。
連携方法の概要
冒頭でも述べた通り、LambdaとZabbixを連携させる方法には2種類存在します。
①Zabbixのアクション機能を用いて連携スクリプトを実行する
②Zabbixの管理画面上から手動で連携スクリプトを実行する
最初にZabbixに対して、連携スクリプトを自動もしくは手動で呼び出せるようにするための設定をしておく必要があります。連携スクリプトからLambda APIの呼び出しに必要な認証情報、function名及び操作内容を引数としてLambda APIに渡すことで、Lambda functionを実行することができます。具体的な設定手順については、後述の「Lambdaと連携スクリプトの設定手順」をご参照ください。また連携スクリプト及びLambda上で使用しているAPIの詳細については下記URLをご覧ください。
【boto3】
・https://boto3.readthedocs.io/en/latest/
今回は簡単な例として、ZabbixからLambdaを経由してEC2インスタンスを起動/停止させるための方法についてご紹介します。この方法を用いることでZabbixの管理画面上からの実行や、ある障害イベントを検知した際のアクションで自動的にEC2の起動/停止が可能になります。
動作環境
本連携スクリプトは、以下の環境で動作確認済みです。
* CentOS7.2 もしくは Amazon Linux 2016.03
* Python 2.7 (CentOS: 2.7.8, Amazon Linux 2016.03: 2.7.10)
* boto3 - 1.3.1
* Zabbix2.2系および3.0系
Lambdaと連携スクリプトの設定手順
1 EC2操作ロールの作成
最初に、Lambdaに登録するスクリプトからAWSのサービスを操作するための
IAMロールを作成する必要があります。
今回はEC2インスタンスの起動/停止及びインスタンス情報の読み取りを行うため、
「StartInstances」と「StopInstances」の実行権限及び「AmazonEC2ReadOnlyAccess」ポリシーを割り当てたロールを作成します。
2 Lambdaの設定
2.1 スクリプトのダウンロード
下記URLからLambda上で実行するスクリプトをダウンロードします。
ダウンロードしたスクリプトは、スクリプト実行時にパラメータとして指定したEC2インスタンスの起動/停止をさせることができます。このスクリプトでは、EC2インスタンスの状態を確認後に起動/停止を実施し、正常に実行が完了した場合には”Succeed”を、そうでない場合には”Failed”をメッセージとしてZabbix側に返します。
2.2 functionの作成
Zabbixから呼び出した際に実行するLambdaのfunctionを作成します。
今回の例ではダウンロードしたスクリプトを使用しますが、Lambdaに登録している任意の処理を実行させることができます。
Lambdaを下記のような設定とします。
設定項目 |
設定内容 |
Runtime |
Python2.7 |
Handler(function名) |
任意 |
Role |
Choose an existing role |
Existing role |
1 で作成したロール |
Code |
Edit code inline ダウンロードしたスクリプトを貼り付けます |
3 Lambda実行ユーザの作成と設定
3.1 IAMユーザの作成
ZabbixからLambda APIを呼び出すためのIAMユーザを作成します。
AWSの外部からLambda APIの呼び出しを行うためには「アクセスキー」と「シークレットキー」が必要です。
そのため、ユーザ生成時に発行される上記2つの情報を控えておいてください。
(ユーザ生成時に発行される”credentials.csv”をダウンロードしておけば問題ありません)
3.2 Lambda実行ポリシーの割り当て
作成したIAMユーザに、2.2で作成したLambda functionの呼び出し権限を与えます。
以上でAWS側の準備は完了になります。
4 Zabbixの設定
ここからはZabbixサーバ側の設定になります。
4.1 ライブラリのインストール
Lambda連携スクリプトを動作させるためには、以下のライブラリをインストールする必要があります。
・boto3 (Python用の公式AWS SDK)
インストールにはpipを使用しますので、pipインストール後、
以下の例のようにインストールを行います。
# pip install boto3
4.2 スクリプトのダウンロードと簡単な使い方
ZabbixからLambda APIを呼び出すためのスクリプトを以下のURLからダウンロードします。
このスクリプトでは、Lambda function呼び出し時に必要となる情報は”-p”オプションを使うことでjson形式のペイロードとして渡せるようになっています。今回の例のようにEC2インスタンスの操作に必要な情報は「インスタンスID」と「操作内容」の2つになりますので、スクリプト実行時のペイロードにこれら2つの情報を引数として渡すことになります。操作内容(operation)には、”start”と”stop”の2つが指定可能です。
例. lambda_zabbix.py -r {$REGION} -a {$ACCESSKEY} -s {$SECRETKEY} -f {$FUNCTIONNAME} -p '{"instance_id":"{$INSTANCE_ID}","operation":"start"}'
4.3 実行方法の違いによるメリット/デメリット
Zabbixから任意のスクリプトを実行する方法には3種類あります。
各々の方法には一長一短があるため、運用の場面に応じて適切な方法を選択してください。
(全ての方法を同時に設定することも可能です)
方法 |
メリット |
デメリット |
アクション実行時のメディアとして使用する |
・トリガー検知時に自動的に実行される ・スクリプトに「送信先」、「件名」、「メッセージ」を引数として渡せる(Zabbix3.0以上は任意の情報を引数として渡せる) ・トリガー復旧時にも実行できる |
Zabbixからスクリプトの実行結果を確認できない |
アクション実行時にリモートコマンドとして実行する |
・トリガー検知時に自動的に実行される ・スクリプトをエージェント/サーバ上から実行できる ・任意の情報を引数として渡せる ・(Zabbix3.2のみ)トリガー復旧時にも実行できる |
Zabbixからスクリプトの実行結果を確認できない |
グローバルスクリプト |
・ユーザの任意のタイミングで実行できる ・Zabbixからスクリプトの実行結果を確認できる |
自動的に実行されない |
4.4 スクリプトの配置
ダウンロードしたスクリプトを実行方法に応じた場所に配置します。
・メディアタイプを使用する場合:
Zabbixサーバのアラートスクリプト用ディレクトリに配置します。
アラートスクリプト用ディレクトリはデフォルトの設定の場合、「/usr/lib/zabbix/alertscripts」となっています。(/etc/zabbix/zabbix_server.conf内のAlertScriptsで指定)
・リモートコマンド/グローバルスクリプトとして使用する場合
Zabbixユーザが参照可能な任意のフォルダに配置します。
今回は例として、「/usr/local/bin/」に配置します。
配置後、zabbixユーザがスクリプトを実行できるための権限を付与します。
# chown zabbix:zabbix lambda_zabbix.py
# chmod u+x lambda_zabbix.py
5 Lambda連携用スクリプトの設定
連携用スクリプトでは、Zabbixのホストマクロを利用しています。
以下に利用するマクロと設定すべき項目について示します。
マクロ名 |
内容 |
{$ACCESSKEY} |
Lambda実行ユーザのアクセスキー |
{$SECRETKEY} |
Lambda実行ユーザのシークレットキー |
{$REGION} |
操作対象のリージョン |
{$FUNCTIONNAME} |
Lambdaのfunction名 |
{$INSTANCE_ID} |
操作するインスタンスのID |
5.1 メディアとして使用する場合
Zabbix2.2と3.0では登録項目が異なりますので、バージョンにあった内容を設定します。
Zabbixの管理画面から「管理」->「メディアタイプ」->「メディアタイプ作成」と辿り、下記の表のとおりにメディアタイプを登録します。
(記載がない項目は任意の値とします)
設定項目 |
設定内容 |
タイプ |
スクリプト |
スクリプト名 |
3.0の場合: lambda_zabbix.py 2.2の場合: lambda_zabbix.py -r {$REGION} -a {$ACCESSKEY} -s {$SECRETKEY} -f {$FUNCTIONNAME} -p '{"instance_id":"{$INSTANCE_ID}","operation":"start"}' |
スクリプトパラメータ(3.0のみ) |
-r {$REGION} -a {$ACCESSKEY} -s {$SECRETKEY} -f {$FUNCTIONNAME} -p '{"instance_id":"{$INSTANCE_ID}","operation":"start"}' |
次に、通知するユーザのメディアタイプに、作成したメディアを登録します。
Zabbixの管理画面から「管理」->「ユーザ」を選択し、通知を行うユーザのメディアに先ほど作成したメディアタイプを追加します。
最後に、作成したメディアを使用するアクションを設定します。
Zabbixの管理画面から「設定」->「アクション」を選択しアクションの設定画面を開き、アクションの実行内容タブの「実行内容のタイプ」には「メッセージの送信」、「次のメディアのみ使用」には直前に作成したメディアタイプを指定します。
5.2 アクションのリモートコマンドとして使用する場合
Zabbixの画面を開き、「設定」->「アクション」->「アクションの作成」と遷移し、
下記の情報を設定します。
設定内容 |
設定内容 |
実行内容のタイプ |
リモートコマンド |
ターゲットリスト |
Zabbixサーバがインストールされているホスト |
タイプ |
カスタムスクリプト |
次で実行 |
Zabbixサーバ |
コマンド |
/usr/local/bin/lambda_zabbix.py -r {$REGION} -a {$ACCESSKEY} -s {$SECRETKEY} -f {$FUNCTIONNAME} -p '{"instance_id":"{$INSTANCE_ID}","operation":"stop"}' |
そしてアクションに紐づいた実行条件が成立すると、下記のように設定したコマンドが実行され、ホストマクロに設定されているEC2インスタンスを自動で停止/起動させることができます。
5.3 グローバルスクリプトとして使用する場合
Zabbixの管理画面から「管理」->「スクリプト」->「スクリプトの作成」と辿り、
以下のような設定を行います。
設定項目 |
設定内容 |
タイプ |
スクリプト |
次で実行 |
Zabbixサーバ |
コマンド |
/usr/local/bin/lambda_zabbix.py -r {$REGION} -a {$ACCESSKEY} -s {$SECRETKEY} -f {$FUNCTIONNAME} -p '{"instance_id":"{$INSTANCE_ID}","operation":"start"}' |
グローバルスクリプトが使える画面(例.「最新データ」->「概要」)の実行先ホストをクリックすると下記のようにコンテキストメニューが表示されますので、その中からグローバルスクリプトが実行できます。
(スクリプト実行時の引数であるoperationを”Start”と”Stop”の2種類に分けて設定した例です)
実行すると、実行結果を表示するウィンドウが下記のように表示されます。
他のAWSサービスへの連携について
今回の例ではEC2インスタンスとの連携になっていますが、Zabbixの連携スクリプトから呼び出すLambda functionを変更することで他のAWSサービスとの連携が可能です。
具体的にはLambda上に他のサービスへ実行したい処理を定義し、そのLambdaのfunction 名をZabbix上のユーザマクロやグローバルスクリプト、リモートコマンドの実行時の引数として渡すことで、状況に応じて呼び出す先のLambda functionを変更することが可能です。
設定上の注意事項
今回の設定では、Lambda操作に必要なAWSアカウントのクレデンシャル情報をマクロで設定しています。クレデンシャル情報がZabbix管理画面上で平文として閲覧可能になるため、複数ユーザによるZabbixの扱いにはご注意ください。
もし連携スクリプトを実行するZabbixサーバがAWS上のインスタンスとして存在する場合には、インスタンスにIAMロールを割り当てることで、スクリプト実行時にクレデンシャル情報を渡すことなく実行できます。その場合には連携スクリプトを呼び出す際に引数として渡されている”-a”と”-s”のオプションを削除する必要があります。
3. まとめ
AWS×Zabbix連載の最後となる今回は、作業の自動化及び作業の効率化を行うための方法として、LambdaとZabbixを連携させるための方法についてご紹介いたしました。
今回ご紹介した例ではZabbixからLambdaを経由してEC2インスタンスの操作を行う方法でしたが、Lambdaから他のAWSサービスを操作できるようにすることで、ZabbixとAWS上の任意のサービスを連携させることが可能になります。またこれまでにご紹介してきた内容を組み合わせることで、課金情報やAuto Scalingされた台数等の各サービス情報を総合的に評価した上での作業の自動化が可能になりますので、ぜひ他の方法と組み合わせてお試しください。
4. 参考情報
・[スクリプト・公開リポジトリ]
https://github.com/tech-sketch/zabbix_aws_template
※ご紹介したスクリプト・テンプレートはすべてオープンソースとして公開しています。自由にご利用・ご活用ください。ご質問やサポートのご用命については以下5.お問い合わせ先よりご連絡をお願いします。
5. お問い合わせ先
本記事に関するお問い合わせは以下までお願いします。
TIS株式会社 OSS推進室
メール: [email protected]
電話: 03-5337-4588
◆『TISエンタープライズOSSサポートサービス』
TISでは本記事での紹介内容等も含め様々なノウハウを駆使したOSSのサポートサービスを提供しています。企業にて安心してOSSをご利用いただけるようにするため、設計や構築のご支援(技術コンサルティングサービス)や運用・保守時のトラブル対応のご支援(プロダクトサポートサービス)を提供しています。本記事にて紹介しているAWSとの連携用の監視テンプレート「AWS監視テンプレート」についても保守サポートおよび拡張開発サービスを提供しています。
http:/www.tis.jp/service_solution/awsxzabbix/
◆マネージドサービス『MOTHER』
TISは、クラウドサービスの活用が本格化した時代にあわせ、AWSなどの
クラウドはもちろん、企業が持つプライベートクラウドやオンプレミスが
組み合わされたマルチプラットフォーム環境の統合管理、障害監視、性能
分析、運用自動化などのマネージドサービス『MOTHER』を提供して
います。
http://www.tis.jp/service_solution/mother/
****
OpsJAWS メインページはこちら。
クラウド運用にご興味ある方は、こちらからOpsJAWSに登録ください。