Cloud Run からフルマネージド データベースへの接続

1. 概要

このラボでは、サーバーレス データベース(Spanner と Firestore)を Cloud Run で実行されているアプリケーション(Go と Node.js)と統合します。Cymbal Eats アプリケーションには、Cloud Run で実行される複数のサービスが含まれています。次の手順では、Cloud Spanner リレーショナル データベースと Cloud Firestore(NoSQL ドキュメント データベース)を使用するようにサービスを構成します。データ階層とアプリケーション ランタイムにサーバーレス プロダクトを使用すると、すべてのインフラストラクチャ管理を抽象化し、オーバーヘッドを心配せずにアプリケーションのビルドに集中できます。

2. 学習内容

このラボでは、次の方法について学びます。

  • Spanner を統合する
  • Spanner マネージド サービスを有効にする
  • コードに統合する
  • Spanner に接続するコードをデプロイする
  • Firestore を統合する
  • Firestore マネージド サービスを有効にする
  • コードに統合する
  • Firestore に接続するコードをデプロイする

3. 設定と要件

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は PROJECT_ID と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。
  • なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

環境を設定する

  1. プロジェクト ID 変数を作成する
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export SPANNER_INSTANCE=inventory-instance
export SPANNER_DB=inventory-db
export REGION=us-east1
export SPANNER_CONNECTION_STRING=projects/$PROJECT_ID/instances/$SPANNER_INSTANCE/databases/$SPANNER_DB
  1. Spanner、Cloud Run、Cloud Build、Artifact Registry API を有効にする
gcloud services enable \
     compute.googleapis.com \
     spanner.googleapis.com \
     run.googleapis.com \
     cloudbuild.googleapis.com \
     artifactregistry.googleapis.com \
     firestore.googleapis.com \
     appengine.googleapis.com \
     artifactregistry.googleapis.com
  1. リポジトリのクローンを作成する
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git
  1. ディレクトリに移動します。
cd cymbal-eats/inventory-service/spanner

4. Spanner インスタンスを作成して構成する

Spanner は、インベントリ サービスのバックエンド リレーショナル データベースです。次の手順では、Spanner のインスタンス、データベース、スキーマを作成します。

インスタンスの作成

  1. Cloud Spanner インスタンスを作成する
gcloud spanner instances create $SPANNER_INSTANCE --config=regional-${REGION} \
--description="Cymbal Menu Inventory" --nodes=1

出力例

Creating instance...done.   
  1. Spanner インスタンスが正しく構成されているかどうかを確認する
gcloud spanner instances list

出力例

NAME: inventory-instance
DISPLAY_NAME: Cymbal Menu Inventory
CONFIG: regional-us-east1
NODE_COUNT: 1
PROCESSING_UNITS: 100
STATE: READY

データベースとスキーマを作成する

新しいデータベースを作成し、Google 標準 SQL のデータ定義言語(DDL)を使用してデータベース スキーマを作成します。

  1. DDL ファイルを作成する
echo "CREATE TABLE InventoryHistory (ItemRowID STRING (36) NOT NULL, ItemID INT64 NOT NULL, InventoryChange INT64, Timestamp TIMESTAMP) PRIMARY KEY(ItemRowID)" >> table.ddl
  1. Spanner データベースを作成する
gcloud spanner databases create $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl-file=table.ddl

出力例

Creating database...done.

データベースの状態とスキーマを確認する

  1. データベースの状態を表示する
gcloud spanner databases describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

出力例

createTime: '2022-04-22T15:11:33.559300Z'
databaseDialect: GOOGLE_STANDARD_SQL
earliestVersionTime: '2022-04-22T15:11:33.559300Z'
encryptionInfo:
- encryptionType: GOOGLE_DEFAULT_ENCRYPTION
name: projects/cymbal-eats-7-348013/instances/menu-inventory/databases/menu-inventory
state: READY
versionRetentionPeriod: 1h
  1. データベースのスキーマを表示する
