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

1. 概要

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

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)

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

データの修正

Spanner データベースに対してデータの挿入、更新、削除を行う方法は複数あります。利用可能なメソッドを以下に示します。

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

Spanner のミューテーション

Mutation はミューテーション オペレーションのコンテナです。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 つのコマンドでコードを自動的にビルド、push、デプロイできます。次のコマンドでは、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 コンソールにクエリの実行プランが視覚的に表示されます。

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 です。次に、Spanner テーブルを更新して、クエリ オプティマイザーにバージョン 4 を使用します。

  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 コンソールの Metrics Explorer を使用して、データベース インスタンスのクエリ数を可視化できます。各データベースで使用されているオプティマイザーのバージョンを確認できます。

  1. Cloud コンソールの [Monitoring] に移動し、左側のメニューで [Metrics Explorer] を選択します。
  2. [Resource type] フィールドで、[Cloud Spanner Instance] を選択します。
  3. [指標] フィールドで [クエリの数] を選択し、[適用] を選択します。
  4. [Group By] フィールドで、database、optimize_version、status を選択します。

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 にデータを書き込む方法はいくつかあります。

  • ドキュメント ID を明示的に指定して、コレクション内のドキュメントのデータを設定します。
  • コレクションに新しいドキュメントを追加する。この場合、Cloud Firestore が自動的にドキュメント ID を生成します。
  • 自動生成された ID を含む空のドキュメントを作成し、後でそのドキュメントにデータを割り当てる。

次のセクションでは、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 メソッド 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 にデプロイし、create、update、delete の各メソッドをテストします。

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

  1. URL を変数 INVENTORY_SERVICE_URL に格納して在庫サービスと統合する
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. [Data] をクリックする

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. [Data] をクリックする

cfcf78d200e15b84.png

ドキュメントを削除する

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

結果を表示

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

73e14d69211d1539.png

11. 完了

これでラボは終了です。

次のステップ:

Cymbal Eats の他の Codelab を確認する:

クリーンアップ

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

プロジェクトの削除

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