SkeetとFirebaseでサーバーレスDiscordボット開発への扉を開こう！🚪🤖☁️

SkeetのTypeScriptベースのフレームワークを駆使して、効率的かつシンプルなサーバーレス環境を構築する冒険に出かけましょう。
この章では、Google CloudとFirebaseとの強力な統合を通じて、Discordボットのための確固たる基盤を築く方法を探ります。
また、サーバーレスアーキテクチャの基礎から利点までをわかりやすく解説し、サーバーレス技術の全体像を掴むためのガイドとなります。

## 🧪 必須の依存パッケージ 📦

必要なツールとパッケージの一覧です。これらをインストールすることで、サーバーレス開発の準備が整います。

- [TypeScript](https://www.typescriptlang.org/) 5.0.4 以上
- [Node.js](https://nodejs.org/ja/) 18.17.1 以上
- [Yarn](https://yarnpkg.com/) 1.22.19 以上
- [Google Cloud SDK](https://cloud.google.com/sdk/docs/install) 430.0.0 以上
- [Firebase CLI](https://firebase.google.com/docs/cli) 12.0.1 以上
- [GitHub CLI](https://cli.github.com/) 2.29.0 以上
- [Java](https://www.java.com/en/download/)

※ Skeet において Java を書くことはありませんが、モバイルアプリを動かすために必要です

## 🔧 SkeetとFirebase Toolsのセットアップ 🔨

SkeetとFirebase Toolsのインストールは、サーバーレス開発の第一歩。
これらのツールを使って、あなたのアプリケーションが実現します。

```bash
npm install -g firebase-tools
npm i -g @skeet-framework/cli
```

## 🚀 Skeetアプリの初期設定 🌟
フルスタックサーバーレス開発の心臓部、Skeetアプリの作成方法を紹介します。
ここからあなたのアプリケーションが形を成します。

```bash
$ skeet create <appName> --backend
```
![Skeet create backend](https://storage.googleapis.com/zenn-user-upload/655b9d599052-20231113.png)


## 💻 ローカルでのアプリ起動とテスト 🖥️

開発の核心、ローカルでのアプリ起動。
Firebaseエミュレーターを使ったテストで、アプリの挙動を確認しましょう。

```bash
$ cd <appName>
$ skeet s
```
Firebase エミュレーターが起動します。

💻 Firebase Emulator - [http://localhost:4000/](http://localhost:4000/) 
 

## 🤖 Google CloudとFirebaseアカウントの連携 🌐

Google CloudとFirebaseアカウントを活用して、プロジェクトの基盤を築きます。このステップが、サーバーレス開発の基礎を固めます。

## ☁️　Google Cloud と Firebaseプロジェクトの作成 🛠️

Google CloudとFirebaseでのプロジェクト設定を行います。
以下のリンクよりそれぞれプロジェクトを作成して下さい。

Google Cloud プロジェクトの作成

https://console.cloud.google.com/projectcreate

Firebase プロジェクトの作成

https://console.firebase.google.com

- Firestore の有効化
  ![画像](https://storage.googleapis.com/skeet-assets/imgs/backend/create-fb-firestore.png)

- 環境を選択
  ![画像](https://storage.googleapis.com/skeet-assets/imgs/backend/select-env-firestore.png)

- リージョンを選択
  ![画像](https://storage.googleapis.com/skeet-assets/imgs/backend/select-region-firestore.png)


## 🌐 Skeetの初期化とFirebaseへのログイン 🖇️

`skeet init` コマンドを使って、プロジェクトを初期化し、Firebaseアカウントにログイン。
これで、あなたのアプリがクラウドと完全に同期されます。

`skeet init` コマンドに `--login` オプションを付けて実行し、
プロジェクト ID と リージョンを選択してください。
そして、表示された URL にアクセスし、Firebase アカウントへログインします。

```bash
// Please login to Google Cloud if you have not
$ gcloud auth login

$ skeet init --login
? What's your GCP Project ID skeet-demo
? Select Regions to deploy
  europe-west1
  europe-west2
  europe-west3
❯ europe-west6
  northamerica-northeast1
  southamerica-east1
  us-central1

Visit this URL on this device to log in:

https://accounts.google.com/o/oauth2/auth?project...

Waiting for authentication...
```

## 🛠️ 環境変数の管理とセキュリティ 🗝️

- Firebase Blaze プランへのアップグレード

Skeet Framework では環境変数を Cloud Secret Manager 使って API キーなどの機密情報を管理します。

https://firebase.google.com/docs/functions/config-env?hl=ja&gen=2nd

このコマンドを利用するには、Firebase Blaze 以上のプランが必要です。

![画像](https://storage.googleapis.com/skeet-assets/imgs/backend/firebase-plan.png)

Firebase コンソールの左下のメニューから、_アップグレード_ を選択します。

https://console.firebase.google.com/u/0/project/_/usage/details

## 💸 Skeet Frameworkのクラウド使用料とコスト管理 💰

Skeet Framework は Firebase Blaze プラン以上のプランが必要ですが、
通常、開発環境への使用料は以下の無料枠内で収まります。

Google Cloud の無料枠には 2 つの部分があります

- 90 日間の無料トライアル。Google Cloud サービスで使用できる 300 ドルのクレジットが付いています。
- Always Free は、多くの一般的な Google Cloud リソースへの制限付きアクセスを無料で提供します。

https://cloud.google.com/free/docs/free-cloud-features?hl=ja

https://firebase.google.com/pricing?hl=ja#blaze-calculator

**⚠️ 想定外の請求を回避するために、予算のアラートなどを設定することをおすすめします ⚠️**

想定外の請求を回避する

https://firebase.google.com/docs/projects/billing/avoid-surprise-bills

## 🚀 アプリのデプロイと公開 🌍

アプリをクラウドにデプロイする際の重要なステップ、それが `skeet deploy` コマンドの使用です。
このコマンドは、デプロイ可能な Firebase Functions のエンドポイントを一覧表示し、選択肢を提供します。
デフォルト設定では、rootというHttpエンドポイントが既に用意されています。
スペースキーを押すだけでこのエンドポイントを選択し、デプロイのプロセスに進むことができます。

```bash
skeet deploy
? Select Functions to deploy (Press <space> to select, <a> to toggle all, <i> to
 invert selection, and <enter> to proceed)
  = Functions =
❯◯ root
```

`skeet deploy` コマンドの素晴らしいところは、Firebase の Functionsを個別に選択してデプロイや更新を簡単かつ効率的に行える点にあります。
この手順により、開発者はプロジェクトの特定の部分を迅速に更新し、アプリケーションのメンテナンスをより柔軟に行うことが可能となります。

アプリケーションのデプロイは、単なる公開以上の意味を持ちます。これはあなたのアプリが世界に対して開かれ、リアルタイムでの対話を始める瞬間です。`skeet deploy` を使って、あなたのアプリケーションを無限の可能性へと導きましょう🎵