さくらのクラウドシェルでNode-REDを実行する

さくらインターネットさんのプレスリリースでオンラインのシェル環境が2023年5月25日から提供されることをしりました。会員登録は不要(この場合機能に制限はあり)で使用可能で、会員登録して使用するに当たってはゲスト制限を解除して使用できます。

www.sakura.ad.jp

Linuxでの開発環境を持つことがほぼありえない営業職の自分も、Katacodeの閉鎖やHeroku有料化によってLinux環境の使用にかなり制限を受けており、これは非常に助かるサービスといえます。

参考

uepon.hatenadiary.com

uepon.hatenadiary.com

初期状態で開発環境的なものはpython3、Node.js、rubyphpなどは最初からインストールされていますがpip、npm、yarnなどのパッケージマネージャーはインストールされていないようです。必要であればaptなどで追加は可能です。

また、OSはUbutntu22.04なので、比較的新しい環境です。同様のサービスではまだ20.04あたりだったりすることも多いのでこちらも嬉しい。

では、これを使ってWebサービスが公開できるかというと基本的には出来ないっぽいですね。ポート関連の資料を参照してもらえばわかるのですが、ユーザー登録の無いユーザーは内外の通信はシャットアウトされ、ユーザー登録をしていれば一定のアウトバウンドの通信が可能になっています。(つまりクライアントとしては使用可能です)例えば、ユーザー登録をした場合にはcurlコマンドを使用してAPIのアクセスはできました。

逆にWebサービスを行おうとするとしようとすると…アクセスは出来ない(タイムアウトされる)ようです。

抜け道はありますが…ということで、今回はその抜け道を使用してNode-REDの環境をさくらのクラウドシェル上で構築をしてみたいと思います。

さくらのクラウドシェルを起動する

さくらのクラウドシェル(以降クラウドシェルという)はユーザ登録をしていないと、アウトバウンドの通信(クラウドシェル→外部サーバ)が行えないので、これを行うために必ずさくらインターネットさんのユーザ登録をしてください。今回ではユーザー登録は必須となります。

ユーザ登録後以下からクラウドシェルの【無料で試す】ボタンを押して作業を行っていきます。

https://www.sakura.ad.jp/services/cloudshell/

「約款に同意する」にチェックを入れて【会員IDで利用する】をクリックし

続くダイアログで【login】ボタンをクリックします。

ID、パスワードの認証を行って【ログイン】ボタンをクリックします。

シェルが開始され、ウインドウの左上に会員IDが表示されていれば大丈夫です。

Node.jsのバージョンを新しいものにバージョンアップする

このシェル環境にはNode.jsはインストールされているのですが、そのバージョンが12とかなり古いので、今回のNode-RED環境ではバージョンが古すぎて使用できません。そこで、事前にNode-REDのバージョンを上げておきます。今回はVersion20ベースにしておきます。

最新のNode.jsはaptパッケージにはないので以下を参考にインストールを行います。

github.com

以下のようにコマンドを実行すればOKです。

$ curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt-get install -y nodejs

Node-REDのインストール

Node.jsのバージョンアップができたので、Node-REDのインストールを行っていきます。こちらはNode-REDの日本語サイトを参考にしていきます。参考にしたのはRaspberryPiにインストールするというものですが、DebianベースのLinuxであれば、問題なくインストール出来ます。

nodered.jp

$ bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)

インストール作業中に設問がでますので、以下のように選択を行います。

  • Are you really sure you want to do this ? [y/N] -> yを選択
  • Would you like to install the Pi-specific nodes ? [y/N] ? -> nを選択
  • Would you like to customise the settings now (y/N) ? -> nを選択

Node-REDの起動

クラウドシェルはsystemctrl系のサービス起動ができないので、通常のプロセス起動のコマンドで対応します。また、末尾のも忘れずにつけて起動をしてください。

$ node-red &
2 Jul 20:58:53 - [info] Welcome to Node-RED
===================

