こんにちは新卒インフラエンジニアです.
新規事業のインフラ・監視の設計・構築・運用を主にやっております.
さて,弊プロダクトでは,システムに何か異常が起こると監視サービスからslackへ通知が飛んできます.
しかしなんかまぁ…「味気ないな…派手さが欲しいな…」と思いまして,アラート時に警告灯が光るようラズパイで組んでみました.
本記事はその実装手順です.色々端折ってますがご容赦ください.
(実装は自己責任でお願いします.電子パーツ,特に電源の取り扱いにはご注意ください)
完成イメージ
監視サービス → slack → nginx+php-fpm → 警告灯
slackにアラートが通知されるとランプが点灯し,復旧などが通知されると消灯します.
(以下の動画では手打ちでslackに投稿しています)
手順
- 準備(パーツ購入)
- 配線(後日上げます,すいません)
- ラズパイ設定(webサーバセットアップ,ページ配置)
- slackのOutgoing Webhooks設定
- ルータのポートフォワーディング設定
を行います.
- ラズパイの開封~初回起動~ネット疎通
- slackアカウント作成
など前提部分は本記事では取り扱いません.
raspberry piやnginxを少しでも触ったことある人向けに書いているので,端折ってる部分あります.
準備
以下を購入しておきます.サブ項目は私が使用したものです.
- Raspberry Pi(GPIOピンが使いたいだけなのでモデルはどれでもよいです)
- 警告灯(今回は12V駆動のものを使います)
- 電源(購入した警告灯の定格に従いましょう)
- http://akizukidenshi.com/catalog/g/gM-01804
- プラグが邪魔な場合は切ってください
- リレー(ラズパイで動かしたいのでトリガー電圧が5Vのものを使います)
この他,Raspberry Piを動かすためにmicroSDカードやLANケーブルなど要りますが,本記事では割愛します.
配線
購入したパーツによりますが,今回は以下のように配線しました.
(力尽きたので後日上げます)
ラズパイセットアップ
- raspbianを使っています.
- 初回起動の方はインターネットにつなげるところまで設定を進めてください.
1. GPIOの操作をよしなにやるためにWiringPiというユーティリティをインストールします.
$ sudo apt-get install wiringpi
2. 確認
ラズパイ上でgpio -v
と叩いて,バージョン情報など表示されればインストールできています.
$ gpio -v
gpio version: 2.46
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty
Raspberry Pi Details:
Type: Pi 3, Revision: 02, Memory: 1024MB, Maker: Sony
* Device tree is enabled.
*--> Raspberry Pi 3 Model B Rev 1.2
* This Raspberry Pi supports user-level GPIO access.
nginxセットアップとページ実装
1. nginxとphp-fpmをインストールします.
$ sudo apt-get install nginx php-fpm
2. nginxのconfigをいじって,php-fpmを使えるようにしておきます.
/etc/nginx/sites-available/default
のlocation ~\.php$
部分のコメントを外し,index
にindex.php
を指定します.
ドキュメントルートは/var/www/html
です.
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.php;
server_name _;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}
}
3. 以下のコードをindex.php
という名前で保存し,上記で指定したドキュメントルートに置いておきます.
(今回は/var/www/html/
)
<?php
exec("gpio -g mode 2 out");
if (strpos($_POST["text"], "Triggered") !== false){
exec("gpio -g write 2 1");
}else{
exec("gpio -g write 2 0");
}
コード解説
`gpio -g mode 2 out`: 2番ピンを出力モードに設定 `strpos($_POST["text"], "Triggered")`: bodyに含まれる"text"部分を抽出,その内容が"Trigger"という文字列を含むかどうかboolで返す `gpio -g write 2 1`: 2番ピンの値を1にする4. nginxを再起動します.
sudo service nginx restart
sudo service php-fpm restart
5. 動作確認
ラズパイ上でcurl -X POST -d "text=Trigger" localhost
と打ってみて,ライトが光ればOKです.
(光らない場合は記事最下部のトラブルシュートをみてください…)
ポートフォワーディング
- SlackのOutgoing Webhooksを使うために,ルータの適当なポートに穴あけしておいて,LAN外からラズパイへアクセスできるようしておきます.
- ルータによって設定方法が異なるため本記事では説明しませんが,
<ルータの型番> ポートフォワード
で検索すると設定方法が見つかるかと思います.
Slackの設定
- Outgoing Webhooksを使います.
- これを使うと,「特定のチャンネルに特定キーワードがポストされると,指定したURLへリクエストが送信される」という挙動が実現できます.
1. Outgoing Webhooksの設定ページまで移動します。
https://<ワークスペース名>.slack.com/apps/manage/custom-integrations
画面上部の検索窓に「Outgoing Webhooks」と入力してアプリケーションのページへ移動します
2. Add Configurationより構成を追加します
- 下記赤枠部分が必須ですので、埋めてください.
- Channel: 投稿を監視するチャネルを指定します.
- Trigger Word(s): アラート通知に含まれる文言など入力しておきます.「,」 区切りで複数選択できます。
- URL(s): ラズパイ上で
curl inet-ip.info
を叩いて返ってくるIPアドレスとポートフォワーディングの設定をしたポート番号を入力します.- (9999番を使う例:
123.45.67.89:9999
)
- (9999番を使う例:
- 上記入力後、Save Settingsを押します.
設定したチャネルに以下のようなメッセージがポストされていればOutgoing Webhooksの設定は完了です。
動作確認
outgoing webhooksにて設定したchannelで,トリガーの文言を投げてみましょう.
光ったり消えたりしたら成功です.
動かないときは
- webサーバ,コードの動作状況確認
-
sudo service nginx status
,sudo service php-fpm status
php /var/www/html/index.php
-
/sys/class/gpio/gpio2/value
のファイルパーミッション確認 - など試してみましょう.
-
- 配線の確認
- ちゃんとコンセントにさしていますか?
- outgoing webhooksの設定確認
- トリガーの文言typoしていませんか?
- ポートフォワーディングの設定確認
- ラズパイ上で
curl -X POST -d "text=トリガーの文言" localhost
を叩くと切り分けできるかと思います.
- ラズパイ上で
などみてみましょう.
最後に
- 派手でいいね!
- 安上りでいいね!(パトライト,電源,リレーで2000円ちょい程度)
- 先駆者様のおかげで思ったより簡単に実装できた!(実装1時間程度)