Cloud Firestore バックエンドを使用した REST API のホスト
はじめに
この記事は、
Hosting a REST API with a Cloud Firestore backend
という動画を参考に、『実際にやってみた』という記事になります。
この記事で実施する事。
- sample code を git clone する。
- Artifact Registory でリポジトリを作成。
- Cloud Firestore データベースを作成する。
- deploy.sh を編集して、イメージのビルドとプッシュ、
Cloud Runのデプロイまで行う。 - コレクションとドキュメントを手動で登録する。
- Postmanを使って、コレクションとドキュメントを登録する。
- 特定のURLのパスを実行して、Firestore からドキュメントを取得する。
以下はその必要となる大まかな構成になります。

Google Cloud Firestoreについて噛み砕いて理解しておく。
Google Cloud Firestore について噛み砕いた説明はスクラップにまとめました。
sample code を git clone する。
hosting-a-rest-api-with-a-cloud-firestore-backend を、git clone してください。
git clone https://github.com/GoogleCloudPlatform/serverless-expeditions.git
git cloneの実行が完了したら、cdコマンドを使って、対象のディレクトリ階層へ移動。
cd serverless-expeditions/hosting-a-rest-api-with-a-cloud-firestore-backend
サンプルコードは、Dockerイメージを、
Container Registry へデプロイします。
Container Registry は非推奨となっているため、
このブログでは、Artifact Registory に対して、
Dockerイメージがデプロイされるように修正します。
Artifact Registory でリポジトリを作成。
Dockerイメージをホストするためのリポジトリを作成。
GCPのプロジェクトIDのみ、自己の環境に書き換えてください。
リージョンは予め指定していますが、最寄りでない場合は書き換えてください。
gcloud artifacts repositories create dog-breed-api \
--repository-format=docker \
--location=asia-northeast1 \
--description="Docker repository" \
--project=# YOUR GCP PROJECT ID GOES HERE
Cloud Firestore データベースを作成する。
CREATE DATABASE をクリック。
この時、 CREATE DATABASE をクリックできない場合、
既存で Firestore Database が作られている可能性があります。
その場合、Datastoreモード で作られていると、
サンプルコードは ネイティブモード の Firestore Database に
対してのみ、動作する為、ネイティブモード に変えなければなりません。
ただし、一度作成してしまうと、モードを切り替える事ができない為、
新規でプロジェクトを立ち上げ直し、一から作り直す必要があります。

ネイティブモードを選択。

ロケーションを選択して、データベースを作成。
ロケーションは最寄りを選択。

ネイティブモードでデータベースが作成されていればOK

deploy.sh を編集して、イメージのビルドとプッシュ、Cloud Runのデプロイまで行う。
deploy.sh スクリプトは、ソースコードをGoogle Cloud に
デプロイするための一連のコマンドが書かれていますが、
サンプルは Container Registry に対して、
イメージをビルド、プッシュするようになっている為、
これを Artifact Registory にデプロイされるように修正します。
vimコマンドを使って、テキストエディタを開く。
vim deploy.sh
キーボードの i を実行して、編集モードに切り替える。
Artifact Registory に対して、
イメージのビルドとプッシュが行われるように、
下記のサンプルコード通りに書き換えてください。
GCPのプロジェクトIDのみ、自己の環境に書き換えてください。
リージョンは予め指定していますが、最寄りでない場合は書き換えてください。
GOOGLE_PROJECT_ID=# YOUR GCP PROJECT ID GOES HERE
REPOSITORY_NAME=dog-breed-api
LOCATION_NAME=asia-northeast1
gcloud builds submit --tag $LOCATION_NAME-docker.pkg.dev/$GOOGLE_PROJECT_ID/$REPOSITORY_NAME/barkbarkapi \
--project=$GOOGLE_PROJECT_ID
gcloud run deploy barkbark-api \
--image $LOCATION_NAME-docker.pkg.dev/$GOOGLE_PROJECT_ID/$REPOSITORY_NAME/barkbarkapi \
--platform managed \
--region=$LOCATION_NAME \
--project=$GOOGLE_PROJECT_ID
入力が終えたら、保存して編集モードを解除してください。
キーボードの : + w + q を実行で編集モードを解除できます。
deploy.sh スクリプトを実行して、Artifact Registory に
対して、イメージのビルドとプッシュを行ってください。
./deploy.sh
コマンド実行中に、Google Cloud Runサービスを
デプロイする際に、認証されていないユーザーからの
リクエストをサービスが、受け入れるかどうかを尋ねられます。
認証されていないユーザーからのリクエストを受け付けるなら、y
Google Cloud の IAMを通じて、特定のユーザー
もしくはサービスアカウントによるリクエストのみ
許可するなら、Nを入力してください。
Allow unauthenticated invocations to [barkbark-api] (y/N)?

デプロイされた Cloud Run の URL を実行して、
レスポンスが変えれば、Cloud Run のデプロイは完了です。


コレクションとドキュメントを手動で登録する。
Cloud Run の URL を使って、特定のパスに対して、
HTTPの GET リクエストが送れるように手動で、
コレクションとドキュメント作成します。
コレクションの登録画面が開いたら、
コレクションIDやドキュメント内の
フィールド情報を埋めて保存してください。
犬種 dalmatian の品種情報を登録します。
入力手順は、スクリーンショットを参考にしてください。
"name": "dalmatian",
"origin": "Croatia",
"lifeExpectancy": 12,
"type" : "companion"

Postmanを使って、コレクションとドキュメントを登録する。
コレクションとドキュメントを直接操作するのではなく、
Postmanを経由して、JSONデータを渡して、
登録する方法もありますので、ここではそれを実践します。
コードはすでにサンプルに書かれているので、
ここでは説明を省き、動作だけを確認します。
犬種 beagle の品種情報を登録します。
入力手順は、スクリーンショットを参考にしてください。
URL は、Cloud Run にデプロイされた対象のサービスを指定してください。
{
"name": "beagle",
"origin": "England",
"lifeExpectancy": 13,
"type" : "scent"
}

特定のURLのパスを実行して、Firestore からドキュメントを取得する。
Cloud Run の URL を使って、特定のパスに対して、
HTTPの GET リクエストを渡すことができれば成功です。
[デプロイしたCloudRunのURLのパス]/dalmatian
[デプロイしたCloudRunのURLのパス]/beagle

終わりに
今回の記事は、動画を視聴しまして、
実際に『手を動かしてみた』という内容でまとめました。
Cloud Firestore データベースは、これまで触れたことがなく、
特にネイティブモード と Datastoreモード に惑わされてしまいました。
知らぬ間に、 Datastoreモード で、
Cloud Firestore データベースが作られてしまっていた為、
初めからプロジェクトを作り直すことになってしまったり、
全く関係のない、Firebaseプロジェクトを立ち上げてしまう等、
てんてこ舞いとなって、実装までに、時間がかかってしまいました。
Cloud Firestore データベースを使って、
NoSQLのドキュメントを管理したいが、
その前に軽く学習してみたいと考えていましたら、
参考にしていただけると幸いです。
この記事が読まれている方にとって、
参考になる記事となりましたら、『いいね』を
付けていただけますと、励みになりますので、
よろしくお願いします。
Discussion