gcloud spanner databases ddl describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

出力例

CREATE TABLE InventoryHistory (
  ItemRowID STRING(36) NOT NULL,
  ItemID INT64 NOT NULL,
  InventoryChange INT64,
  TimeStamp TIMESTAMP,
) PRIMARY KEY(ItemRowID);

5. Spanner の統合

このセクションでは、Spanner をアプリケーションに統合する方法について説明します。また、SQL Spanner には、クライアント ライブラリJDBC ドライバR2DBC ドライバREST APIRPC API が用意されており、Spanner を任意のアプリケーションに統合できます。

次のセクションでは、Go クライアント ライブラリを使用して、Spanner でデータをインストール、認証、変更します。

クライアント ライブラリのインストール

Cloud Spanner クライアント ライブラリを使用すると、アプリケーションのデフォルト認証情報(ADC)を使用してサービス アカウントの認証情報を自動的に検索することで、Cloud Spanner との統合が容易になります。

認証を設定する

Google Cloud CLI と Google Cloud クライアント ライブラリは、Google Cloud での実行を自動的に検出し、現在の Cloud Run リビジョンのランタイム サービス アカウントを使用します。この方法はアプリケーションのデフォルト認証情報と呼ばれ、複数の環境にコードを移植できます。

ただし、デフォルトのサービス アカウントではなく、ユーザー管理のサービス アカウントを割り当てることで、専用の ID を作成することをおすすめします。

  1. サービス アカウントに Spanner データベース管理者のロールを付与する
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/spanner.databaseAdmin"

出力例

Updated IAM policy for project [cymbal-eats-6422-3462].
[...]

クライアント ライブラリの使用

Spanner クライアント ライブラリは、Spanner との統合の複雑さを抽象化し、多くの一般的なプログラミング言語で利用できます。

Spanner クライアントを作成する

Spanner クライアントは、Cloud Spanner データベースとの間でデータを読み書きするためのクライアントです。クライアントは、Close メソッドを除き、同時に使用しても安全です。

次のスニペットは Spanner クライアントを作成します。

main.go

var dataClient *spanner.Client
...
dataClient, err = spanner.NewClient(ctx, databaseName)

Client はデータベース接続と考えることができます。Cloud Spanner とのすべてのやり取りは Client 経由で実行されます。通常はアプリケーション起動時に Client を作成し、読み取り、書き込み、トランザクションの実行に Client を再利用します。各クライアントは Cloud Spanner のリソースを使用します。

データの修正

Spanner データベースからデータを挿入、更新、削除する方法は複数あります。使用可能なメソッドは次のとおりです。

このラボでは、ミューテーションを使用して Spanner のデータを変更します。

Spanner のミューテーション

Mutation はミューテーション オペレーションのコンテナです。ミューテーションは、Cloud Spanner データベース内のさまざまな行やテーブルに対して、Cloud Spanner によってアトミックに適用される一連の操作(挿入、更新、削除)を表します。

main.go

m := []*spanner.Mutation{}

m = append(m, spanner.Insert(
        "inventoryHistory",
         inventoryHistoryColumns,
        []interface{}{uuid.New().String(), element.ItemID, element.InventoryChange, time.Now()}))

コード スニペットは、在庫履歴テーブルに新しい行を挿入します。

デプロイとテスト

Spanner が構成され、主要なコード要素を確認したので、アプリケーションを Cloud Run にデプロイします。

アプリケーションを Cloud Run にデプロイする

Cloud Run では、1 つのコマンドでコードのビルド、プッシュ、デプロイを自動的に行うことができます。次のコマンドでは、run サービスで deploy コマンドを呼び出し、実行中のアプリケーションで使用される変数(SPANNER_CONNECTION_STRING など)を渡します。これらの変数は、前に作成したものです。

  1. [ターミナルを開く] をクリックします。
  2. インベントリ サービスを Cloud Run にデプロイする
