Functions での環境変数の利用

環境を構成する  |  Cloud Functions for Firebase にすべて書いてある

推奨方法 (非シークレット情報)

Cloud FunctionsdefineIntdefineString というものを使う。
セットされてなければデプロイ時にプロンプトから聞いてくれる。

const functions = require('firebase-functions');
const { defineInt, defineString } = require('firebase-functions/params');

// Define some parameters
const minInstancesConfig = defineInt('HELLO_WORLD_MININSTANCES');
const welcomeMessage = defineString('WELCOME_MESSAGE');

// To use configured parameters inside the config for a function, provide them
// directly. To use them at runtime, call .value() on them.
export const helloWorld = functions.runWith({ minInstances: minInstancesConfig}).https.onRequest(
  (req, res) => {
    res.send(`${welcomeMessage.value()}! I am a function.`);
  }
);

推奨方法 (シークレット情報)

defineSecret 経由で Cloud Secret Manager を使うのが良さそう

Firebase Functionsで Secret Manager を利用する
Firebase Functionsでクレデンシャルを扱う

const functions = require('firebase-functions');
const { defineSecret } = require('firebase-functions/params');
const discordApiKey = defineSecret('DISCORD_API_KEY');

export const postToDiscord = functions.runWith({ secrets: [discordApiKey] }).https.onRequest(
  (req, res) => {
    const apiKey = discordApiKey.value();
    //…

シークレット パラメータは、ローカルの .env ファイルを確認し、見つからない場合は新しい値をファイルに書き込むのではなく、Cloud Secret Manager 内に存在するかどうかを確認して、デプロイ時に新しいシークレット値の入力を求めるプロンプトをインタラクティブに出します。

runWith で利用するときだけ宣言する必要がある。意図しない限りは利用できないので安全なかんじがする。

デプロイすると、プロンプトで未設定のシークレットの入力を求められた。入力はマスクされ、関数のデプロイの直前で Secret Manager にアップロードされた的なメッセージあり。

$ firebase functions:secrets:access SECRET_NAME

で権限があれば確認できる。

非推奨な方法