Edited at

FirebaseとGoogle Cloud Platform をさわれる環境を構築する

絶賛 Firebase 調査中です。そのさい、Qiitaの記事を書くときに毎回環境というかプロジェクトを構築する手順を書くのが面倒なので、この記事に環境構築手順を整理しておきます。必要に応じて適宜追加していくかもしれません。。


前提環境

$ sw_vers

ProductName: Mac OS X
ProductVersion: 10.14.3
BuildVersion: 18D42

$ node --version
v10.14.2 <-ホントはFunctionsとかのバージョンに合わせるべきなんだけどいったん気にしない :-)

$ brew --version (GCPのCLIをインストールするときに使用)
Homebrew 2.0.0
Homebrew/homebrew-core (git revision 175af; last commit 2019-02-02)
Homebrew/homebrew-cask (git revision 05a8; last commit 2019-02-02)
$


firebase-toolsのインストール

まずはfirebaseのコマンドライン。

$ npm install -g firebase-tools

$ source ~/.bash_profile
$ firebase --version
6.3.0


Firebaseにログイン

$ firebase login

? Allow Firebase to collect anonymous CLI usage and error reporting information?
No

Visit this URL on any device to log in:
https://accounts.google.com/o/oauth2/auth?client_id=... // OAuthでアクセスの認可まち

Waiting for authentication...

✔ Success! Logged in as masatomix@example.com


ためしにFunctionsをふくんだプロジェクト作成

$ mkdir fb_function_samples && cd $_

$ firebase init functions

######## #### ######## ######## ######## ### ###### ########
## ## ## ## ## ## ## ## ## ## ##
###### ## ######## ###### ######## ######### ###### ######
## ## ## ## ## ## ## ## ## ## ##
## #### ## ## ######## ######## ## ## ###### ########

You're about to initialize a Firebase project in this directory:
/tmp/fb_function_samples
=== Project Setup

First, let's associate this project directory with a Firebase project.
You can create multiple project aliases by running firebase use --add,
but for now we'll just set up a default project.

? Select a default Firebase project for this directory: xxxxxx-xxxx (xxxxxx) ← 使用するプロジェクト選択
? What language would you like to use to write Cloud Functions? TypeScript ← TypeScriptをえらんでみた
? Do you want to use TSLint to catch probable bugs and enforce style? Yes ← Yesをえらぶ
? Do you want to install dependencies with npm now? Yes

✔ Firebase initialization complete!
$

ディレクトリ構成は以下のようになりました。

$ tree -a 

.
├── .firebaserc
├── .gitignore
├── firebase.json
└── functions
├── .gitignore
├── package-lock.json
├── package.json
├── src
│ └── index.ts
├── tsconfig.json
└── tslint.json


ちなみに Select a default Firebase project ってなに

ちなみに Select a default Firebase project for this directory で選択した情報は、


.firebaserc

{

"projects": {
"default": "xxxxxx-xxxx"
}
}

と .firebaserc に書き込まれ、プロジェクトをデプロイするときに使用する下記のコマンドで

$ firebase deploy --only functions --project default

というように --projectオプションでデプロイ先のプロジェクトを指定するエイリアスとして使用できます。

プロジェクトのエイリアスは以下のコマンドで.firebaserc に追加することができるので

$ firebase use --add

? Which project do you want to add? yyyyyy-yyyyyyy
? What alias do you want to use for this project? (e.g. staging) test_env

Created alias test_env for yyyyyy-yyyyyyy.
Now using alias test_env (yyyyyy-yyyyyyy)

$ cat .firebaserc

{
"projects": {
"default": "xxxxxx-xxxx",
"test_env": "yyyyyy-yyyyyyy"
}
}
$

以下のように --project でエイリアスを明示的に指定することで、

$ firebase deploy --only functions --project test_env

デプロイ先を選択可能です。

ちなみに、エイリアスが複数あるときに --project 未指定のときのデプロイ先は、

$ firebase use

Active Project: test_env (yyyyyy-yyyyyyy)

Project aliases for /tmp/fb_function_samples:

default (xxxxxx-xxxx)
* test_env (yyyyyy-yyyyyyy)

Run firebase use --add to define a new project alias.

で確認できます。またそのデフォルトの変更方法は以下。

$ firebase use default

Now using alias default (xxxxxx-xxxx)

$ firebase use
Active Project: default (xxxxxx-xxxx)

Project aliases for /tmp/fb_function_samples:

* default (xxxxxx-xxxx)
test_env (yyyyyy-yyyyyyy)

Run firebase use --add to define a new project alias.

参考:

これで、あるGoogleアカウントにひもづいたFirebase環境に対して、Firebaseのプロジェクトを作成することができました。


Google Cloud Platform のCLIのインストール

Firebaseで作成されたプロジェクト、上記だと「xxxxxx-xxxx」「yyyyyy-yyyyyyy」とか書いてるヤツですが、これらは Google Cloud Platform (以下GCP) と共通化(?)されているようで、Firebaseにプロジェクトを作成すると、GCP側にもおなじプロジェクトが表示されます。

共通化ってはなしだと他にも、FirebaseのFunctionsは GCPがわのCloud Functionsと実質同じモノみたいだし、MySQLをつかおうとしてGCP側で課金をOnにしたら、同時にFirebase側の対応するプロジェクトも無料の Spark プラン から従量のBlazeプランに変更されたりしてました、、。

さてFirebaseをやってると、GCPの操作をしたいときもあり、なのでGCPを操作するCLIツール「google-cloud-sdk」も入れておきましょう。ちなみに直近GCPを操作するケースとして、Cloud Functions for FirebaseのPub/Subトリガーをつかおうとして、GCPのSDKからPublishコマンドを発行するケースがあったりしました。

ああ、あとFirebaseのFunctionsにはAWS LambdaのようなCron機能がないっぽく、2019/02/03時点ではβ版のCloud Scheduler ベータ版 を使用する事になりそうです。この操作もGCPのコマンドラインをつかうことになります。

さてインストールはMacのばあいですがHomebrewをつかいます

$ brew cask install google-cloud-sdk

$ gcloud init ← OAuth認可画面で、アカウントを選択する
$ gcloud components install beta ←β版機能を使うのに必要?

上記でアカウントとプロジェクトまで指定することになります。

あとはたとえば、

$ gcloud pubsub topics publish hogeTopic --message '{"name":"Xenia"}'

などとコマンドラインからPubSubへ(hogeTopicへ) Publishしたり、また

$ gcloud beta scheduler jobs list

ID LOCATION SCHEDULE (TZ) TARGET_TYPE STATE
test us-central1 * * * * * (Asia/Tokyo) HTTP ENABLED
topicTest us-central1 * * * * * (Asia/Tokyo) Pub/Sub ENABLED
$

などと、Cloud Schedulerの確認ができたりします。

参考):


まとめ

Firebase のコマンドラインツールと、Google Cloud Platform のコマンドラインツール をつかえる環境を構築する手順の整理でした。

この辺を整理したそもそもの目的は、Cloud Functions for Firebase にCrontab、、ようするにスケジュール設定をしようと調べてたら Google Cloud Platform のスケジューラ経由で Pub/Subでやるのがよさげ、、って結論になったからでした。。

FirebaseのFunctionsをスケジュール起動する方法は改めて整理したいと思います。

2019/02/04追記

整理しました

2019/02/04追記 ここまで

おつかれさまでした。