#目的
手元のRaspberry Pi zeroをLINEのMessaging APIから呼び出すため、ローカル環境をWebhook URLに登録する話題です。LINE Messaging APIの使い方はここでは触れません。
スマホの誘惑を断ち切る箱作成の際に利用しました。
#前提
ローカル環境を固定URLとして呼び出せるようにします。自前でDNS設定可能なドメインを保持していることを前提とします。
当初、目的を達成するために彷徨っていたところ、"Cloudflare の ngrok的なサービスがあるらしい"を見つけました。しかし、その通りやってみてもできません(2021/12現在)。Cloudflare側の挙動に変更があったのか、一時的なURLとして公開することができません(私の調査不足なだけかもしれませんけど)。
自前ドメインのサブドメインとして公開するのは可能でしたので、今回はその方法を紹介します。
ngrokは無償範囲では公開可能な持続時間に制限があるようなので却下です。
実現方法
CloudflareのArgo Tunnelというサービスを無償範囲で利用し、サブドメインをローカル環境に向けます。例えば、brabrabra.com を自分で所有しているとして rpi.brabrabra.com を指定すると、自宅ローカル環境のRaspberry Pi zeroが呼ばれるようになります。本来はWAF提供用のサービスですので、ある意味目的外利用ですが簡単にローカル環境を公開できます。
Raspberry Pi zeroでは正しく動かない(解決済み)
本題とは少しずれますが、ARMv6アーキテクチャを採用しているデバイスを公開しようとする場合に課題があります。Cloudflareが提供するバイナリがARMv7アーキテクチャを期待しているためです。ARMv6ではSegFaultを起こし正しく動作しないようです。
解決策はいくつかあります。
1. Version 2018.7.2を使用する
2. ARMv6用に自分でソースからビルドし直す→参考
3. ARMv6用にビルドしてくれている親切な方のサイトからDLする→GitHub上での議論
なるべく手間をかけたくないので、3を採用します。
世の中には親切な人がいて、ARMv6用に都度ビルドして公開してくれています。
Thanks a lot.
CloudflaredのInstall
最新のdebをダウンロードしてRaspberry Pi zeroへインストールします。(記録時点での最新は Version 2021.12.4)
参考:Installing cloudflared
$ wget https://hobin.ca/cloudflared/releases/2021.12.4/cloudflared_2021.12.4_arm.deb
$ sudo apt-get install ./cloudflared_2021.12.4_arm.deb
$ cloudflared -v
どこにインストールされたかと思いきや dpkg -L cloudflared してみると、なんと/にいます。
んー。引数が足りてないかもしれません。
まぁいいや。
とは言え、一応パスが通っているところにもリンクを置いておきます。
$ sudo ln -s /cloudflared /usr/local/bin/
Cloudflareにアカウント登録
公式のtutorialによれば、自分のもつDNSへぶら下げるのが仕様のようです。
-
ここに従いアカウント登録を行い自分が管理するドメインを登録します。途中、自分のwebサーバ登録を求められるので入力します。(例:brabrabra.com)
-
自前ドメインを登録している管理ページからDNSサーバのアドレスを書き換える必要があるので、現在の値から指定されたcloudflareのDNSアドレスへ変更します。(なぜこの作業が必要かはここでは説明しません。気になる方はDNSの仕組みを調べてみましょう)
登録しているサービスによってUIが異なりますが、例えばこんな感じです。
-
DNSの設定が世の中に行き渡るためしばし待ちます。数時間から場合によっては1日程度かかるかもしれません。
Cloudflaredの設定
ログインします。
cloudflared tunnel login
DNSの反映が行き届いていないと下記のようにloginが成功しません。
私の場合、3時間ほど待ったのちに成功しました。
loginが成功する場合、コンソールに表示されるURLにアクセスすると下のような画面が表示されます。これでArgo Tunnelが使えるようになったようになりました。
自宅のRaspberry Pi zero環境との紐付け
以下、Raspberry Pi zeroのコンソール上で実行する内容です。
サブドメイン名の登録
紐付け先のサブドメイン名をsmartlockとしたい場合、次のコマンドを打ちます。
cloudflared tunnel create smartlock
下記のようにconfig用のjsonファイルとidが得られます。これらは後の設定で利用します。
次のコマンドでサブドメインの登録状況を確認できます。
cloudflared tunnel list
configuration fileの作成
config.ymlファイルを作成します。
vi ~/.cloudflared/config.yml
内容は下記です。xxxの部分は先のidおよびjsonファイル名です。
url: http://localhost:1880
tunnel: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
credentials-file: /root/.cloudflared/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json
ここではNode-REDの1880ポートを公開しています。世界中からアクセスできる状態になるので公開サービス(ここではNode-RED)の認証などセキュリティは別途設定する必要があります。
トンネルの登録
ローカル環境を安全にサブドメインへ接続する経路をトンネルと呼びます。
トンネルを登録します。
cloudflared tunnel route dns smartlock smartlock
トンネルの稼働開始
cloudflared tunnel run smartlock
トンネルの稼働状況は次のコマンドで確認できます。
cloudflared tunnel info smartlock
これで完了です!
自前ドメインがbrabrabra.comだった場合、
https://smartlock.brabrabra.com
へアクセスするとRaspbrerry Pi zeroの1880へフォワードされるようになります。
すばらしい。
永続化
ここを参考に、Raspberry Pi zeroの起動とともにサービスとして動作させます。
config.ymlをrootから見えるところに置きます。
sudo ln -s ~/.cloudflared/config.yml /etc/cloudflared/
sudo cloudflared service install
sudo systemctl enable cloudflared
Cloudflareのダッシュボード
Cloudflareにログインするとダッシュボードからアクセス状況を確認できます。
おわり。