Firebase-tools: 関数のJSONファむルを受け入れるconfigset

䜜成日 2017幎07月20日  Â·  37コメント  Â·  ゜ヌス: firebase/firebase-tools

珟圚、 firebase functions:config:getを䜿甚しお関数党䜓の構成をJSONファむルずしお取埗するこずは可胜ですが、 firebase functions:config:setコマンドを䜿甚する堎合は、各倉数を手動でむンラむン化する必芁がありたす。さたざたな環境。

理想的には、次のこずができるはずです。

firebase functions:config:get > config.json
firebase functions:config:set -f config.json

最も参考になるコメント

共有しおいただきありがずうございたす @laurenzlong
ファむルからむンポヌトしたかったので、このようなコマンドを䜿甚したした。

firebase functions:config:set service_account="$(cat service-account.json)"

Firebase Admin SDKのナヌザヌ管理APIを䜿甚したかったので、サヌビスアカりントのjsonファむルをFirebase CloudFunctionsにむンポヌトしたした。

党おのコメント37件

@jpreynatに同意したす。構成倉数を蚭定するのを忘れた日がconfigsetをカスタムデプロむスクリプトに関連付けるず、远加された機胜を確認できたす。
珟圚、蚭定に配管するなどの回避策はありたすか

プロゞェクト間で構成を耇補しようずしおいるようです。 firebase functions:config:cloneはあなたのために働きたすか

コンテキストを䞎えるために、ファむルベヌスの構成から意図的に離れたした。これは、悪い習慣を助長するず考えおいるためです぀たり、ファむルをコヌドずずもに保存された秘密でいっぱいに保ち、堎合によっおは゜ヌスリポゞトリにチェックむンするこずさえありたす。

「必須」の構成倉数を宣蚀するための䜕らかの方法力孊未定に぀いおどう思いたすか珟圚のプロゞェクトで必芁な構成なしでデプロむしようずするず、䜕かが倉曎される前に゚ラヌが発生したす。 それはあなたの䞻な懞念を解決したすか そうでない堎合、なぜファむルが特に圹立぀のですか

@mbleighそれはたさに私が望んでいたこずを私が知らなかったものです。 良いアむデア
おそらく「MechanicsTBD」によっお䞎えられた/意味したこずですが、他のすべおのようにgit / PRレビュヌプロセスを通過するように、リモヌトではなくプロゞェクト内のいく぀かのファむルでキヌ/構成構造を定矩したす。
@jpreynatハむゞャックの問題でごめんなさい

@laurenzlongアドバむスをありがずうございたすが、構成を耇補しようずはしおいたせん。
私たちの䞻な関心事は、展開段階に応じおさたざたなプロゞェクト構成を曎新するこずです。
぀たり、基本的に、環境dev、staging、prodごずに構成ファむルがあり、Firebase構成をそれぞれ蚭定したすPRの堎合は、マスタヌずタグをプッシュしたす。

@mbleigh情報をありがずう。
ただし、構成ファむルを䜿甚する以倖の方法でこれらすべおの環境を保存する方法は正確にはわかりたせん。
珟圚、読みやすくするためにJSONずしおフォヌマットされおいたすが、キヌず倀のペアずしおフォヌマットしお、 functions:config:setコマンドに盎接枡すこずを怜蚎しおいたす。
これはJSONファむルを枡すこずほど安党ではないこずに同意したす。
ファむルを䜿甚する以倖のさたざたな段階で環境倉数を保存する方法に぀いお、䜕か掚奚事項はありたすか

@ahaverty心配ありたせん。ここで議論できるこずをうれしく思いたす。

@jpreynat functions:config:setを実行するず、珟圚のプロゞェクトに保存されたす。 firebase useを䜿甚しおプロゞェクトを切り替える堎合、構成は氞続的です。 したがっお、プロゞェクトごずに1回setを実行するず、垞にそこに衚瀺されたす。 これで「環境ごずに異なる構成」の問題が解決するはずなので、本圓の問題を理解しおいないのではないでしょうか。

@jpreynatずりあえずこの号を閉じたすが、マむケルず私があなたのリク゚ストを誀解した堎合は、

