ハードウェアからサーバ・アプリまでワンストップで開発

前回Zabbixサーバーを構築したエントリーを書きました。
Raspberry Pi(reTerminal)にZabbix6.4 をインストールする

その後、監視対象のサーバーやサービスを順次登録して、ダッシュボードもいい感じになってきました。

障害発生アラートもメールで来るよう設定済みです。

ただ、メールは受信者が気付くまでに時間がかかるという問題があります。外出したり、帰宅してしまうとそのアラートに気付くことはできません。
できれば、スマートフォンに通知が届くぐらいのものにしたいです。

スマートフォンへの通知方法はいろいろと考えられますが、今回はSMSを採用しました。

通知方法

Zabbixで通知に使えるメディアはたくさんあります。
DiscodeやSlack等も利用でき、これらサービスを常時使用していればとても便利そうです。

しかし、どれも社内的には使用頻度の低いものばかりで、導入にはZabbixアラートを受け取るためにアプリをインストールするみたいなことになるのでどれも躊躇してしまいます。

結局、特定のサービスがなくても通知できるという点でSMSを使うことにしました。
SMSのデメリットは1通ごとに料金が発生することです。これは仕方のないことなので緊急性の高いアラートや対象者に絞って設定していきます。

というか、緊急性が高くないアラートが帰宅後に届くことは人間にも良くないのでちょうどよいのかもしれません。

Amazon SNS

SMS送信プロバイダもいろいろありますが、今回はAmazon SNSを使います。
AWSアカウントは既に持っていることと、月間100万リクエストまで無料※というのに釣られて選んでみました。

※SMS送信料はかかります。

Amazon SNS

SMS通知の全体図

Zabbixが特定の問題を捕捉したら、Amazon SNSに問題の概要を送って、Amazon SNSから登録した端末にSMSが届くようにします。

構築の流れ

Zabbix サーバーは構成済み、監視対象のホスト、監視アイテム、トリガー等は登録済みのものとして進めます。

1.[AWS]Amazon SNSの設定
2.[AWS]AWS CLIの設定
3.[Zabbixサーバー]AWS CLIのインストール、設定
4.[Zabbixサーバー]Zabbixスクリプトの作成
5.[Zabbix]メディアの追加
6.[Zabbix]ユーザーのメディアにSMSを追加
7.[Zabbix]アクションの通知対象を追加
8.テスト

1.[AWS]Amazon SNSの設定

Amazon SNSで、SMSを送信するには「トピック」と「サブスクリプション」の2つを作成します。

Amazon SNS トピックは、通信チャネルとして機能する論理アクセスポイントです。

トピックを使用すると、複数のエンドポイント (AWS Lambda、Amazon SQS、HTTP/S、E メールアドレスなど) をグループにまとめることができます。

Amazon SNS トピックを作成する

サブスクリプションはトピックに来たメッセージを受け取るエンドポイントです。今回の例ではサブスクリプションには通知を受け取りたい端末の電話番号で作成します。

1-1.トピックの作成

AWSコンソールからAmazon SNS>トピックにアクセスします。右上「トピックの作成」をクリック。

トピックの作成では、「タイプ」「名前」「表示名」を設定します。

タイプはSMSを利用するためにスタンダードを選択します。

1-2.サブスクリプションの作成

通知の受信端末を登録していきます。
トピックの作成から、そのまま画面の指示に従えば、一つサブスクリプションが作成できると思います。(キャプチャ等取り忘れました。)スキップした場合や、追加する場合は以下を参考にしてください。

1-2-1.サンドボックスの送信先電話番号の登録

AmazonSNS>Mobile>テキストメッセージング(SMS)にアクセスすると、最初はアカウント情報のステータスが「SMSサンドボックス」になっていると思います。この状態でサブスクリプションを追加するにはサンドボックスの送信先電話番号に通知を受信する端末の電話番号を登録する必要があります。

登録した電話番号をもつ端末に検証コードが届くので、そのコードを入力すれば完了です。

1-2-2.サブスクリプションの作成

AmazonSNS>サブスクリプションにアクセスし、「サブスクリプションの作成」をクリックします。

トピックARN:1.で作成したトピックARN
プロトコル: SMS
エンドポイント:1-2-1.サンドボックスの送信先電話番号の登録で登録した電話番号

