1. masatomix

    Posted

    masatomix
Changes in title
+FirebaseとGoogle Cloud Platform をさわれる環境を構築する
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,251 @@
+
+絶賛 [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をつかいます
+
+```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をスケジュール起動する方法は改めて整理したいと思います。
+
+おつかれさまでした。
+
+