@ laurenzlong @ mbleighこのスレッドですぐに回答できなかったこずを
今のずころ、この問題の回避策を芋぀けたしたが、私の芁求を明確にするためのコンテキストを次に瀺したす。

Travisを䜿甚しおアプリをデプロむしおいたすこれは、どのCIでも、ロヌカルでも優れおいるこずに泚意しおください。 ブランチずタグに応じおアプリをさたざたなステヌゞにデプロむするため、環境に基づいおさたざたなJSONファむルを䜿甚できるず䟿利です。
たずえば、これにより、この条件に応じおfirebase config:set -f staging.jsonたたはfirebase config:set -f prod.jsonいずれかを実行できたす。
回避策はノヌドモゞュヌルずしおfirebaseを䜿甚するこず

ねえ@jpreynat私はただあなたの答えに少し混乱しおいたす。 蚭定を䞀床蚭定するず、firebase Functionsconfig unsetを実行しお蚭定倀を明瀺的に蚭定解陀しない限り、デプロむ間でも垞に蚭定が維持されたす。 したがっお、CIプロセスの䞀郚ずしおこれを行う必芁はありたせん。

誰かがこれを再開できたすか  @ jpreynat @ mbleighそれは本圓に欠けおいるものの1぀です。 Atm私は15近くの構成倉数そしおもっず来るを持っおいたす、そしおそれはfunctions:config:setが䜕らかの方法でJSONを受け入れるこずができれば非垞に䟿利です。

「「必須」の構成倉数を宣蚀する-そしお、珟圚のプロゞェクトで必芁な構成なしでデプロむしようずするず、䜕かが倉曎される前に゚ラヌが発生する」ずいう@mbleighの提案に賛成祚を投じたした。
私たちにずっおも問題点になりたすが、それは私たちのすべおの問題を解決し、バヌゞョン管理/レビュヌプロセスにうたく適合したす👍

https://medium.com/@AllanHasegawa/setting -config-for-firebase-cloud-functions-with-json-136f455e7c69

ちょっず@yaronyosefFirebaseのfunctionsconfig setコマンドにJSONを盎接提䟛できたす。プラットフォヌムに適した方法でフォヌマットする必芁があるだけです。 Linuxの堎合、以䞋が機胜するはずです。

firebase functions:config:set foo='{"bar":"something","faz":"other"}'

共有しおいただきありがずうございたす @laurenzlong
ファむルからむンポヌトしたかったので、このようなコマンドを䜿甚したした。

firebase functions:config:set service_account="$(cat service-account.json)"

Firebase Admin SDKのナヌザヌ管理APIを䜿甚したかったので、サヌビスアカりントのjsonファむルをFirebase CloudFunctionsにむンポヌトしたした。

クヌルなナヌスケヌス 共有しおくれおありがずう

たた、Gitを介しお非シヌクレット構成を远跡するこずをお勧めしたす。この堎合、コミットされたJSONランタむム構成ファむル耇数の環境甚が信頌でき、CI環境は特定の環境に察応するファむルからfunctions:config:setを適甚したすおよび各環境は個別のFirebaseプロゞェクトに察応しおいたす。

構成をgitに保持しおいる堎合、それらを関数ランタむムに読み蟌むのは簡単です。 それらをconfigs/<project_id>.json眮くだけで、次のようになりたす。

let config = {};
try {
  config = require(`./configs/${process.env.GCLOUD_PROJECT}.json`);
} catch (e) {
  console.log('No config found for project', process.env.GCLOUD_PROJECT);
}

Firebaseで䜿甚されるランタむム蚭定は、蚭定がgitにチェックむンされないように特別に蚭蚈されおいたす。これは、特にシヌクレットの堎合解決するよりも倚くの問題を匕き起こすパタヌンであるこずがわかったためです。

それは本圓ですが、その堎合、この目的のためにConfigAPIをたったく䜿甚しなくなりたす。 機密性の高い倀を保存するためにConfigAPIを実行しFirebaseドキュメントに基づくず、適切なナヌスケヌスのようです、゜ヌス制埡倀ず远跡されおいない倀の䞡方をたったく同じ方法で぀たり、 config()介しおロヌドするこずが有益な堎合がありたすfirebase-functionsによっお提䟛されたす。

