Firebaseを使ってみた　〜第一章  サービスをデプロイする 〜

React Hooksを使いチャットボットアプリを作成しています。（その辺の内容はいつかの記事で…）
バックエンド環境はFirebaseを使ってみました。設定内容やデプロイ までの過程を三章構成で記録しておきます。

第一章　サービスをデプロイする 
<a href="https://qiita.com/iiizoo/items/a946be93d2475647dfec">第二章　Firestoreにデータを保存する</a>
<a href="https://qiita.com/iiizoo/items/4afa65a3a79820a2b78b">第三章　Firestoreからデータを取得する</a>　

<h2>Firebaseとは</h2>
Googleが提供しているBaaS(※)
バックエンド側の開発工数を抑え、アプリ側の開発に注力できるのがメリットです。

※BaaS：backend as a serviceの略
　　　 アプリ開発におけるバックエンド環境を提供してくれるサービス

<h2>デプロイ までの流れ</h2>
[1. プロジェクトを作成する](#menu1)
[2. 諸々設定をする](#menu2)
[3. パッケージをインストールする](#menu3)
[4. Firebaseにローカル環境を構築する](#menu4)
[5. デプロイ する](#menu5)

<h2 id="menu1">1. プロジェクトを作成する</h2>
<a href="https://firebase.google.com/">Firebase</a>にログインしてプロジェクトを作成します。
（Googleアカウントでログイン可能）
![スクリーンショット 2020-10-03 12.58.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578913/4488e823-e35a-008c-671e-31d01487a79a.png)

プロジェクトに名前をつけます。
![スクリーンショット 2020-10-03 13.02.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578913/22e9b768-dda8-8c36-afac-2001f7c4255e.png)

ここのチェックはどちらでもOKだと思います。（私は一旦つけたままで・・）
![スクリーンショット 2020-10-03 13.03.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578913/f84fff4c-9622-d233-8cff-3def982fde9d.png)

ご自身のアカウントを選択して、「プロジェクト作成」をクリック
![スクリーンショット 2020-10-03 13.03.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578913/c90d30fa-a765-cad2-a30c-ca050466865d.png)

しばらくするとプロジェクトが生成されます。


<h2 id="menu2">2. 諸々設定をする</h2>
ここから諸々設定していきます。
まず、リソースロケーションの設定を行っていきます。

歯車マークから「プロジェクトを設定」を選択します。
![スクリーンショット 2020-10-03 13.09.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578913/94763d48-c031-2a4d-8cef-a697eaf498c2.png)

リソースロケーションを設定します。
![スクリーンショット 2020-10-03 13.10.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578913/60a03937-a39a-1f12-8103-ca262bfc7726.png)

「asia-northeast1」を選択します。
※ここで選択を間違えると後から修正できず面倒なので注意します。
![スクリーンショット 2020-10-03 13.12.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578913/c7a4a9a0-3483-e24d-08b4-eda89e77dd61.png)

そのまま同じ設定ページの下部にあるマイアプリを選択していきます。
今回はWebアプリを作成したいのでコードマークを選びました。
![スクリーンショット 2020-10-03 13.17.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578913/4625a895-bd9b-e2aa-6dfb-65e7425f78b7.png)

アプリのニックネーム（プロジェクト名と同じでいいと思います）を入力し、
「このアプリ〜」にチェックを入れて、「アプリを登録」をクリックします。
![スクリーンショット 2020-10-03 13.18.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578913/43ff4ebf-448b-7703-2b6e-e89c2ea6da24.png)

「Firebase SDKの追加」〜など全て「次へ」で遷移をし、最後に「コンソールに進む」を選択します。
![スクリーンショット 2020-10-03 13.19.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578913/e66dc2e0-fe89-fde2-e2c0-670b24fb1aaf.png)


<h2 id="menu3">3. パッケージをインストールする</h2>

firebase-toolsをグローバルインストールします。（すでにインストール済みの場合は対応不要です。）

```
npm install -g firebase-tools
```

作業ディレクトリに移動し、以下のコマンドを実行します。

```
npm install --save firebase
```

完了後、package.jsonファイルに最新のfirebaseが追加されたことが確認します。


<h2 id="menu4">4. Firebaseにローカル環境を構築する</h2>
以下のコマンドを実行してFirebaseにログインします。

```
firebase login
```

以下の内容を聞かれるので、そのままEnterを押して許可します。
その後Firebaseのアクセス許可画面が出力されるので、同じく許可をします。成功画面を確認してターミナルに戻ります。

```
? Allow Firebase to collect anonymous CLI usage information? (Y/n)
```


次に以下のコマンドを実行し、先ほど作成したFirebaseの環境へローカルの内容を接続させます。

```
firebase init
```

「FIREBASE」の文字が出力されれば成功です。
続いて以下設定をしていきます。

まず1つ目、どのサービスを使うか選択します。
矢印キーで移動、spaceキーで選択、Enterキーで確定できます。
今回私は「Firestore」、「Functions」、「Hosting」の3つを使いました。

```
? Which Firebase CLI features do you want to set up for this folder? Press Space to select features, then Enter to confirm your choices. (Press 
<space> to select, <a> to toggle all, <i> to invert selection)
❯◯ Database: Deploy Firebase Realtime Database Rules
 ◯ Firestore: Deploy rules and create indexes for Firestore
 ◯ Functions: Configure and deploy Cloud Functions
 ◯ Hosting: Configure and deploy Firebase Hosting sites
 ◯ Storage: Deploy Cloud Storage security rules
 ◯ Emulators: Set up local emulators for Firebase features
 ◯ Remote Config: Get, deploy, and rollback configurations for Remote Config
```


先ほどFirebaseの中でプロジェクトを作成したので、「Use an existing project」を選択、作成したプロジェクト名を選びます。

```
? Please select an option: (Use arrow keys)
❯ Use an existing project 
  Create a new project 
  Add Firebase to an existing Google Cloud Platform project 
  Don't set up a default project 
```


以下質問が続きますが、特にデフォルトで問題ないのでそのままEnterで進みます。

```
? What file should be used for Firestore Rules? (firestore.rules)
? What file should be used for Firestore indexes? (firestore.indexes.json) 
```

Cloud Functionsをどの言語で作るか聞かれます。使いたい方を選択します。
その後選択した言語により諸々聞かれますがそのままYES(Enter)で進みます。

```
? What language would you like to use to write Cloud Functions? (Use arrow keys)
❯ JavaScript 
  TypeScript 
```

本番用のフォルダを聞かれます。デフォルトは「public」ですが、
今回create-react-appで作ったReactのサービスをデプロイ したいので、ここは「build」を入力します。

```
? What do you want to use as your public directory? (public) 
```

デフォルトはNOですが、今回シングルページ で作成したいのでYESで進みます。

```
? Configure as a single-page app (rewrite all urls to /index.html)? (y/N)
```

エディタを見てもらうと以下のファイルが生成されていることを確認できます。

![スクリーンショット 2020-10-11 9.37.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578913/e2484bd2-062f-765c-4c07-3f30767cc668.png)


以上で構築終了です！

<h2 id="menu5">5. デプロイ する</h2>

ターミナルで以下コマンドを実行します。
まだビルドしていない場合は先に「$ npm run build」を行い、下記コマンドを実行します。

```
firebase deploy
```

完了後、Hosting URLが生成されるのでそちらをブラウザで確認します。

<h2 id="menu6">6. まとめ</h2>
以上でFirebaseへのサービスデプロイ が完了しました。
いくつかの設定を行うだけで簡単にデプロイ ができました。続いてFirestore(データベース)に使用するデータを保存していきます。（<a href="https://qiita.com/iiizoo/items/a946be93d2475647dfec">第二章へ</a>・・・）


<h2 id="menu7">7. APPENDIX</h2>
- firestoreのセキュリティを見直す<br>
自由に書き込みができないように設定します。詳しいセキュリティ内容は<a href="https://firebase.google.com/docs/firestore/security/rules-conditions?hl=ja"> こちら</a>から確認できます。

```firestore.rules
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, 
      allow write: if request.auth.uid != null;
    }
  }
}
```