lynxeyedの電音鍵盤

組み込みとか電装とか

Raspberry Piでngrokのtcpアドレスをslackへ通知する

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

sudo npm install -g n
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使うのには必須)
サインアップはこちら
トークンはサインアップ後の画面の③で島されている部分です。赤ワクで囲んだ部分になります。
f:id:Lynx-EyED:20190410213929p:plain
コピーしておきます。
ラズパイのターミナルで実行しておく。

./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」を検索。
f:id:Lynx-EyED:20190410203156p:plain
incoming-webhookアプリ設定画面に移行します。
「設定を追加」をクリック

f:id:Lynx-EyED:20190410203626p:plain
次画面の「チャンネルへの投稿」で投稿したいチャネルを選択または新規作成します。
登録後、生成された「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に投稿できたら成功。
f:id:Lynx-EyED:20190410205756p:plain
うんこ絵文字が最初から入ってるなんて素敵。
何に使うのかしら。

サービスとして登録する

適当なフォルダで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してください。

余談:ラズパイのケース

Raspberry Pi 3b+になってかなり発熱が心配になってきました。
動作させているプロセスにも依存しますが、2月のまだ寒い屋内で(室内気温12,3度)、ヒートシンクを貼ったファンレス状態では

vcgencmd measure_temp
temp=70.1'C

 
となっておりました。夏にお亡くなりになるのが怖く、ファン付きのものをいくつか試すことに。


同じプロセスを走らせつつ、このケースを使用して使ったところ
f:id:Lynx-EyED:20190410220246j:plain

vcgencmd measure_temp
temp=49.7'C

と、かなり冷却効果がありました。でもヒートシンクをCPUに貼っている場合剥がさないとファンが干渉します。
で、この上部に貼ってあるRaspberry Piアクリルステッカーのせいで笛吹き現象が起こってうるさかったので剥がしました。剥がしたら1,2度下がったけど誤差なのかは不明

  • GeeekPi Raspberry Pi3b+ Case

もう一つ。前者のより安価で、すこし背が高い。ヒートシンク付き。ケースに基板を嵌合してからヒートシンクを貼ったほうがいいでしょう。

前者のケースのファンより回転数が高めに思われますが、すごく静か。
1番目のものより個人的には気に入っています。でも高さがあるのでそこは運用方法に合わせて購入でしょうかねぇ。
f:id:Lynx-EyED:20190410220901j:plain

vcgencmd measure_temp
temp=42.0'C


冷却性能も良さげでした。