gcloud run deploy inventory-service \
    --source . \
    --region $REGION \
    --update-env-vars SPANNER_CONNECTION_STRING=$SPANNER_CONNECTION_STRING \
    --allow-unauthenticated \
    --project=$PROJECT_ID \
    --quiet

出力例

Service [inventory-service] revision [inventory-service-00001-sug] has been deployed and is serving 100 percent of traffic.
Service URL: https://inventory-service-ilwytgcbca-uk.a.run.app
  1. サービス URL を保存する
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")

Cloud Run アプリケーションをテストする

アイテムを挿入する

  1. cloudshell で次のコマンドを入力します。
POST_URL=$INVENTORY_SERVICE_URL/updateInventoryItem
curl -i -X POST ${POST_URL} \
--header 'Content-Type: application/json' \
--data-raw '[
    {
        "itemID": 1,
        "inventoryChange": 5
    }
]'

出力例

HTTP/2 200
access-control-allow-origin: *
content-type: application/json
x-cloud-trace-context: 10c32f0863d26521497dc26e86419f13;o=1
date: Fri, 22 Apr 2022 21:41:38 GMT
server: Google Frontend
content-length: 2

OK

アイテムをクエリする

  1. インベントリ サービスにクエリする
GET_URL=$INVENTORY_SERVICE_URL/getAvailableInventory
curl -i ${GET_URL}

レスポンスの例

HTTP/2 200
access-control-allow-origin: *
content-type: text/plain; charset=utf-8
x-cloud-trace-context: b94f921e4c2ae90210472c88eb05ace8;o=1
date: Fri, 22 Apr 2022 21:45:50 GMT
server: Google Frontend
content-length: 166

[{"ItemID":1,"Inventory":5}]

6. Spanner のコンセプト

Cloud Spanner は、宣言型 SQL ステートメントを使用してデータベースのクエリを実行します。SQL ステートメントは、結果を取得する方法を記述することなく、ユーザーが求めるものを指定します。

  1. ターミナルで次のコマンドを入力して、前に作成したレコードのテーブルをクエリします。
gcloud spanner databases execute-sql $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--sql='SELECT * FROM InventoryHistory WHERE ItemID=1'

出力例

ItemRowID: 1
ItemID: 1
InventoryChange: 3
Timestamp: 

クエリ実行プラン

クエリ実行プランは、Spanner が結果を取得するために使用する一連の手順です。特定の SQL ステートメントの結果を取得する方法は複数ある場合があります。クエリ実行プランには、コンソールとクライアント ライブラリからアクセスできます。Spanner が SQL クエリを処理する方法を確認するには:

  1. コンソールで、Cloud Spanner インスタンス ページを開きます。
  2. Cloud Spanner のインスタンスに移動する
  3. Cloud Spanner インスタンスの名前をクリックします。[データベース] セクションで、クエリを実行するデータベースを選択します。
  4. [クエリ] をクリックします。
  5. クエリエディタに次のクエリを入力します。
SELECT * FROM InventoryHistory WHERE ItemID=1
  1. [実行] をクリックします。
  2. [説明] をクリックします。

Cloud Console にクエリの実行プランが表示されます。

149f8bae468f8b34.png

クエリ オプティマイザー

Cloud Spanner クエリ オプティマイザーは、代替実行プランを比較し、最も効率的なプランを選択します。時間の経過とともにクエリ オプティマイザが進化し、クエリ実行プランでの選択範囲が広がり、その選択に役立つ予測の精度が向上し、クエリ実行プランの効率が向上します。

Cloud Spanner では、オプティマイザーの更新が新しいクエリ オプティマイザー バージョンとしてロールアウトされます。デフォルトでは、各データベースはリリースされてから 30 日以上経過した後にオプティマイザーの最新バージョンの使用を開始します。

gcloud spanner でクエリを実行するときに使用されるバージョンを確認するには、–query-mode フラグを PROFILE に設定します。

  1. 次のコマンドを入力して、オプティマイザーのバージョンを表示します。
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

出力例

TOTAL_ELAPSED_TIME: 6.18 msecs
CPU_TIME: 5.17 msecs
ROWS_RETURNED: 1
ROWS_SCANNED: 1
OPTIMIZER_VERSION: 3
 RELATIONAL Distributed Union
 (1 execution, 0.11 msecs total latency)
 subquery_cluster_node: 1
    |
    +- RELATIONAL Distributed Union
    |  (1 execution, 0.09 msecs total latency)
    |  call_type: Local, subquery_cluster_node: 2
    |   |
    |   \- RELATIONAL Serialize Result
    |      (1 execution, 0.08 msecs total latency)
    |       |
    |       +- RELATIONAL Scan
    |       |  (1 execution, 0.08 msecs total latency)
    |       |  Full scan: true, scan_target: InventoryHistory, scan_type: TableScan
    |       |   |
    |       |   +- SCALAR Reference
    |       |   |  ItemRowID
    |       |   |
    |       |   +- SCALAR Reference
    |       |   |  ItemID
    |       |   |
    |       |   +- SCALAR Reference
    |       |   |  InventoryChange
    |       |   |
    |       |   \- SCALAR Reference
    |       |      Timestamp
    |       |
    |       +- SCALAR Reference
    |       |  $ItemRowID
    |       |
    |       +- SCALAR Reference
    |       |  $ItemID
    |       |
    |       +- SCALAR Reference
    |       |  $InventoryChange
    |       |
    |       \- SCALAR Reference
    |          $Timestamp
    |
    \- SCALAR Constant
       true

ItemRowID: 1
ItemID: 1
InventoryChange: 3
Timestamp:

オプティマイザーのバージョンを更新する

このラボの時点での最新バージョンはバージョン 4 です。次に、クエリ オプティマイザーでバージョン 4 を使用するように Spanner テーブルを更新します。

  1. オプティマイザーを更新する
gcloud spanner databases ddl update $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl='ALTER DATABASE InventoryHistory
SET OPTIONS (optimizer_version = 4)'

出力例

Schema updating...done. 
  1. 次のコマンドを入力して、オプティマイザーのバージョン更新を表示します。
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

出力例

TOTAL_ELAPSED_TIME: 8.57 msecs
CPU_TIME: 8.54 msecs
ROWS_RETURNED: 1
ROWS_SCANNED: 1
OPTIMIZER_VERSION: 4
[...]

Metrics Explorer でクエリ オプティマイザーのバージョンを可視化する

Cloud Console の Metrics Explorer を使用して、データベース インスタンスのクエリ数を可視化できます。各データベースで使用されているオプティマイザーのバージョンを確認できます。

  1. Cloud Console で [Monitoring] に移動し、左側のメニューで [Metrics Explorer] を選択します。
  2. [リソースタイプ] フィールドで、[Cloud Spanner インスタンス] を選択します。
  3. [指標] フィールドで、[クエリ数] を選択して [適用] をクリックします。
  4. [グループ条件] フィールドで、[データベース]、[optimizer_version]、[ステータス] を選択します。

581b859c25790b21.png

7. Firestore データベースを作成して構成する

Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQL ドキュメント データベースです。Firestore のインターフェースは従来のデータベースと同じ機能を多数備えていますが、NoSQL データベースであるため、データ オブジェクト間の関係を記述する方法が異なります。

次のタスクでは、Firestore を基盤とする注文サービス Cloud Run アプリケーションを作成する方法について説明します。注文サービスは、前のセクションで作成した在庫サービスを呼び出して、注文を開始する前に Spanner データベースをクエリします。このサービスにより、十分な在庫が確保され、注文を処理できるようになります。

6843abaf4263e112.png

8. Firestore のコンセプト

データモデル

Firestore データベースは、コレクションとドキュメントで構成されています。

b60acd63d4793a6c.png

ドキュメント

各ドキュメントには、一連の Key-Value ペアが含まれています。Firestore は、小さなドキュメントからなる大きなコレクションを格納するために最適化されています。

5571cb2f261d2dbe.png

コレクション

すべてのドキュメントをコレクションに保存する必要があります。ドキュメントには、文字列などのプリミティブ フィールドや、リストなどの複雑なオブジェクトを含むサブコレクションとネストされたオブジェクトを格納できます。

5811378cb721e5ec.png

Firestore データベースを作成する

  1. Firestore データベースを作成する
gcloud firestore databases create --location=$REGION

出力例

Success! Selected Google Cloud Firestore Native database for cymbal-eats-6422-3462

9. Firestore をアプリケーションに統合する

このセクションでは、サービス アカウントを更新し、Firestore アクセス サービス アカウントを追加し、Firestore セキュリティ ルールを確認してデプロイし、Firestore でデータがどのように変更されるかを確認します。

認証を設定する

  1. サービス アカウントに Datastore ユーザーロールを付与する
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
  --role="roles/datastore.user"

出力例

Updated IAM policy for project [cymbal-eats-6422-3462].

Firestore セキュリティ ルール

セキュリティ ルールは、シンプルでありながら高度な処理にも対応できる形式で、アクセス制御とデータ検証を提供します。

  1. order-service/starter-code ディレクトリに移動します。
cd ~/cymbal-eats/order-service
  1. クラウド エディタで firestore.rules ファイルを開く
cat firestore.rules

firestore.rules

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents { ⇐ All database
    match /{document=**} { ⇐ All documents
      allow read: if true; ⇐ Allow reads
    }
    match /{document=**} {
      allow write: if false; ⇐ Deny writes
    }
  }
}

警告: Firestore ストレージへのアクセスを制限することをおすすめします。このラボでは、すべての読み取りが許可されます。これは推奨される本番環境の構成ではありません。

Firestore マネージド サービスを有効にする

  1. [ターミナルを開く] をクリックします。
  2. 現在のプロジェクト ID を含む .firebaserc ファイルを作成します。デプロイ ターゲットの設定は、プロジェクト ディレクトリの .firebaserc ファイルに保存されます。

firebaserc.tmpl

sed "s/PROJECT_ID/$PROJECT_ID/g" firebaserc.tmpl > .firebaserc
  1. firebase バイナリをダウンロードする
curl -sL https://firebase.tools | upgrade=true bash

出力例

-- Checking for existing firebase-tools on PATH...
Your machine already has firebase-tools@10.7.0 installed. Nothing to do.
-- All done!
  1. Firestore ルールをデプロイします。
firebase deploy 

出力例

=== Deploying to 'cymbal-eats-6422-3462'...

i  deploying firestore
i  cloud.firestore: checking firestore.rules for compilation errors...
✔  cloud.firestore: rules file firestore.rules compiled successfully
i  firestore: uploading rules firestore.rules...
✔  firestore: released rules firestore.rules to cloud.firestore

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/cymbal-eats-6422-3462/overview

データの修正

コレクションとドキュメントは Firestore で暗黙的に作成されます。ユーザーはデータをコレクション内のドキュメントに割り当てるだけです。コレクションまたはドキュメントのいずれかが存在しない場合は、Firestore によって作成されます。

Firestore にデータを追加する

Cloud Firestore にデータを書き込む方法はいくつかあります。

  • ドキュメント識別子を明示的に指定し、コレクション内のドキュメントのデータを設定する。
  • コレクションに新しいドキュメントを追加する。この場合、ドキュメント識別子は Cloud Firestore によって自動的に生成されます。
  • 自動的に生成された識別子を持つ空のドキュメントを作成し、データを割り当てる。

次のセクションでは、set メソッドを使用してドキュメントを作成する手順について説明します。

ドキュメントを設定する

set() メソッドを使用してドキュメントを作成します。set() メソッドでは、作成するドキュメントの ID を指定する必要があります。

以下のコード スニペットをご覧ください。

index.js

const orderDoc = db.doc(`orders/123`);
await orderDoc.set({
    orderNumber: 123,
    name: Anne,
    address: 555 Bright Street,
    city: Mountain View,
    state: CA,
    zip: 94043,
    orderItems: [id: 1],
    status: 'New'
  });

このコードは、ユーザー生成ドキュメント ID 123 を指定するドキュメントを作成します。Firestore に ID を生成させるには、add() メソッドまたは create() メソッドを使用します。

ドキュメントを更新する

更新メソッド update() を使用すると、ドキュメント全体を上書きせずにドキュメントの一部のフィールドを更新できます。

次のスニペットでは、コードが注文 123 を更新します。

index.js

const orderDoc = db.doc(`orders/123`);
await orderDoc.update(name: "Anna");

ドキュメントを削除する

Firestore では、コレクション、ドキュメント、またはドキュメント内の特定のフィールドを削除できます。ドキュメントを削除するには、delete() メソッドを使用します。

次のスニペットは、注文 123 を削除します。

index.js

const orderDoc = db.doc(`orders/123`);
await orderDoc.delete();

10. デプロイとテスト

このセクションでは、アプリケーションを Cloud Run にデプロイし、作成、更新、削除の各メソッドをテストします。

アプリケーションを Cloud Run にデプロイする

  1. URL を変数 INVENTORY_SERVICE_URL に保存して、Inventory Service と統合します。
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")
  1. 注文サービスをデプロイする
gcloud run deploy order-service \
  --source . \
  --platform managed \
  --region $REGION \
  --allow-unauthenticated \
  --project=$PROJECT_ID \
  --set-env-vars=INVENTORY_SERVICE_URL=$INVENTORY_SERVICE_URL \
  --quiet

出力例

[...]
Done.
Service [order-service] revision [order-service-00001-qot] has been deployed and is serving 100 percent of traffic.
Service URL: https://order-service-3jbm3exegq-uk.a.run.app

Cloud Run アプリケーションをテストする

ドキュメントを作成して

  1. テスト用に注文サービス アプリケーションの URL を変数に格納する
ORDER_SERVICE_URL=$(gcloud run services describe order-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. 注文リクエストを作成し、新しい注文を Firestore データベースに投稿する
curl --request POST $ORDER_SERVICE_URL/order \
--header 'Content-Type: application/json' \
--data-raw '{
    "name": "Jane Doe",
         "email": "Jane.Doe-cymbaleats@gmail.com",
    "address": "123 Maple",
    "city": "Buffalo",
    "state": "NY",
    "zip": "12346",
    "orderItems": [
        {
            "id": 1
        }
    ]
}'

出力例

{"orderNumber":46429}

後で使用するために注文番号を保存する

export ORDER_NUMBER=<value_from_output>

結果を表示

Firestore で結果を表示する

  1. Firestore コンソールに移動します。
  2. [データ] をクリックします。

465ceca6198b2b88.png

ドキュメントを更新する

送信された注文に数量が含まれていませんでした。

  1. レコードを更新して数量の Key-Value ペアを追加する
curl --location -g --request PATCH $ORDER_SERVICE_URL/order/${ORDER_NUMBER} \
--header 'Content-Type: application/json' \
--data-raw '{
"orderItems": [
        {   
            "id": 1,
            "quantity": 1   
        }
    ]
}'

出力例

{"status":"success"}

結果を表示

Firestore で結果を表示する

  1. Firestore コンソールに移動します。
  2. [データ] をクリックします。

cfcf78d200e15b84.png

ドキュメントを削除する

  1. Firestore の orders コレクションからアイテム 46429 を削除する
curl --location -g --request DELETE $ORDER_SERVICE_URL/order/${ORDER_NUMBER}

結果を表示

  1. Firestore コンソールに移動します。
  2. [データ] をクリックします。

73e14d69211d1539.png

11. 完了

お疲れさまでした。これでラボは完了です。

次のステップ:

Cymbal Eats の他の Codelab をご覧ください。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトの削除

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。