2 Jul 20:58:53 - [info] Node-RED version: v3.0.2
2 Jul 20:58:53 - [info] Node.js  version: v20.3.1
2 Jul 20:58:53 - [info] Linux 5.4.0-45-generic x64 LE
2 Jul 20:58:53 - [info] Loading palette nodes
2 Jul 20:58:54 - [info] Settings file  : /home/sakura/.node-red/settings.js
2 Jul 20:58:54 - [info] Context store  : 'default' [module=memory]
2 Jul 20:58:54 - [info] User directory : /home/sakura/.node-red
2 Jul 20:58:54 - [warn] Projects disabled : editorTheme.projects.enabled=false
2 Jul 20:58:54 - [info] Flows file     : /home/sakura/.node-red/flows.json
2 Jul 20:58:54 - [info] Creating new flow file
2 Jul 20:58:54 - [warn] 

---------------------------------------------------------------------
Your flow credentials file is encrypted using a system-generated key.

If the system-generated key is lost for any reason, your credentials
file will not be recoverable, you will have to delete it and re-enter
your credentials.

You should set your own key using the 'credentialSecret' option in
your settings file. Node-RED will then re-encrypt your credentials
file using your chosen key the next time you deploy a change.
---------------------------------------------------------------------

2 Jul 20:58:54 - [info] Server now running at http://127.0.0.1:1880/
2 Jul 20:58:54 - [warn] Encrypted credentials not found
2 Jul 20:58:54 - [info] Starting flows
2 Jul 20:58:54 - [info] Started flows

以上でNode-REDのインストール関連が終了しました。

ngrokのユーザー登録を行う

続いてはngrok(『エングロック』と発音するみたいです)を導入していきます。このサービスはトンネリングを行ってくれるサービスで、ローカルのルータ内にあるようなサーバを登録し、ルータ外部からアクセスできるようにしてくれます。

以下のサイトにアクセスをしてユーザ登録を行っておきます。

ngrok.com

ngrokをインストールする

ユーザ登録が終わったら、インストールを行います。サイトにはUbuntuの場合にはtgzファイルがありますが、以下の様にすれば、aptコマンドを使用してngrokをインストールすることが出来ます。

$ curl -s https://ngrok-agent.s3.amazonaws.com/ngrok.asc | sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null && echo "deb https://ngrok-agent.s3.amazonaws.com buster main" | sudo tee /etc/apt/sources.list.d/ngrok.list && sudo apt update && sudo apt install ngrok

トークンの登録

あとはngrokサイトのYour Authtokenからトークンをコピーし以下のように実行しておきます。実行時にも指定できますが、こちらのコマンドを実行することで、ホームディレクトリにファイルを生成して、実行時に参照をしてくれるようになります。

$ ngrok config add-authtoken 【トークン】

Node-REDサービスへのポートフォワードを開始

あとは、クラウドシェル上のNode-REDの使用するポート1880にポートフォワードをするように実行を行います。

$ ngrok http 1880

これで準備完了です。

実行後には以下のような画面が表示されますが、フォワードするURLが表示されます。このURLをクリックしてNode-REDのフローエディタを開くことになります。

Node-REDの動作確認

フローエディタのURLを開くと、以下の様な画面がでてくればOKです。

使用上のポイント

クラウドシェルは無通信時間が20分程度でシェルのセッションが切れて状態がリセットされます。 そのため、定期的にコマンドの実行を行う必要があるのですが、プログラミングを行っているとロジックを考えている間に20分という時間はあっというまかもしれません。

そこでNode-REDのフローで以下のようなインターバルタイマを実行するようなフローを作り常に実行しておくとよいでしょう。

injectノードdebugノードを配置し接続します。

injectノードをダブルクリックしてプロパティを開き、繰り返しの設定(インターバルタイマ)を3分ぐらいに設定します。

設定後に【デプロイ】ボタンをクリックして

フローを実行します。これで定期的にサーバへのアクセスがあることで、長時間実行していてもセッションは保たれます。

また、Node-RED以外での検索作業をブラウザで行っていると、ブラウザの設定で負荷軽減をしていると、Node-REDが別のタブで作業していても接続が切れてしまうこともあるようなので、設定の変更を行うか、あるいは検索作業のタブを別のウインドウにして実行が常に行われているようにするなどの工夫が必要かもしれません。

おわりに

今回はさくらのクラウドシェルを用いて、サーバ的な動きを実現できるようにしました。結構抜け道的なところではありますが、一時的な措置としてはありかもしれません。

/* -----codeの行番号----- */