Firebase で Cloud Functions を簡単にはじめよう

# Cloud Functions for Firebase とは
Cloud Functions のラップのようなもので Firebase の各機能との連携が取りやすくなっているらしい。

Firebase の各機能についてはこちらの記事が参考になる:

- [わかる！Firebase ～全てのサービスをおつまみ紹介～](https://qiita.com/dogwood008/items/fa95b62ad151f823af70)

後述する `firebase-tools` により、コマンドラインからコマンドひとつでボイラープレートの作成とデプロイが簡単にできるようになっている。

これは主観だけど、今までずっと使ってきた **AWS Lambda** なんかより格段にとっつきやすい感じがする。Firebase は Web の画面も UI が洗練されてるから使ってて気持ちいい。すぐできるから今すぐチャレンジ。

# 必要なもの

- Google アカウント
- Node 環境 (私は v8.11.2)
- 3分程度のやる気 :sparkles: 

**追記1:** 本記事公開時点での推奨バージョンは v6.14.0 とのことです！ (@mono0926 さんコメントありがとうございます:smile:)
**追記2:** 2020年05月時点で、v8 と v10 がサポートされています。

> ref: https://firebase.google.com/docs/functions/get-started
> Cloud Functions は Node v6.14.0 を実行するので、このバージョンでローカルに開発することをおすすめします。

# firebase コマンドの導入

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

これで、 `firebase` コマンドが叩けるようになりました。

不安ならシェルをリロードしても良いでしょう。

```
$ exec $SHELL -l
```

# プロジェクトの作成
```
$ mkdir foobar
$ cd foobar
$ firebase init
```

`firebase init` はインタラクティブになっており、下記の選択項目が控えている。基本的にはスペースキーで選択してエンターキーで確定し進める。

- どの機能を利用するか
    - 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
- デフォルトプロジェクトの設定
    - **`[don't setup a default project]`** (デフォルトプロジェクトを設定しない)
    - **`Firebase Demo Project (fir-demo-project)`** （Firebase デモプロジェクト）
    - **`FooBar (foobar-d0c13)`** (既存のプロジェクト FooBar)
    - **`[create a new project]`** (プロジェクトを新規作成)

- Cloud Function を記述する言語の選択
    - JavaScript
    - TypeScript
- ESLintを使用するか (Y/n)
- 依存パッケージを今すぐインストールするか (Y/n)

# コードを書く

`firebase init` 後には `functions` ディレクトリ以下にテンプレートが展開されている。Hello World 程度ならこれを編集するだけで良い。

```javascript:funcions/index.js
const functions = require('firebase-functions');

// Create and Deploy Your First Cloud Functions
// https://firebase.google.com/docs/functions/write-firebase-functions

exports.helloWorld = functions.https.onRequest((request, response) => {
  response.send("Hello from Firebase!");
});
```

他にも好きな npm パッケージをガシガシいれてコード書いてください。端折ります。

# デプロイ手順

まず、ログインしていなければログインする必要がある。Firebase CLI に権限を与えるかどうか尋ねるブラウザが開くので承認するボタンをクリックする。

```
$ firebase login
```

そして、デプロイコマンドを叩く

```
$ firebase deploy
```

URL が発行されるので、テストアクセスしてみてください。（ちなみに下記のURLは無効なものです）

```
Function URL (helloWorld): https://us-central1-foobar-d0c13.cloudfunctions.net/helloWorld
```

ブラウザに `Hello from Firebase` と表示されたのなら、デプロイは成功。

# 請求先アカウントについて

請求先アカウントが未登録の状態でも動作確認できました。しかし、ログにも出てくるように当然ながら制限があります。

<img width="1107" alt="Screen Shot 2018-07-01 at 23.22.05.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/13842/27e26a03-b38a-2a21-21f1-5b3d089ab057.jpeg">

> Billing account not configured. External network is not accessible and quotas are severely limited. Configure billing account to remove these restrictions

> (請求先アカウントが設定されていません。 外部ネットワークにはアクセスできず、クォータも厳しく制限されています。 これらの制限を削除するには、請求先アカウントを設定してください。)

# まとめ
1. `firebase login` (一度で良い)
2. `firebase init`
3. `functions` 配下にコード書く
4. `firebase deploy`

超簡単でびっくり。当初は [Serverless Framework](https://serverless.com/) 経由で Google Cloud Functions を使おうとしていたのですが、調べてみると Firebase Tools でも同等のことができて、さらに楽チンだったのでこちらの方法でやることになったのでした。

Firebase やっていくぞ :muscle: