Functions での環境変数の利用
環境を構成する | Cloud Functions for Firebase にすべて書いてある
推奨方法 (非シークレット情報)
Cloud Functions の defineInt
や defineString
というものを使う。
セットされてなければデプロイ時にプロンプトから聞いてくれる。
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
で権限があれば確認できる。
非推奨な方法
- PR で使われていて知った。公式ドキュメントを読むと第 1 世代限定 & すでに非推奨らしい
functions.config().key.to.value
という方法- 未設定でデプロイしようとするとエラーになったので、一応未設定は防げそう
TypeError: Cannot read properties of undefined (reading 'value')
- セットする方法としてはシェルで
firebase functions:config:set key.to.value=XXX
とする