TermuxでFirebaseのFunctionsをNodeで動かす 結城永人 -2024年5月31日 FirebaseのバックエンドサービスのFunctionsをAndroidでLinux環境を構築できるターミナルエミュレーターアプリのTermuxからNode(JavaScript/TypeScript)で使おうと思ったらエラーを連発してデプロイできなかった。何とかならないのかと調べてみたらGitHubで提供されるモジュールのfirebase-functions-termuxを使うとオリジナルのFunctionsの代わりになることが分かった。 五年前から更新が止まっていて本当に大丈夫かどうかが半信半疑だったけれどもやってみるとFunctionsのタイプは第一世代で古いものの動かせることが分かったから見付けた使い方を載せておきたい。 firebase-functions-termuxの設定 firebase-functions-termuxはNodeのExpressというフレームワークで Functionsの第一世代を使えるようにするモジュールなんだ。 設定する手順はGitHubのREADMEに載っている通りで、FirebaseのFunctionsをHostingと組み合わせて使う。 単独でも使えるのかも知れないけれども拡張性が増して便利だと思う。 FirebaseのHostingをTermuxに取り込むfirebase-functions-termuxをTermuxに取り込むHostingのfirebase.jsonを書き換える 作者の説明に従うとFirebaseのHostingをTermuxに取り込んでからfirebase-functions-termuxを取り込んでオリジナルのFunctionsの代わりとして使えるように組み合わせるべく、Hostingのルートディレクトリのfirebase.jsonを書き換えるという作業が必要になる。 FirebaseのHostingをTermuxに取り込む 以前、FirebaseのHostingの設定についてはブログに載せたけど、その通りにやれば今でも大丈夫だ。 Firebaseのホスティングのプロジェクト/アプリ開発やサイト作成を立ち上げる Functionsの昔と変わった最も大きな点は昨年からNodeだけではなく、Pythonにも対応するようになったことだ。AndroidのTermuxのNodeでエラーを連発してどうにもならないからPythonならば大丈夫なのかと調べてみたら、現在、Pythonのバージョンが12でなくてはFunctionsが動かないらしくてTermuxにインストールすると11で、そのせいか、やはりエラーを連発してどうにもならない。 結局、TermuxでFunctionsを使うにはfirebase-functions-termuxを入れてNodeのExpressで動かすのが唯一か手軽な方法だと思う。 FunctionsのためにHostingを取り込む際の注意点としてはTermuxのホーム(アプリを開いた直後の階層)にディレクトリを作ることが挙げられる。 どうしてかというとNodeのnpmのインストールが下の階層だと難しい場合があるので、ホームからやらないと必要なモジュールが集まらなくて結果的にFunctionsがデプロイできるとしても目的を果たせないことになり兼ねない。 Bash mkdir firebase ※firebaseは任意のディレクトリ名。 Termuxのホームにmkdirコマンドでディレクトリを作ると普通のファイルマネージャーやHTMLエディターでは開けないんだ。 Linux環境からエディターをインストールしてコマンドで開くか高機能のファイルマネージャーやHTMLエディターからアクセスできるようにする必要がある。 個人的にAcodeというAndroidのHTMLエディターを使ってTermuxのホームからNodeやPythonのファイルを編集している。 関連ページAndroidの無料で使い易いHTMLエディターの比較検討 firebase-functions-termuxをTermuxに取り込む firebase-functions-termuxはGitHubのリポジトリにあるので、GitHubに登録してTermuxにGitHubのGitを入れておくと簡単だ。 これも、以前、ブログに載せたけど、同じようにやれば今でも大丈夫だ。 GitHubのGitのAndroidスマホのTermuxアプリを使った初期設定と通常の基本操作 現在、FirebaseのHostingがGitHubと連携できてデプロイの自動化も可能になっているので、GitHubを常用する人には便利だと思う。 FirebaseのHostingのディレクトリの中にFunctionsの代わりとなるfirebase-functions-termuxを入れる。 Bash cd firebase ※firebaseは任意のディレクトリ名。 Hostingのために作成したルートディレクトリ、サンプルでは「firebase」へcdコマンドで移動する。 Bash git clone https://github.com/somitrasr/firebase-functions-termux.git firebase-functions-termuxをGitHubのリポジトリからcloneコマンドで取り込む。 Gitを使わない場合はfirebase-functions-termuxの内容をダウンロードして入れる。 Linuxのコマンドてダウンロードする方法はTermuxでcurl -OL ファイルのURL(ファイルはraw:コード以外が含まれないものを選ばないと編集が必要)が使えるけど、ただしfirebase-functions-termuxには大きなフォルダもあってそこから数多くのファイルをダウンロードしてmkdir ディレクトリ名で必要なディレクトリを作って入れて行くのは物凄く大変な作業になる。 firebase-functions-termuxのルートのディレクトリ名の「firebase-functions-termux」は別のものに書き換えても構わない。 Hostingのfirebase.jsonを書き換える ここまでで新しいディレクトリの同じ階層にHostingとfirebase-functions-termuxが入っていることになる。 Hostingの動作を決めるためのfirebase.jsonというファイルがあるので、普通にFunctionsを使うときと同様にrewritesを追加してHostingと関連付ける。 firebase.jsonのサンプル { "hosting": { "public": "public", "ignore": [ "firebase.json", "**/.*", "**/node_modules/**" ], "rewrites": [ { "source": "**", "function": { "functionId": "app" } } ] } } firebase.jsonのrewritesの書き方は次のドキュメントが参考になる。 ホスティング動作を構成するCloud Functions を使用した動的コンテンツの配信とマイクロサービスのホスティング関数を管理する firebase.jsonのrewritesの書き方 rewritesはhostingの項目として記載する。hostingと併置しないように注意する。 rewritesはHostingで同じコンテンツを別のURLでも出せるようにするかFunctionsの呼び出しのために使える。 firebase-functions-termuxの設定では次の二つを追加する。 source関数の呼び出しページ(全てならば「**」)functionfunctionIdアプリ名(初期値は「app」) sourceはHostingからFunctionsへHTTPリクエストを送るページを限定する。外部サイトからFunctionsを呼び出す際には影響しないだろう。 functionのfunctionIdはFunctionsで定義したもので、firebase-functions-termuxの初期値ではindex.jsにある「app」が対象になる。 firebase-functions-termux/index.js const functions = require('firebase-functions'); const express = require('express'); const app=express(); app.get('/users', (request, response)=>{ response.send("Hi Somitrasr"); }); exports.app = functions.https.onRequest(app); 他にも「app」という同じ表記の変数があるから紛らわしいけれども最後の出力の「expors.app」のappだけが関数名になる。 Hostingのfirebase.jsonのFunctionsの呼び出しに関する項目はその他に配信元を地域を指定するregionとHostingとの同期を指定するpinTagがある。 前者はfirebase-functions-termuxの第一世代では対象が限定的だから注意して使う。因みに日本の「asia-northeast1」(東京)や「asia-northeast2」(大阪)を指定しても使えないと思う。後者は第二世代だからfirebase-functions-termuxでは全く使えなくてむしろエラーを引き起こすから記載しては行けない。 firebase.jsonの書き換えが済んだらfirebase-functions-termuxの初期設定は完了した。 Bash firebase deploy 一度、新しく作成したFirebaseのルートディレクトリからHostingとFunctionsをデプロイして成功すれば間違いないと確認できる。 Nodeのバージョンの指定 FirebaseのFunctionsのNodeのバージョンを合わせないとエラーが出てしまう場合がある。 現段階では第二世代も第一世代も14、16、18、20(プレビュー)がサポートされている(Node.js のバージョンを設定)。 Nodeのバージョンはどこで指定するか Functionsのpackage.jsonでNodeのバージョンを指定することができる。 firebase-functions-termuxのpackage.json "engines": { "node": "8” firebase-functions-termuxの初期値が「8」なので、必要に応じて変更する。 ただしFunctionsでNodeの10以降のバージョンを使うのは無料プランでは無理で、無料枠を越えると課金されるBlazeプランへ移行しなくてはならない。 参考サイト料金プラン Functionsで使用するNodeのバージョンをTermuxにインストールしたものと合わせないと止まることはないかも知れないけど、しかし何かの実行中に注意を呼びかけられるのを良く見かけるから合わせる方が無難だろう。 Termuxでは通常のNode.jsと安定版のNode.js LTSをインストールすることができる(Node.js)。 Bash node -v Nodeは通常版が安定版よりもバージョンが進んでいるので、Termuxにもう入っていれば-vコマンドで調べてFunctionsでサポートするものと合った方を使うことが望ましい。 FunctionsでのNodeのExpress firebase-functions-termuxにはNodeのフレームワークのExpressが搭載されている。 NodeのExpressをFunctionsに適用する Functionsでは独自のHTTP関数があるけれどもそれをExpressで置き換えるには次のプログラムが必須になる。 Node.js const functions = require('firebase-functions'); const express = require('express'); const app = express(); // Expressのプログラム内容 exports.app = functions.https.onRequest(app); firebase-functions-termuxのindex.jsにも含まれているけれども最初と最後をconst functions = require('firebase-functions') とexports.app = functions.https.onRequest(app)(三つの「app」は任意で、一つ目と三つ目がExpressの変数、二つ目が関数名)にしておけばその中で通常のExpressのプログラムを書いてFunctionsに反映させられる。 参考サイトウェブ フレームワークを使用する コメント 新しい投稿 前の投稿
イヤーワームという頭の中で音楽が勝手に流れる現象を引き起こすストレスを反省 以前から頭の中で音楽が勝手に流れることが良くあって近頃でもブログで取り上げたばかりの モーツァルトの幻想曲K.397 や K.375 や ribbonの Virgin Snow などを体験していた。いつも好きな曲ばかりで鼻歌を伴って喜ばしい気持ちになるし、好調の証のように捉えてい...
芦名星のたぶん本当の死因 芦名星は自殺した。その前後、 三浦春馬と竹内結子の自宅のクローゼットでの首吊りという同じ仕方での連続自殺 があり、他殺の陰謀論も思い浮かぶけど、しかし違うのではないか。今の 日本の芸能界には死にたくなる気持ち悪さがある し、芸能人が裕福な生活でも自殺することはさほど不思議ではない...
幸せの良さはインパクトが物凄く大きいために人々の印象にも残り易いと考える ブログのヘッダーの背景画像を変更した。無料素材の クリスティン・フォークトの写真 を使っている。 Pexelsで見付けるや否や本当に素晴らしく気に入ってしまった A woman in snowflakes by Kristin Vogt / Pexels 雪の中で紺...
アガサ・クリスティの誘拐された総理大臣の日本語訳 十九から二十世紀のイギリスの作家、小説家の アガサ・クリスティ の小説の 誘拐された総理大臣 (1923)の日本語訳を行った。一つの文学作品として人間の洞察力に富んだ優れた内容を持つだけではなく、表現も意義深いから外国語の英語の聞き取りと読み取りの教材としても最適だと感じる。 ...
Imgurで画像URLと埋め込みコードを取得する方法 Imgur は自分でアップロードした画像については画像URL/直リンクを取得して他のサイトにHTMLのimgタグで表示させられる。 そして自分と他の人たちも含めて画像の埋め込みコードを取得して他のサイトのHTMLに、そのまま、記載して表示させられもする。 目次 Img...
俳句の規則:字数と季語と切れ字 概要 俳句の規則 俳句は、十七文字という短い詩の中で、季節を感じさせる言葉(季語)を使い、切れ字で語調を整えて表現する伝統的な日本の文学形式です。 句の基本的な構成要素 字数を十七文字に揃える:俳句は大きく三つの部分に分けられる。上句(かみく)と中句(なかく)...
日常の些細な出来事に触れる幸せの味わいは小さいというイメージが欠かせない 誰にでも分かる些細な日常というと他でもなく、小さな幸せの味わいではないか。 永遠の詩人として本質的な認識に基づく命の尊さを伝え届けなくてはならないと考えるけれどもアクセスアップのためには誰にでも分かる些細な日常のイメージも大事にするべきだろう。 小さな幸せの味わいをどこま...
シソンヌのラーメン屋:とんこつラーメンを臭いラーメンと呼んだコントが好き シソンヌ (お笑い)のラーメン屋のコントが面白かった。とんこつラーメンを臭いラーメンと呼ぶから僕も同じだったと気付いた。 シソンヌのラーメン屋 (Google検索) 否、店によってはそばを通りかかるだけでも堪らないくらい臭いから、一体、何だろうと本当に思わずにはいられなか...
燃え上がる情熱からサイト運営に気持ちを爆発させよ 昔と比べてサイト運営でアクセスが伸び悩むのは僕の気持ちとして皆と仲良くする思いが減っているのではないか。 改めて人々との交流を強く願ってやってみたいと感じる 皆に心から来て欲しいということは盛り上がるホームページやブログが素晴らしいと夢見ているせいなので、そうした気持...
徳川家康の忸怩たる思いも良く分かるようで偉く辛い 朝からブログに誰も来てない。午前中のアクセスが皆無ならば一日で十人も厳しいだろう。二ヵ月前からアクセスが伸び出して一日に五人くらいだったのが十人、十五人と増えたので、今月はできれば二十人を望んでいた。 Google検索では上昇傾向の見られる些細な日常なので、本当に厳しい。偶々...
コメント