1-3.(後ででもよい)通知状況を把握する

一通り必要な設定を完了したあと、あれ?届かないなと思ったときに、使いたくなると思います。

Amazon ANS>テキストメッセージング(SNS)>テキストメッセージングの優先設定で、オプションの「配信ステータスのログ記録」を設定します。

IAMロールは適切なものがあればそれでよいですし、何もなければ「新しいサービスロールの作成」を選択し、「新しいロールの作成」をクリックすることでも作成できます。

1-4.(後ででもよい)クォーターの制限解除/SMSの利用限度額を変更する

テキストメッセージング(SMS)には「アカウントの使用制限」というものがあります。

デフォルトは1USD/月でそれを超えるとSMSの送信に失敗します。この問題に直面しているときは、SMS配信ログに「No quota left for account」(1-3.で配信ステータスのログ記録を設定している場合)とでます。

アカウントの使用制限はAmazon SNS>テキストメッセージング(SNS)>テキストメッセージングの優先設定の編集から変更できますが、設定値はSMSの利用限度額以下でなければなりません。

デフォルト状態だと1USD以上の値には変更できません。

1-4-1.サポートへ依頼

SMSの利用限度額を引き上げるため、サポートへ依頼します。サービスの制限緩和(AWS サポート)

サービスの制限緩和

上限タイプ:SNS Text Messaging

上限タイプ以外の項目はオプションなので、答えられる範囲で記入していきます。

[リクエスト]

リージョン:利用するリージョンを指定
リソースタイプ:一般的な制限事項
上限:SMSの利用限度額(※SMSの利用限度額の算出)を指定

SMSの利用限度額の算出
自身の用途からおよその値を計算します。
[メッセージ数/通知] * [通知送付端末数] * [頻度(回/月)] * [通信料/メッセージ] 

■1回の通知内容が何メッセージ分か
1メッセージ140バイトでそれ以上のデータサイズになると分割して送付されます。
およその通知1回で送信されるメッセージのバイト数を求めます。そのサイズを140で割った数を1回の通知で送信されるメッセージ数とします。

$ echo -n '(送付メッセージ)'  | wc -c

■通信料
国内利用であれば国内のSMS送信1通にかかる料金を掛けます。
Worldwide SMS Pricing

[ケースの説明]
制限引き上げリクエストのユースケースを記載

待つ
依頼して1日ぐらいで制限解除されました。(なぜか10USDで申請したら100USDにされました。)

1-4-2.アカウント使用制限の設定

Amazon ANS>テキストメッセージング(SNS)>テキストメッセージングの優先設定 の「編集」をクリック。

アカウントの使用制限」を必要な金額に設定して、保存します。

これでSMS送信に再トライして、登録した端末にSMSが届けば完了です。

参考
Amazon SNS で SMS メッセージの使用制限の引き上げをリクエストしています
Amazon SNS の毎月の SMS 使用量割り当ての増加をリクエストする
Amazon SNS で SMS を一定量送信後に、急に送信できなくなった時の対処法
Amazon SNSでSMS送信の使用制限に抵触したので上限を引き上げてみた

2.[AWS]AWS CLIの設定

やり方はいろいろありますが、今回はCLI実行用のアカウントを作りました。

2-1.IAMユーザー作成

AmazonSNSを使うためのポリシーを与えて作成します。

コンソールログインは不要なのでチェックは外しました。

「ポリシーを直接アタッチする」を選択して、「AmazonSNSFullAccess」ポリシーを与えます。

「ユーザーの作成」をクリックしてユーザーを作成します。

2-1.アクセスキーの作成

AWS CLIからAWSを操作するためのアクセスキーを生成します。

IAM>ユーザー>[作成したユーザー名]の「セキュリティ認証情報」をクリック

「アクセスキーを作成」をクリック

「コマンドラインインターフェイス(CLI)」を選択して、確認にチェックを入れます。

アクセスキーを作成します。

生成したアクセスキーとシークレットアクセスキーをメモします。上部にある注意書きにあるように、作成したシークレットアクセスキーはこの時にしかわからないので今のうちにメモしておきます。

3.[Zabbixサーバー]AWS CLIのインストール、設定

