[Firebase] Functionsで環境変数を参照/設定する

  • このエントリーをはてなブックマークに追加
  • LINEで送る

Firebaseでの「環境変数」は、OSなどから提供される情報が得られる物と、Firebaseが独自に提供する2種類の機能があります。前者が他の環境でも一般的に環境変数と呼ばれる物ですね。

ここではそれぞれの利用方法を見ていきます。

- Sponsored Link -

Firebaseの独自機能

独自の環境変数を新たに設定したくなったら、原則こちらを利用します。Firebaseがこの領域にデータを保存することはないので何か重要な情報を上書きしてしまうことがなく安全です。システム全体で利用できるグローバル変数のように扱うことができます。

CLIで設定する

値はCLIからセットします。当初firebase.jsonなどに記録されるかと思ったのですが、挙動を見るに直接Firebaseのサーバへ記録に行ってるようですね。

以下はslack.apiという名前に、THE API KEYという値をセットしています。ドット(.)の前がカテゴリのような物だと思ってください。

$ firebase functions:config:set slack.apikey="THE API KEY"
✔  Functions config updated.

現在の設定をCLIから確認する場合は以下のコマンドを実行すると、JSON形式で表示されます。

$ firebase functions:config:get
{
  "slack": {
    "apikey": "THE API KEY"
  }
}

削除するにはキーを指定して次のコマンドを実行します。ドットの前にあるカテゴリを指定すると内部にあるすべての環境変数を一括で削除できます。

$ firebase functions:config:unset slack
✔  Environment updated.

$ firebase functions:config:get
{}

Functionsで利用する

functions.config()に続いて設定した環境変数のキーを指定すればアクセスできます。

const functions = require('firebase-functions');

exports.printenvSlack = functions.https.onRequest( (req, res) => {
  res.send( functions.config().slack.apikey );
});

上記コードだとキーが存在しなかった場合に実行時エラーとなりますので、実際にはもう少し丁寧に書いた方が安全ですw

const functions = require('firebase-functions');

exports.printenvSlack = functions.https.onRequest( (req, res) => {
  const config = functions.config();
  if( config.slack && config.slack.apikey ){
    res.send( config.slack.apikey );
  }
  else{
    res.send("Not Found Config");
  }
});

ローカルのテストで利用したい

ローカルで開発する際にfirebase serveしてサーバを起動するわけですが、このままだ環境変数が利用できません。サーバ起動前に以下のコマンドを実行しておく必要があります。

$ firebase functions:config:get > functions/.runtimeconfig.json

functionsフォルダの下に置かないと認識してくれないようです。この作業を行ったあとにローカル用のサーバを起動します。

$ firebase serve

最初知らなかったときはかなりハマりましたw

一般的な意味での環境変数

こちらはOSやFirebaseなどから提供される情報が詰まっています。新たな変数を設定することも可能ですが特別な理由がない場合はやめて置いた方が良いでしょう。

環境変数を参照する

Node.jsの場合、環境変数はprocess.envに連想配列(ハッシュ)として入っているので、シンプルに以下のようなコードで参照できます。

const functions = require('firebase-functions');

exports.printenv = functions.https.onRequest( (req, res) => {
  res.send(`このFunctionのリージョンは${process.env.FUNCTION_REGION}です`);
});

環境変数を追加する

追加も連想配列(ハッシュ)を操作するのと変わりません。

const functions = require('firebase-functions');

// 現在時間をセットする
process.env["NOW"] = new Date().getTime();

exports.printenvNow = functions.https.onRequest( (req, res) => {
  res.send(process.env.NOW);
});

書いておいて何ですが、こちらは何か事情がない限りは利用しない方が良いでしょう。独自の環境変数を設定する場合は前述のFirebaseの独自機能を使うのが安全です。

環境変数を一覧表示

単にconsole.log(process.env)した結果をWebの管理画面から確認できます。以下のようなコードを用意しfirebase deploy、その後URLを叩いて実行します。

const functions = require('firebase-functions');

