NAT越えしたい
自分の家に設置したラズパイにsshで入るならしかるべき方法で公開し、公開鍵設定やVPNを張るなどをして入れるとおもいますが、IoTセンサノードとして屋外で使う場合はモバイルルータなどで接続することが多いかもしれません。
モバイルルータが固定IPを持っていてNATトラバーサルできる契約のもありますが、そうでない時も多い。
できるものもオプション扱いでお金が別途かかる。もちろん常用するならIIJモバイルbiz+とかがいいと思いますが、そうでない時の方法です。
エージェントの選定
いろいろ探しました。いいなと思ったのが以下
Pulsewayはちょっとterminalの出来が悪すぎ…。というかそういう用途ではないですね。
Fluentdで端末のパラメータを監視したりするような作業をお手軽にできる感じがいいですね。
ngrokをNode.jsで使う準備
今回はngrokを使いました。超便利。ですが、起動のたびにアドレスとポートが変更されてしまいます。
アドレスを確認する手段の一つとしてSlackに自身のngrokアドレスを投稿させるコードを記述し、Systemdサービスとして登録します。
Node.jsを使います。ラズパイにサクサク入れていきます。
nohupはhupシグナルがngrokプロセスに送られないように使っています。
他にいい方法があれば教えてください。
sudo apt update
sudo apt install nohup
wget http://node-arm.herokuapp.com/node_latest_armhf.deb
sudo dpkg -i node_latest_armhf.deb
2020年2月4日追記:上記の方法ではできなくなりました。下記の方法に修正いたします。sudo npm cache clean
のところでエラーが出ても気にせず続けてしまいましょう。
sudo apt update sudo apt install -y nodejs npm sudo npm cache clean sudo npm install npm n -g sudo n latest mkdir -p ~/node_app/sendslack_ngrok cd !$ nano package.json
ここでpackage.jsonを作っておきます。下記内容で構いません。
{ "name": "sendslack_ngrok", "description": "sendslack_ngrok", "version": "1.2.3", "private": true, "scripts": { "start": "node app.js" } }
保存します。
npm install ngrok node-slack os --save
Ngrokの設定
www.npmjs.com
ngrokは無料で十分使えますが、アカウントを取得しないとトークンがもらえません。(tcp使うのには必須)
サインアップはこちら。
トークンはサインアップ後の画面の③で示されている部分です。赤ワクで囲んだ部分になります。
コピーしておきます。
ラズパイのターミナルで実行しておく。
./node_modules/ngrok/bin/ngrok authtoken this-is-your-ngrok-auth-token
ホームディレクトリに.ngrok2/ngrok.ymlが生成されます。
あとで記述するthis-is-your-ngrok-auth-tokenの部分です。
Slackのアプリ設定
投稿したい専用チャネルを作るか自分へのDMとしたほうがいいでしょう(この記事の最後まで実施すると、起動するたびにSlackへ投稿します。#generalとかに投稿すると結構うざいです)。Slackアプリからは歯車のマーク -> アプリを追加する。Webからは自分のワークスペースにログイン後 https://{your-company-workspace}.slack.com/apps
で「incoming webhook」を検索。
incoming-webhookアプリ設定画面に移行します。
「設定を追加」をクリック
次画面の「チャンネルへの投稿」で投稿したいチャネルを選択または新規作成します。
登録後、生成された「Webhook URL」をコピーしておく。あとで記述するthis-is-your-slack-incoming-webhook-addressの部分です。
webhookコードの記述
さて、準備が整いました。コードを書いていきます
今回はapp.jsというファイルに記述します。
cd ~/node_app/sendslack_ngrok nano app.js
const Slack = require('node-slack'); const ngrok = require('ngrok'); var slack = new Slack(' this-is-your-slack-incoming-webhook-address '); ngrok_connect().then(url => { console.log('URL : ' + url); var message = 'tcp url: ' + url; slack.send({ text: message, username: 'raspibot', icon_emoji: ":poop:" }); }); // ngrokを非同期で起動 async function ngrok_connect() { await ngrok.authtoken(' this-is-your-ngrok-auth-token '); let url = await ngrok.connect({proto:'tcp',port:22}); // このコマンドを実行するのにトークンが必須 return url; }
いったんサービスとして登録する前に動作確認をします
cd ~/node_app/sendslack_ngrok npm start
こんな感じでSlackに投稿できたら成功。
うんこ絵文字が最初から入ってるなんて素敵。
何に使うのかしら。
サービスとして登録する
適当なフォルダでngroksend.serviceというファイルを作ります。
なお下記例ではホームディレクトリが/home/pi/になってます。
cd ~/ nano ngroksend.service
下記を記述します。
[Unit] Description=ngrokSend After=syslog.target [Service] Type=simple WorkingDirectory=/home/pi/node_app/sendslack_ngrok/ ExecStart=/usr/bin/nohup npm start TimeoutStopSec=5 StandardOutput=null [Install] WantedBy = multi-user.target
保存後、systemdに登録します。
sudo mv ngroksend.service /etc/systemd/system/ sudo systemctl start ngroksend.service sudo systemctl enable ngroksend.service
動作が確認できたらsudo rebootしてください。
参考
ngrok - npm
Raspberry Piをngrokで公開する - Part1: Expressをpm2から起動する - Qiita
Raspberry Piでプログラムを自動起動する5種類の方法を比較・解説(記事移動済み)
余談:ラズパイのケース
Raspberry Pi 3b+になってかなり発熱が心配になってきました。
動作させているプロセスにも依存しますが、2月のまだ寒い屋内で(室内気温12,3度)、ヒートシンクを貼ったファンレス状態では
vcgencmd measure_temp temp=70.1'C
となっておりました。夏にお亡くなりになるのが怖く、ファン付きのものをいくつか試すことに。
- Eleduino Raspberry Pi Case
同じプロセスを走らせつつ、このケースを使用して使ったところ
vcgencmd measure_temp temp=49.7'C
と、かなり冷却効果がありました。でもヒートシンクをCPUに貼っている場合剥がさないとファンが干渉します。
で、この上部に貼ってあるRaspberry Piアクリルステッカーのせいで笛吹き現象が起こってうるさかったので剥がしました。剥がしたら1,2度下がったけど誤差なのかは不明
。
- GeeekPi Raspberry Pi3b+ Case
もう一つ。前者のより安価で、すこし背が高い。ヒートシンク付き。ケースに基板を嵌合してからヒートシンクを貼ったほうがいいでしょう。
前者のケースのファンより回転数が高めに思われますが、すごく静か。
1番目のものより個人的には気に入っています。でも高さがあるのでそこは運用方法に合わせて購入でしょうかねぇ。
vcgencmd measure_temp temp=42.0'C
冷却性能も良さげでした。