📑

Cloud Firestore バックエンドを使用した REST API のホスト

2023/11/10に公開

はじめに

この記事は、
 Hosting a REST API with a Cloud Firestore backend
という動画を参考に、『実際にやってみた』という記事になります。

この記事で実施する事。

  • sample code を git clone する。
  • Artifact Registory でリポジトリを作成。
  • Cloud Firestore データベースを作成する。
  • deploy.sh を編集して、イメージのビルドとプッシュ、
    Cloud Runのデプロイまで行う。
  • コレクションとドキュメントを手動で登録する。
  • Postmanを使って、コレクションとドキュメントを登録する。
  • 特定のURLのパスを実行して、Firestore からドキュメントを取得する。

以下はその必要となる大まかな構成になります。
image.png

Google Cloud Firestoreについて噛み砕いて理解しておく。

Google Cloud Firestore について噛み砕いた説明はスクラップにまとめました。
https://zenn.dev/tomoyuki_suzuki/scraps/29fb1c4c493233

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
対してのみ、動作する為、ネイティブモード に変えなければなりません。

ただし、一度作成してしまうと、モードを切り替える事ができない為、
新規でプロジェクトを立ち上げ直し、一から作り直す必要があります。

firestore_create_database.png

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

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

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

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)? 

cloudrun_access.png

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

cloudrun_url.png

cloudrun_url_top.png

コレクションとドキュメントを手動で登録する。

Cloud RunURL を使って、特定のパスに対して、
HTTPの GET リクエストが送れるように手動で、
コレクションとドキュメント作成します。

コレクションの登録画面が開いたら、
コレクションIDやドキュメント内の
フィールド情報を埋めて保存してください。

犬種 dalmatian の品種情報を登録します。
入力手順は、スクリーンショットを参考にしてください。

"name": "dalmatian",
"origin": "Croatia",
"lifeExpectancy": 12,
"type" : "companion"

cloudfirestore_data_create3.png

Postmanを使って、コレクションとドキュメントを登録する。

コレクションとドキュメントを直接操作するのではなく、
Postmanを経由して、JSONデータを渡して、
登録する方法もありますので、ここではそれを実践します。

コードはすでにサンプルに書かれているので、
ここでは説明を省き、動作だけを確認します。

犬種 beagle の品種情報を登録します。
入力手順は、スクリーンショットを参考にしてください。
URL は、Cloud Run にデプロイされた対象のサービスを指定してください。

{
    "name": "beagle",
    "origin": "England",
    "lifeExpectancy": 13,
    "type" : "scent"
}

cloudfirestore_data_create2.png

特定のURLのパスを実行して、Firestore からドキュメントを取得する。

Cloud RunURL を使って、特定のパスに対して、
HTTPの GET リクエストを渡すことができれば成功です。

[デプロイしたCloudRunのURLのパス]/dalmatian
[デプロイしたCloudRunのURLのパス]/beagle

cloudrun_beagle.png

終わりに

今回の記事は、動画を視聴しまして、
実際に『手を動かしてみた』という内容でまとめました。

Cloud Firestore データベースは、これまで触れたことがなく、
特にネイティブモードDatastoreモード に惑わされてしまいました。

知らぬ間に、 Datastoreモード で、
Cloud Firestore データベースが作られてしまっていた為、
初めからプロジェクトを作り直すことになってしまったり、
全く関係のない、Firebaseプロジェクトを立ち上げてしまう等、
てんてこ舞いとなって、実装までに、時間がかかってしまいました。

Cloud Firestore データベースを使って、
NoSQLのドキュメントを管理したいが、
その前に軽く学習してみたいと考えていましたら、
参考にしていただけると幸いです。

この記事が読まれている方にとって、
参考になる記事となりましたら、『いいね』を
付けていただけますと、励みになりますので、
よろしくお願いします。

Discussion