exports.printenv = functions.https.onRequest( (req, res) => {
  console.log(process.env);
  res.send("Please check firebase dashboard.");
});

実行したらFirebaseの管理画面へログインし、左メニューの「Functions」、右側の「ログ」をクリックするとデバッグ用の情報が表示されます。この中から先ほどの結果を探します。

実際の内容

以下は実際の内容を文字コードでソートした物です。眺めているとFirebaseはほんとにGCPの上で動いているのを再確認させられますねw

項目初期値
CODE_LOCATION/srv
DEBIAN_FRONTENDnoninteractive
ENTRY_POINTprintenv
FIREBASE_CONFIG{"projectId":"(プロジェクト名)","databaseURL":"https://(プロジェクト名).firebaseio.com","storageBucket":"(プロジェクト名).appspot.com","locationId":"asia-northeast1"}
FUNCTION_IDENTITYprojectname@appspot.gserviceaccount.com
FUNCTION_MEMORY_MB256
FUNCTION_NAMEprintenv
FUNCTION_REGIONus-central1
FUNCTION_TIMEOUT_SEC60
FUNCTION_TRIGGER_TYPEHTTP_TRIGGER
GCLOUD_PROJECT(プロジェクト名)
GCP_PROJECT(プロジェクト名)
HOME/tmp
NODE_ENVproduction
NO_UPDATE_NOTIFIERtrue
PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PORT8080
PWD/srv
SUPERVISOR_HOSTNAME169.254.8.129
SUPERVISOR_INTERNAL_PORT8081
WORKER_PORT8091
X_GOOGLE_CODE_LOCATION/srv
X_GOOGLE_CONTAINER_LOGGING_ENABLEDfalse
X_GOOGLE_ENTRY_POINTprintenv
X_GOOGLE_FUNCTION_IDENTITYprojectname@appspot.gserviceaccount.com
X_GOOGLE_FUNCTION_MEMORY_MB256
X_GOOGLE_FUNCTION_NAMEprintenv
X_GOOGLE_FUNCTION_REGIONus-central1
X_GOOGLE_FUNCTION_TIMEOUT_SEC60
X_GOOGLE_FUNCTION_TRIGGER_TYPEHTTP_TRIGGER
X_GOOGLE_FUNCTION_VERSION2
X_GOOGLE_GCLOUD_PROJECT(プロジェクト名)
X_GOOGLE_GCP_PROJECT(プロジェクト名)
X_GOOGLE_LOAD_ON_STARTfalse
X_GOOGLE_NEW_FUNCTION_SIGNATUREtrue
X_GOOGLE_SUPERVISOR_HOSTNAME169.254.8.129
X_GOOGLE_SUPERVISOR_INTERNAL_PORT8081
X_GOOGLE_WORKER_PORT8091

おまけ

ダッシュボードに入るのがめんどい場合は適当にWebブラウザへ表示することももちろん可能です。

const functions = require('firebase-functions');

exports.printenv = functions.https.onRequest( (req, res) => {
  let html='<style>dt{font-weight:bold;} dd{margin-bottom:10px;}</style>';

  html += '<dl>';
  for( key in process.env ){
    const value = process.env[key];
    html += `<dt>${key}</dt><dd>${value}</dd>`;
  };
  html += '</dl>';

  res.send(html);
});

参考ページ

- Sponsored Link -

同じカテゴリの記事

Donate

投げ銭お待ちしております!

BTC3A9nH1j7qQdKrSTrmnEdweo6zPqpHBmkxC
ETH0x1aE0541198D1F9f2908a25C35032A473e74D3731
XPXaQ9zv65F9ovfoMBrFGiPRG47aSHFhy8SX
MONAMTKgzSiS5BDueZkRCHySih24TGFwHThaDQ (MonaCoin)
ZNYZhnpf4RFYVQTAQiyoJg9dGoeC4bgT3BoSy (BitZeny)

ご質問やリクエストなどお気軽に。メールアドレスの入力は任意です。書き込みが反映されるまで時間がかかります。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください