Firebase(Sparkプラン：無料枠) でRealtimeDBの自動バックアップを実施する

##【はじめに】
 - WEB系エンジニア歴6ヶ月目くらいなので記述などに間違いがあるかもしれないので優しく見守ってください。なので・・・間違いやご指摘があったら教えてください。
 - Firebase RealtimeDBのBlazeプラン(有料)には自動バックアップ機能があるので有料プラン使ってる人には関係ない話です。
 - 以下のサイトを参考に、自分の忘備録的な雰囲気の記事となっております。
  - [Cloud Functions for Firebase でジョブをスケジューリング（cron）する](https://developers-jp.googleblog.com/2017/04/how-to-schedule-cron-jobs-with-cloud.html) 
  - [FirebaseのSparkプラン（無料枠）でRealtimeDBの自動バックアップを構築する](http://osamtimizer.hatenablog.com/entry/2018/05/13/164424)

##【実行環境】
- Mac(OS:High Sierra)

##【前提条件】
- Firebaseにプロジェクト作成済。	
- Firebaseで作成したプロジェクトがGCP上でも確認できていること。<br>
(Firebaseで作成したら自動的に？GCP側にもプロジェクトが作成されるらしい）	
- Cloud Build APIサービスが課金対象となっていること
 ⇒ <strong>[サービスが課金対象となっているか確認する](https://console.developers.google.com/apis/api/cloudbuild.googleapis.com/overview?)</strong>

- 以下のツールがインストール、利用できること
1.　git
2.　Python2.7
3.　Python pip
4.　Google Cloud SDK
6.　Firebase CLI

##【構築手順】
###1.プログラム取得・ディレクトリ構成確認
#####(1)とりあえず、gitHubからモジュール取得
　※ 公式のプログラムではなく、個人的に手を加えたプログラムとなっているので注意！！

```Terminal:Terminal
$ git clone https://github.com/Nunnally-Engr/firebase-rdb-backup-cron
```
#####(2)ディレクトリ変更
```Terminal:Terminal
$ cd firebase-rdb-backup-cron
```
#####(3)ディレクトリ 構成確認
![手順1-3_ディレクトリ構成.png](https://qiita-image-store.s3.amazonaws.com/0/252086/ebdba26e-891f-6ae0-922e-6ab6b8e75736.png)

###2.実際のプログラムの中身の確認
- 今回確認＆修正するプログラムは以下の通り。
 - .firebaserc
 - functions/index.js
 - functions/src/cron/backup.js
 - appengine/cron.yaml

- .firebaserc
 - [Firebase:プロジェクト名]の部分に、ご自分で作成されたプロジェクトIDを記入する。
![firebaserc.png](https://qiita-image-store.s3.amazonaws.com/0/252086/c9f443a8-e44a-9463-27a4-8e14f168661c.png)

- functions/index.js
 - App Engineから実際に呼び出される関数。Functionsをdeployしたら、この関数名が表示される。
 - ここでは〜.topic内の文字列("data-bakup-all")とappengine/cron.yamlのurl部分("/publish/data-bakup-all")がポイント！！<br>
![function_indexjs.png](https://qiita-image-store.s3.amazonaws.com/0/252086/f0a47e7b-f402-7375-745f-79d3e15ad34d.png)

- functions/src/cron/backup.js
 - 上記で説明したindex.jsから呼び出している関数。実際に、RealtimeDBを参照して、Admin Cloud Storage API経由でGCPのバケット機能を使ってBackup用のjsonファイルを作成する処理となる。(ソースの内容は割愛)

- appengine/cron.yaml
 - 今回は、24時間ごとにBackupを取る設定している。<br>追加でスケジューリングの設定する場合はこのファイルで設定する。<br>※ 詳細はGoogle公式の[cron.yaml リファレンス：schedule の書式](https://cloud.google.com/appengine/docs/standard/python/config/cronref?hl=ja#formatting_the_schedule)に記載されている。
![cron_yaml.png](https://qiita-image-store.s3.amazonaws.com/0/252086/de3560ca-5350-3c99-fe93-f1e0b0f00957.png)

###３.Firebase CloudFunctionsにdeployする
##### (1)Firebaseにログインする
```Terminal:Terminal
$ firebase login
```
##### (２)Firebaseで使用しているプロジェクトの確認(※省略可)
```Terminal:Terminal
$ firebase list
```
##### (3)使用するプロジェクトの選択(※選択されている場合は省略可)
```Terminal:Terminal
$ firebase use　[プロジェクトID]
```
##### (4)ディレクトリ移動
```Terminal:Terminal
$ cd functions/
```
##### (5)deploy実行
```Terminal:Terminal
$ firebase deploy --only functions
```
【参考】もしくは・・・特定のFunctionのみdeploy

```Terminal:Terminal
$ firebase deploy --only functions:dataBackupAll
```
##### (6)deployできていることをFirebaseのFunctions上で確認
![Firebase Function.png](https://qiita-image-store.s3.amazonaws.com/0/252086/038a80a0-99a2-ebb8-2bb2-f2a979374282.png)


###4.GCP のApp EngineにCronジョブをdeployする
##### (１)GCPで使用しているプロジェクトの確認(※省略可)
```Terminal:Terminal
$ gcloud projects list
```
##### (2)使用するプロジェクトの選択(※選択されている場合は省略可)
```Terminal:Terminal
$ gcloud config set project [プロジェクトID]
```
##### (3)『appengine』ディレクトリへ移動
```Terminal:Terminal
$ cd appengine/
```
##### (4)pipを使って必要なパッケージをインストールする
```Terminal:Terminal
$ pip install -t lib -r requirements.txt
```
##### (5)App Engineアプリを作成する(※作成されている場合は省略可)
```Terminal:Terminal
$ gcloud app create
```
##### (６)deploy実行
```Terminal:Terminal
$ gcloud app deploy app.yaml \cron.yaml
```
##### (7)deployできていることをGCPのApp Engine上で確認
![確認1_AppEngine⇒Cronジョブ.png](https://qiita-image-store.s3.amazonaws.com/0/252086/76dadc3e-b15b-85bb-f005-895dab30ed78.png)
![確認1_AppEngine⇒Cronジョブ2.png](https://qiita-image-store.s3.amazonaws.com/0/252086/b8e02c84-e625-cecf-6ea5-91d6ff6379d3.png)

##【動作確認】
###1.App EngineのCronジョブで「今すぐ実行」する
![確認①.png](https://qiita-image-store.s3.amazonaws.com/0/252086/b7df51c7-506c-7e8e-0c85-16b2ad2df4f2.png)
###2.Firebaseのfunctionsのログに、「stream:successfully finished.」と表示されていれば処理は正常終了となる。
※ 実行して、jsonファイルが作成できるまで少し時間がかかることもあるので必ずログを確認すること。
![ログ.png](https://qiita-image-store.s3.amazonaws.com/0/252086/ab5191c0-ad74-d296-523c-fda9026ded0c.png)
###3.さらに、FirebaseのStorageにjsonファイルができていたら問題なし。
![確認②.png](https://qiita-image-store.s3.amazonaws.com/0/252086/2304b3c1-8a58-4657-530b-de3515d51cb7.png)

##【その他メモ・・・】
- Firebase側のプロジェクトを見たら、従量課金になっていたので無料枠に戻したら"gcloud app deploy" ができなくなった。
 ⇒ <font style="color:darkcyan;">Cloud Build APIサービスを一度無効にして、再度有効に戻したらdeployができた。</font>

##【終わりに】
- GCPの操作とか仕組みや癖？を知っていたら数分でできるのだろうけど、私は結構苦労しました💦<br>
ただ、一度作ると簡単に思えてきたので個人プロダクトとかには有効かと。<br>
お金があるならもちろん有料プランをおすすめ（笑）<br>
次は自動で削除とかそっち方面のものを作ってみようかと考えてます。