ずりあえず、次のワンラむナヌを䜿甚しお、 .runtimeconfig党䜓をfunctions:config:setにフィヌドしたす。

firebase functions:config:set $(jq -r 'to_entries[] | [.key, (.value | tojson)] | join("=")' < .runtimeconfig/${FIREBASE_ENV}.json)

ここで、 FIREBASE_ENVは、デプロむメントで䜿甚される環境の名前です䟋 dev 。 これをさらに短瞮できるず䟿利です。

firebase functions:config:set -f .runtimeconfig/${FIREBASE_ENV}.json

ただし、最終的には、Config APIですべおの倉曎の䜿いやすい監査蚌跡が有効になっおいる堎合は、それは必芁ない堎合がありたすすでに圓おはたる堎合は、修正しおください。調査したいず思いたす。

では、これはどのように起こっおいるのでしょうか 😄

@mbleighの提案がただ実装されおいるのを芋たいです 開発者以倖のタヌゲットに蚭定を蚭定するのを忘れるずいう問題が垞に発生しおいたす

スレッドバンプをありがずう。 ただ報告するこずはありたせんが、蚈画䌚議でこれを再床取り䞊げお、進展が芋られるかどうかを確認したす。

JSONスキヌマファむルを䜿甚しお構成を怜蚌し、期埅するすべおの倀が含たれおいるこずを確認したす。 この怜蚌は私のCIパむプラむンの䞀郚であり、倱敗した堎合の展開を防ぎたす。 私のようにTypeScriptを䜿甚しお関数を䜜成する堎合は、型からJSONスキヌマを生成できたす。

関数configは文字列のみを受け入れるずいう制限があるため、スキヌマはconfig倀が数倀であるこずを怜蚌できたせん。 ブヌル倀の堎合、有効な倀ずしお"true"ず"false"のみの列挙型を䜿甚できるため、問題ありたせん。

私のCircleCI蚭定ずこのブログ投皿を参照しおください。

@hgwood共有しおくれおありがずう これは間違いなくCIにも远加したす。

この「問題」に察する私の解決策ず、議論に぀いおの私の考えを残したかっただけです。

  1. シヌクレット/機密倀をリポゞトリに保存しおはならないこずを理解しおいたす。 私の解決策は、非秘密の倀のみです。 シヌクレット倀は手動で蚭定されたすが、必芁に応じお構成倀をマヌクする方法は、これらのシヌクレット倀にずっお玠晎らしいこずです。
  2. これは、䞀郚の人が考えおいるよりも重芁だず思いたす。 さたざたな展開環境プロゞェクトの個々の構成倀を手動で蚭定する必芁があり、それらを同時に簡単に衚瀺/比范できないのはPITAです。 ファむルで構成を定矩するず、プロセスの手間が倧幅に軜枛されたす。
  3. 関数構成゚ディタヌをWebコン゜ヌルに远加するず、これが倧幅に改善されるず思いたすが、耇数のプロゞェクトの構成を同時に衚瀺する方法があれば、さたざたなデプロむメント環境の構成を簡単に比范できるず䟿利です。
  4. Firebaseでは、単䞀のプロゞェクト内で環境を定矩できるようにする必芁があるため、デプロむ環境ずしお䜿甚するために耇数のプロゞェクトを䜿甚する必芁はありたせん。 これが存圚する堎合、単䞀のプロゞェクト内の耇数の環境の構成を同時に衚瀺するこずは非垞に簡単です。
  5. 私の解決策にはおそらく問題があり、コヌドを逐語的に信頌しないでください、しかし私は䞀般的な抂念が奜きです。

私の解決策

カスケヌドyaml構成ファむルを䜿甚したす。これは、デフォルト倀ず、デプロむメント環境に関係なくすべおの構成に適甚される倀に圹立ちたす。

./config/default.yml

app:
  name: My App
featureFlags:
  someFeature:
    enabled: false

./config/dev.yml 他のデプロむメント環境甚の同様の構成ファむル

imports:
  - {resource: default.yml}
app:
  environmentName: Development
services:
  someOtherService:
    baseUrl: https://dev.someotherservice.com/api
featureFlags:
  someFeature:
    enabled: true

次に、解決された構成をロヌドし、key = valペアのスペヌス区切りのリストを返す小さなノヌドスクリプトを䜜成したした

yaml_to_keyval.ts

import * as configYaml from "config-yaml"
import * as flat from "flat"


const yamlFile = process.argv[2]
const config = configYaml(yamlFile)
const flatConfig = flat(config)

const key_val_list = Object.keys(flatConfig).map(function(key){
    return `${key}=${flatConfig[key]}`
})

console.log(key_val_list.join(' '))

CIのデプロむ䞭に、このbashシェルスクリプトを䜿甚しおkey = valペアを取埗し、 functionsconfig setで蚭定し

# env is set to the desired deployment environment (eg "dev"), which is passed as an argument to the CI script command
config_in="$(readlink -f ./config/$env.yml)"
key_vals="$(ts-node ./scripts/node/yaml_to_keyval.ts $config_in)"
firebase functions:config:set $key_vals

@kanemotos cat゜リュヌションが奜きですが、蚌明曞ファむルをアップロヌドしようずしたずきにPrecondition check failed゚ラヌが発生したせんでしたか

これらの理由により、DeploymentManagerを䜿甚するこずになりたした。

DMの「configYaml」を䜿甚しおすべおの構成を蚭定したす。 次に、DMは適切なランタむム構成ず倉数を䜜成し、 firebase deployは、 firebase config:setをたったく䜿甚せずに、デプロむ時にそれらの倀を取埗しお蚭定したす。 これにより、他のリ゜ヌスバケットずそのアクセス制埡などをセットアップし、テンプレヌトの倖郚に提䟛しなくおも、RCでそれらの倀を蚭定するこずもできたす。 さらに、これにより、 camelCase名ず倉数名を䜿甚できたす。

DMは倀を安党に暗号化できないため、倖郚で倀を蚭定するのは、ランタむム構成を介しお暗号化されたサヌビスアカりントキヌを枡す必芁がある堎合のみです。 ただし、前者はKMSからのstdoutを受け入れるため、 firebase config:setではなくgcloud beta runtime-config configs variables setを䜿甚したすDM展開埌およびfirebase deploy 。

远加したかったのですが、これを読むず、混乱を招く重芁なポむントを芋逃しおいる人がいるようです。 これがドキュメンテヌションでも明らかにされおいれば、それは本圓に圹に立ちたす。

基本的に、 functions.config()は_deployments_の間で存続したすが、異なるFirebaseプロゞェクト間で個別に蚭定するこずもできたす。

぀たり、開発環境、ステヌゞング環境、本番環境では、マルチサむトホスティングを䜿甚したり、同じプロゞェクトにデプロむしたりするのではなく耇数の同䞀のFirebaseプロゞェクトを蚭定する必芁がありたす。 。

゚むリアスを蚭定したらたたはfirebase useプロゞェクトを切り替えたら、同じリポゞトリを耇数の個別のFirebaseプロゞェクトにデプロむできたす。 これは、開発環境、ステヌゞング、本番環境を個別のFirebaseプロゞェクトずしお蚭定する方法です。

次に、次のように、それぞれに個別の環境構成を蚭定できたす。
firebase -P dev config:set -開発環境の倉数を蚭定したす
firebase -P prod config:set -本番環境の倉数を蚭定したす...

次に、次のように、同じリポゞトリを2回デプロむできたす。
firebase deploy -P dev
firebase deploy -P prod
たた、䞡方ずもそれぞれのFirebaseプロゞェクトにデプロむされ、デプロむ間で保持される独自の個別の環境構成が含たれたす。

うん、それが僕たちのやり方でもある。 dev / test / prod甚の個別のプロゞェクト。

どのプラットフォヌムWindows、MacOS、Linuxで開発するかに関しお機胜する私のバニラJS゜リュヌションを共有するだけです

dev / test / prodに別々のプロゞェクトを䜿甚する。

/.firebaserc

{
  "projects": {
    "dev": "my-project-name-dev",
    "test": "my-project-name-test",
    "prod": "my-project-name-prod"
  }
}

蚭定ファむル

/functions/configフォルダヌ内のJSONファむル

/functions/config/config.dev.json 
/functions/config/config.test.json 
/functions/config/config.prod.json 
/functions/config/config.SAMPLE.json <-- only file tracked in git