Raspberry Pi上で動かすのでLinux ARM版をインストールします。
AWS CLI の最新バージョンを使用してインストールまたは更新を行う(AWS ドキュメント)

3-1.AWS CLIインストール

$ curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install

You can now run: /usr/local/bin/aws --versionと出たら完了です。

3-2.zabbixユーザーのAWS CLI設定

AWS CLIの設定をします。
今回AWS CLIを実行するのはzabbixユーザーなので、zabbixユーザーのAWS CLIの設定を行います。

3-2-1. zabbixユーザーのホームディレクトリを作る

zabbix-agent等が動いているとホームディレクトリの変更に失敗したので、一度サービスを止めてから実行します。

# mkdir /usr/lib/zabbix
# chown zabbix:zabbix /usr/lib/zabbix
# usermod -d /usr/lib/zabbix zabbix

AWS CLI を設定する(AWSドキュメント)
最終的にスクリプトから実行するので環境変数で設定しても良かったかもしれない。

3-2-2. zabbixユーザーのAWS設定

IAMの設定で作成したアクセスキーとシークレットアクセスキーを指定します。AWSのリージョンは「1.Amazon SNSの設定」を行ったときのリージョンと同じにします。

# sudo -u zabbix aws configure
AWS Access Key ID [None]: <IAMで作成したアクセスキー>
AWS Secret Access Key [None]:<IAMで作成したシークレットアクセスキー>
Default region name [None]: <AWSのリージョン>
Default output format [None]: json

3-3.確認

1.Amazon SNSの設定」で作成したトピックにメッセージを流してみます。<TOPIC_ARN>には作成したトピックのARMを指定します。

# sudo -u zabbix aws sns publish --topic-arn <TOPIC_ARN> --subject "test" --message "届いた?"

AWSのサブスクリプションで登録した端末にSMSが届けば成功です

4.[Zabbixサーバー]ZABBIXスクリプトの作成

AWS CLIの動作確認ができたので、ZABBIXで実行するスクリプトを作成します。

4-1.Zabbixのスクリプトパスを調べる

Zabbixが参照するスクリプトパスを調べます。

# zabbix_server --help
usage:
  zabbix_server [-c config-file]
  zabbix_server [-c config-file] -R runtime-option
(省略)
Some configuration parameter default locations:
  AlertScriptsPath                "/usr/local/share/zabbix/alertscripts"
  ExternalScripts                 "/usr/local/share/zabbix/externalscripts"
  SSLCertLocation                 "/usr/local/share/zabbix/ssl/certs"
  SSLKeyLocation                  "/usr/local/share/zabbix/ssl/keys"
  LoadModulePath                  "/usr/local/lib/modules"

結果の「AlertScriptPath」が参照するスクリプトパスです。

4-2.スクリプトの作成

Zabbixから実行するスクリプトを作成します。

# cd <AlertScriptPath>
# vi sns_send.sh

内容

#!/bin/sh

TOPIC_ARN=$1
SUBJECT=$2
MESSAGE=$3

echo "`date` $TOPIC_ARN $SUBJECT" >> /tmp/zabbix-sns.log

if [ "$SUBJECT" = "" -o "$TOPIC_ARN" = "" ]; then
  echo "usage: $0 {ARN SUBJECT MESSAGE}"
  exit 1
fi

if [ "$MESSAGE" = "" ]; then
  MESSAGE=$SUBJECT
fi

aws sns publish --topic-arn $TOPIC_ARN --subject "$SUBJECT" --message "$MESSAGE"

4-3.実行権限の付与

スクリプトが実行できるようにします。

# chmod +x sns_send.sh

4-4.テスト実行

作ったスクリプトを実行してみます。<TOPIC_ARN>にはAWS CLIのテスト実行の時と同じく「1.Amazon SNSの設定」で作成したトピックのARNを指定します。<SUBJECT>や<MESSAGE>は適当にわかりやすいメッセージを入れます。

# sudo -u zabbix ./sns_send.sh <TOPIC_ARN> <SUBJECT> <MESSAGE>

届きました。何度か実行したのでメッセージが実行回数分出ています。

5.[Zabbix]メディアの追加

作成したスクリプトをZabbix上で実行するための設定を行っていきます。まずは、メディア(Zabbixアラートの手段)を追加します。

5-1.メディア追加

