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


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


### 前提環境

```bash
$ 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のコマンドライン。

```bash
$ npm install -g firebase-tools
$ source ~/.bash_profile
$ firebase --version
6.3.0
```

### Firebaseにログイン

```bash
$ 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をふくんだプロジェクト作成


```bash
$ 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!
$
```


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


```bash
$ 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`` で選択した情報は、

```json:.firebaserc
{
  "projects": {
    "default": "xxxxxx-xxxx"
  }
}
```

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

```bash
$ firebase deploy --only functions --project default
```

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


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

```bash
$ 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)
```

```bash
$ cat .firebaserc
{
  "projects": {
    "default": "xxxxxx-xxxx",
    "test_env": "yyyyyy-yyyyyyy"
  }
}
$
```

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

```bash
$ firebase deploy --only functions --project test_env
```
デプロイ先を選択可能です。

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


```bash
$ 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.
```

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

```bash
$ 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.
```

参考:

- [プロジェクト エイリアスを管理する](https://firebase.google.com/docs/cli/?hl=ja#managing_project_aliases)



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


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

Firebaseで作成されたプロジェクト、上記だと「xxxxxx-xxxx」「yyyyyy-yyyyyyy」とか書いてるヤツですが、これらは [Google Cloud Platform](https://console.cloud.google.com) (以下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](https://firebase.google.com/docs/functions/?hl=ja)のPub/Subトリガーをつかおうとして、GCPのSDKからPublishコマンドを発行するケースがあったりしました。

ああ、あとFirebaseのFunctionsにはAWS LambdaのようなCron機能がないっぽく、2019/02/03時点ではβ版の[Cloud Scheduler ベータ版](https://cloud.google.com/scheduler/?hl=ja) を使用する事になりそうです。この操作もGCPのコマンドラインをつかうことになります。

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


**--2019/09/21追記--**
[Google Cloud SDK のインストール/アンインストールメモ(公式バージョン)](https://qiita.com/masatomix/items/57891a026856f5c39a7e) で``brew cask``じゃない公式のインストール方法を整理しました。また2019/09/21時点スケジューラがベータじゃなくなってるようで、beta componentsの追加インストールなどは不要です。
**--2019/09/21追記 以上--**


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

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

あとはたとえば、

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

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

```bash
$ 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の確認ができたりします。



参考):

- [クイックスタート: gcloud コマンドライン ツールの使用](https://cloud.google.com/pubsub/docs/quickstart-cli?hl=ja)
- [cron ジョブ スケジュールの構成](https://cloud.google.com/scheduler/docs/configuring/cron-job-schedules?hl=ja)
- https://cloud.google.com/sdk/gcloud/reference/?hl=ja




### まとめ

Firebase のコマンドラインツールと、Google Cloud Platform のコマンドラインツール をつかえる環境を構築する手順の整理でした。
この辺を整理したそもそもの目的は、[Cloud Functions for Firebase](https://firebase.google.com/docs/functions/?hl=ja) にCrontab、、ようするにスケジュール設定をしようと調べてたら [Google Cloud Platform](https://console.cloud.google.com) のスケジューラ経由で Pub/Subでやるのがよさげ、、って結論になったからでした。。


FirebaseのFunctionsをスケジュール起動する方法は [Cloud Functions for Firebase の関数をスケジューラから定期的に呼び出す](https://qiita.com/masatomix/items/b40a2c604319e52df4bf) に整理しました。



おつかれさまでした。