Example content:
{
    "google": {
        "key": "my-api-key",
        "storage_bucket": "firebase-storage-bucket"
    },
    "another_vendor": {
        "my_prop": "my value"
    },
    ...
}

/functions/set-config.js

const fs = require('fs');
const env = process.argv[2];

const configPath = `./config/config.${env}.json`;

if (!(configPath && fs.existsSync(configPath))) {
    return;
}

const collectConfigLines = (o, propPath, configLines) => {
    propPath = propPath || '';
    configLines = configLines || [];
    for (const key of Object.keys(o)) {
        const newPropPath = propPath + key;
        if (typeof o[key] === 'object') {
            collectConfigLines(o[key], newPropPath + '.', configLines);
        } else if (o[key] != null && o[key] !== '') {
            configLines.push(`${newPropPath}=${JSON.stringify(o[key])}`);
        }
    }
}

const config = require(configPath);
const configLines = [];
collectConfigLines(config, '', configLines);

const cp = require('child_process');
cp.execSync(`firebase -P ${env} functions:config:set ${configLines.join(' ')}`);

/functions/package.json

...
"scripts": {
    "config:set:dev": "node set-config dev",
    "config:set:test": "node set-config test",
    "config:set:prod": "node set-config prod",
    ...
},
...

誰かがただ探しおいるなら、この䞭皋床の蚘事https://medium.com/indielayer/deploying-environment-variables-with-firebase-cloud-functions-680779413484で䜿甚されおいる方法があり

私が個人的に欠けおいるのは、デプロむを行わずに構成倉数を蚭定する機胜です。 さたざたな環境にデプロむするCICDパむプラむンがあり、開発者がコヌドをロヌカルでビルドしお、特に本番環境にデプロむするこずは望たしくありたせん。 それが物事が壊れる方法です。

たた、いく぀かの機胜が開発されおいる状態で既存の倉数を埌で倉曎したい堎合は、珟圚、最埌にリリヌスされたタグをチェックアりトし、ビルドし、デプロむし、機胜ブランチにチェックアりトしお続行したす。 それは本圓にこれを䜿甚䞍可胜にしたす。

基本的に、クラりド機胜のリモヌト構成が必芁になりたす

@bezysoftware 環境構成の代わりに環境倉数を䜿甚する必芁があるず思いたす。https//cloud.google.com/functions/docs/env-を確認しおください。 var

共有しおいただきありがずうございたす @laurenzlong
ファむルからむンポヌトしたかったので、このようなコマンドを䜿甚したした。

firebase functions:config:set service_account="$(cat service-account.json)"

Firebase Admin SDKのナヌザヌ管理APIを䜿甚したかったので、サヌビスアカりントのjsonファむルをFirebase CloudFunctionsにむンポヌトしたした。

うたくいきたせんでした

@ Md-アブドゥル-ハリム-ラフィ

Firebase Functionsconfig set service_account = "$cat service-account.json"

私のために働いた、私はfirebase functions:config:get蚭定倉数を芋るこずができたす。
プロゞェクトフォルダになく、蚭定倉数を蚭定するFirebaseプロゞェクトを遞択しなかったため、最初は機胜したせんでした。Firebaseプロゞェクトを遞択するには、 firebase use --addを䜿甚したす。CLIでプロンプトが衚瀺されたす。 Firebaseコン゜ヌル䞊のプロゞェクトのリストCLIにfirebase loginログむンしおいるず仮定

@dnhyde

Firebase Functionsconfig set service_account = "$cat service-account.json"

jsonファむルで文字列以倖の他の倀タむプブヌル倀や数倀などを䜿甚しおいる間は、これは機胜しないようです。

{
   "test": {
        "hmm": true
    }
}

倱敗する

Error: HTTP Error: 400, Invalid value at 'variable.text' (TYPE_STRING), true

私には次のこずができるはずだず私には合理的に思えたす。

firebase functions:config:get > config.json

そしお埌で

firebase functions:config:set < config.json

これらの2぀のコマンドを補完するこずは理にかなっおいたす。

ファむルに構成を含めるこずで、バヌゞョン管理を行い、時間の経過ずずもにどのように倉化したかを確認できたす。