Zabbix上で通知>メディアタイプにアクセスします。開いたら「メディアタイプの作成」をクリックします。

4.[Zabbixサーバー]ZABBIXスクリプトの作成」で作成したスクリプトが実行されるようメディアタイプを作成していきます。

名前:SNS-Alert(適当にわかりやすい名前を付ける)
タイプ:スクリプト
スクリプト名:sms_send.sh(4.[Zabbixサーバー]ZABBIXスクリプトの作成で作成したスクリプト名)
スクリプトパラメータ:
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
(スクリプトに渡すパラメータです。1つめのパラメータ({ALERT.SENDTO})は次の「6.[Zabbix]ユーザーのメディアにSMSを追加」で設定されたトピックARNが渡されます。)

説明:(お好みで)
有効:

5-2.メッセージテンプレートを作成

後で行っても良いですが、メッセージのテンプレートを作成しておきます。「メッセージテンプレート」タブをクリックします。

必要な分だけメッセージのテンプレートを用意しておきます。この時のメッセージがSMSの通信料に影響するので、実行しながら妥当なサイズに収まるよう調整します。また、メッセージが長かったり、回数を重ねるとテスト中にSMSが送信されなくなることもあるので注意してください。(「1-4.(後ででもよい)クォーターの制限解除/SMSの利用限度額を変更する」参照)

最後にメディアタイプを保存します。「追加」をクリックします。

6.[Zabbix]ユーザーのメディアにSMSを追加

5.[Zabbix]メディアの追加」で追加したメディアをユーザーに設定します。Amazon SNS上でトピックに対するサブスクリプション(送信先端末)が設定されているので、ここでは通知先のトピックを指定します。通知したい全ユーザーに設定する必要はありません。

ユーザー>[適当な代表ユーザー]のページで「メディア」タブをクリックして、「追加」ボタンでメディアを追加します。

メディアを設定します。

タイプ:SNS-Alert(「5.[Zabbix]メディアの追加」で作成したメディア)
送信先:(トピックARN)(「1.[AWS]Amazon SNSの設定」で作成したトピックのARN)

有効な時間帯:(適当に設定)
指定した深刻度の時使用:(必要に応じて☑)
有効:

7.[Zabbix]アクションの通知対象を追加

アクションの設定に通知方法を追加します。SMS送信したいアクションの「実行内容」の中のメディアに「SNS-Alert(「5.[Zabbix]メディアの追加」で作成したメディア)」が使われるようにします。手元では「すべて」を選択しました。

8.テスト

7.[Zabbix]アクションの通知対象を追加」でSMS-Alertの設定をしたアクションが発動するような事象を発生させます。無事上手くいけばSMSが届くと思います。

なんか上手くいかないときは、スクリプトの実行履歴(/tmp/zabbix-sns.log)やAmazon上のログ(1-3.(後ででもよい)通知状況を把握する)が役に立つと思います。特に、「1-4.(後ででもよい)クォーターの制限解除/SMSの利用限度額を変更する」にはしばらく気づかなくて悩みました。

完了

AWS上の設定が思ったより大変でした。

AWSの設定はよく更新されるので、ご覧いただいたタイミングによっては情報が古くて役に立たないかもしれません。

参考

ZabbixからAmazon SNSを使って通知を飛ばす

最近のエントリー

会計システム「Hieronymus」の現状

OrangePi5にZabbixをインストールする

レビュー等の依頼について

オープンソースのノートアプリ「SiYuan」 - CasaOS AppStoreレビュー

お気に入りの色さがし1

創立記念日

現在の営業品目(2)

現在の営業品目(1)

SPDX License Listをデータ化した

Orange Pi5でC3TR-Adapterを試す

CasaOS上で会計システム「Hieronymus」を動かす

会計システム「Hieronymus」v1.0.0 リリースしました

CasaOSでファイル同期アプリSyncthingをセットアップする

第11回 Freshmeat

オープンソースノーコード「Activepieces」でワークフローを作る

RaspberryPiにパーソナルクラウドOS「CasaOS」を導入する

sequelize-cliでdb:migrateすると「SyntaxError: Unexpected token ':'」が出る

LED行燈の試作(2)

CMSの社内向けサービスのリニューアル

LED行燈の試作(1)