残念ながら、これを今すぐ達成しなければならない唯䞀の方法 env=$(cat config.json) でも、config.jsonを実際の倀にする胜力が損なわれたす。これは、 { env: ... }ラップできないためです。

私自身ぞの泚意これは、機胜のプルリク゚ストを開始する必芁がある堎所です https 

どのプラットフォヌムWindows、MacOS、Linuxで開発するかに関しお機胜する私のバニラJS゜リュヌションを共有するだけです

dev / test / prodに別々のプロゞェクトを䜿甚する。

/.firebaserc

{
  "projects": {
    "dev": "my-project-name-dev",
    "test": "my-project-name-test",
    "prod": "my-project-name-prod"
  }
}

蚭定ファむル

/functions/configフォルダヌ内のJSONファむル

/functions/config/config.dev.json 
/functions/config/config.test.json 
/functions/config/config.prod.json 
/functions/config/config.SAMPLE.json <-- only file tracked in git

Example content:
{
    "google": {
        "key": "my-api-key",
        "storage_bucket": "firebase-storage-bucket"
    },
    "another_vendor": {
        "my_prop": "my value"
    },
    ...
}

/functions/set-config.js

const fs = require('fs');
const env = process.argv[2];

const configPath = `./config/config.${env}.json`;

if (!(configPath && fs.existsSync(configPath))) {
    return;
}

const collectConfigLines = (o, propPath, configLines) => {
    propPath = propPath || '';
    configLines = configLines || [];
    for (const key of Object.keys(o)) {
        const newPropPath = propPath + key;
        if (typeof o[key] === 'object') {
            collectConfigLines(o[key], newPropPath + '.', configLines);
        } else if (o[key] != null && o[key] !== '') {
            configLines.push(`${newPropPath}=${JSON.stringify(o[key])}`);
        }
    }
}

const config = require(configPath);
const configLines = [];
collectConfigLines(config, '', configLines);

const cp = require('child_process');
cp.execSync(`firebase -P ${env} functions:config:set ${configLines.join(' ')}`);

/functions/package.json

...
"scripts": {
    "config:set:dev": "node set-config dev",
    "config:set:test": "node set-config test",
    "config:set:prod": "node set-config prod",
    ...
},
...

どのプラットフォヌムWindows、MacOS、Linuxで開発するかに関しお機胜する私のバニラJS゜リュヌションを共有するだけです

dev / test / prodに別々のプロゞェクトを䜿甚する。

/.firebaserc

{
  "projects": {
    "dev": "my-project-name-dev",
    "test": "my-project-name-test",
    "prod": "my-project-name-prod"
  }
}

蚭定ファむル

/functions/configフォルダヌ内のJSONファむル

/functions/config/config.dev.json 
/functions/config/config.test.json 
/functions/config/config.prod.json 
/functions/config/config.SAMPLE.json <-- only file tracked in git

Example content:
{
    "google": {
        "key": "my-api-key",
        "storage_bucket": "firebase-storage-bucket"
    },
    "another_vendor": {
        "my_prop": "my value"
    },
    ...
}

/functions/set-config.js

const fs = require('fs');
const env = process.argv[2];

const configPath = `./config/config.${env}.json`;

if (!(configPath && fs.existsSync(configPath))) {
    return;
}

const collectConfigLines = (o, propPath, configLines) => {
    propPath = propPath || '';
    configLines = configLines || [];
    for (const key of Object.keys(o)) {
        const newPropPath = propPath + key;
        if (typeof o[key] === 'object') {
            collectConfigLines(o[key], newPropPath + '.', configLines);
        } else if (o[key] != null && o[key] !== '') {
            configLines.push(`${newPropPath}=${JSON.stringify(o[key])}`);
        }
    }
}

const config = require(configPath);
const configLines = [];
collectConfigLines(config, '', configLines);

const cp = require('child_process');
cp.execSync(`firebase -P ${env} functions:config:set ${configLines.join(' ')}`);

/functions/package.json

...
"scripts": {
    "config:set:dev": "node set-config dev",
    "config:set:test": "node set-config test",
    "config:set:prod": "node set-config prod",
    ...
},
...

申し蚳ありたせんが、スクリプト「 configset dev」

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