API Gateway と Cloud Run for gRPC のスタートガイド
このページでは、gRPC で Cloud Run バックエンド サービスを管理、保護するために API Gateway を設定する方法を説明します。
タスクリスト
次のタスクリストを参照しながら、チュートリアルを実施してください。gRPC を使用して Cloud Run バックエンド サービスの API Gateway をデプロイするには、すべてのタスクを行う必要があります。
- Google Cloud プロジェクトを作成または選択する。
- 独自の Cloud Run をデプロイしていない場合は、サンプルのバックエンド gRPC サービスをデプロイします。始める前にのステップ 7 をご覧ください。
- 必要な API Gateway サービスを有効にします。
- API を記述する gRPC API 構成ドキュメントを作成し、Cloud Run へのルートを構成します。 gRPC を使用した API 構成をご覧ください。
- API 構成を使用して API Gateway をデプロイします。API ゲートウェイのデプロイをご覧ください。
- リクエストを送信して API のデプロイをテストします。API にリクエストを送信するをご覧ください。
- サービスに対するアクティビティを追跡します。API の活動を追跡するをご覧ください。
- Google Cloud アカウントへの課金が発生しないようにします。クリーンアップをご覧ください。
準備
Google Cloud コンソールで [ダッシュボード] ページに移動し、Google Cloud プロジェクトを選択または作成します。
プロジェクトに対して課金が有効になっていることを確認します。
後で必要になるため、プロジェクト ID をメモしておきます。このページでは以降、このプロジェクト ID を PROJECT_ID として記載します。
後で必要になるため、プロジェクト番号をメモしておきます。このページでは以降、このプロジェクト番号を PROJECT_NUMBER として記載します。
Google Cloud CLI をダウンロードしてインストールします。
gRPC Python クイックスタートの手順に従い、gRPC と gRPC ツールをインストールします。
このチュートリアルで使用する python-grpc-bookstore-serverのサンプル バックエンド gRPC Cloud Run サービスをデプロイします。gRPC サービスは次のコンテナ イメージを使用します。
gcr.io/endpointsv2/python-grpc-bookstore-server:2
クイックスタート: 事前にビルドされたサンプル コンテナをデプロイするの手順に従って、サービスをデプロイします。
gcr.io/endpointsv2/python-grpc-bookstore-server:2
でクイックスタートで指定されているコンテナイメージを置き換えます。サービス URL と、サービスがデプロイされているリージョンとプロジェクト ID をメモしておきます。
必要なサービスを有効にする
API Gateway では、次の Google サービスを有効にする必要があります。
名前 | タイトル |
---|---|
apigateway.googleapis.com |
API Gateway API |
servicemanagement.googleapis.com |
Service Management API |
servicecontrol.googleapis.com |
Service Control API |
必要なサービスが有効になっていることを確認するには:
gcloud services list
必要なサービスが表示されない場合は、次のコマンドを使用してサービスを有効にします。
gcloud services enable apigateway.googleapis.comgcloud services enable servicemanagement.googleapis.com
gcloud services enable servicecontrol.googleapis.com
gcloud
サービスの詳細については、gcloud
サービスをご覧ください。
gRPC での API 構成の作成
bookstore-grpc
サンプルには、ローカルにコピーして構成する必要のあるファイルが含まれています。
- サービスの
.proto
ファイルから、自己完結型 protobuf 記述子ファイルを作成します。- サンプル リポジトリから現在の作業ディレクトリに
bookstore.proto
のコピーを保存します。このファイルは Bookstore サービスの API を定義します。 - 作業ディレクトリの下に次のディレクトリを作成します。
mkdir generated_pb2
protoc
プロトコル バッファ コンパイラを使用して、記述子ファイルapi_descriptor.pb
を作成します。bookstore.proto
を保存したディレクトリで次のコマンドを実行します。python3 -m grpc_tools.protoc \ --include_imports \ --include_source_info \ --proto_path=. \ --descriptor_set_out=api_descriptor.pb \ --python_out=generated_pb2 \ --grpc_python_out=generated_pb2 \ bookstore.proto
上記のコマンドでは、
--proto_path
が現在の作業ディレクトリに設定されています。gRPC ビルド環境で、.proto
入力ファイルに別のディレクトリを使用する場合は、bookstore.proto
を保存したディレクトリをコンパイラが検索するように--proto_path
を変更します。
- サンプル リポジトリから現在の作業ディレクトリに
-
現在の作業ディレクトリ(
bookstore.proto
を含む同じディレクトリ)にapi_config.yaml
という名前のテキスト ファイルを作成します。便宜上、このページでは gRPC API 構成ドキュメントをそのファイル名で表記していますが、必要に応じて別の名前を指定することもできます。ファイルに次の内容を追加します。# The configuration schema is defined by the service.proto file. # https://github.com/googleapis/googleapis/blob/master/google/api/service.proto type: google.api.Service config_version: 3 name: "*.apigateway.PROJECT_ID.cloud.goog" title: API Gateway + Cloud Run gRPC apis: - name: endpoints.examples.bookstore.Bookstore usage: rules: # ListShelves methods can be called without an API Key. - selector: endpoints.examples.bookstore.Bookstore.ListShelves allow_unregistered_calls: true backend: rules: - selector: "*" address: grpcs://python-grpc-bookstore-server-HASH-uc.a.run.app
yaml 形式ではインデントが重要です。たとえば、name
フィールドはtype
と同じレベルにする必要があります。 name
フィールドの*.apigateway.PROJECT_ID.cloud.goog
という名前のサービス。ここで、PROJECT_ID は、Google Cloud プロジェクト ID の名前です。backend.rules
セクションのaddress
フィールドで、grpcs://python-grpc-bookstore-server-HASH-uc.a.run.app を python-grpc-bookstore-server バックエンド gRPC Cloud Run サービスの実際の URL に置き換えます。ここで、HASH はサービスの作成時に生成された一意のハッシュコードです。この例では、始める前にで作成した gRPC Bookstore バックエンド サービスを使用していることを想定しています。必要であれば、この値を Cloud Run サービスの URL に置き換えます。
- gRPC API 構成ドキュメントを保存します。
- API 構成を作成します。
gcloud api-gateway api-configs create CONFIG_ID \ --api=API_ID --project=PROJECT_ID \ --grpc-files=api_descriptor.pb,api_config.yaml
ここで- CONFIG_ID は API 構成の名前を指定します。
- API_ID は API の名前を指定します。
- PROJECT_ID は Google Cloud プロジェクトの名前を指定します。
gcloud api-gateway api-configs create grpc-config \ --api=grpc-test --project=my-test-project \ --grpc-files=api_descriptor.pb,api_config.yaml
API Gateway のデプロイ
gRPC API 構成をゲートウェイにデプロイするには、次のコマンドを実行します。
gcloud api-gateway gateways create GATEWAY_ID \ --api=API_ID --api-config=CONFIG_ID \ --location=GCP_REGION --project=PROJECT_ID
ここで
- GATEWAY_ID はゲートウェイの名前を指定します。
- API_ID は、このゲートウェイに関連付けられた API Gateway API の名前を指定します。
- CONFIG_ID は、ゲートウェイにデプロイされた API 構成の名前を指定します。
GCP_REGION は、デプロイされたゲートウェイの Google Cloud リージョンです。
PROJECT_ID は Google Cloud プロジェクトの名前を指定します。
例:
gcloud api-gateway gateways create bookstore-grpc \ --api=grpc-test --api-config=grpc-config \ --location=us-central1 --project=my-project
正常に完了したら、次のコマンドを使用してゲートウェイの詳細を表示できます。
gcloud api-gateway gateways describe GATEWAY_ID \ --location=GCP_REGION --project=PROJECT_ID
このコマンドの出力に含まれる defaultHostname
プロパティの値をメモします。これは、次のステップでデプロイをテストするために使用するゲートウェイ URL のホスト名の部分です。
次に例を示します。
https://my-gateway-a12bcd345e67f89g0h.uc.gateway.dev
API にリクエストを送信する
サンプル API にリクエストを送信するには、Python で作成された gRPC クライアントを使用できます。
gRPC クライアント コードがホストされる git リポジトリのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
作業ディレクトリに移動します。
cd python-docs-samples/endpoints/bookstore-grpc/
依存関係をインストールします。
pip3 install virtualenv
virtualenv env
source env/bin/activate
pip3 install -r requirements.txt
サンプル API にリクエストを送信します。
python3 bookstore_client.py --host=DEFAULT_HOSTNAME --port 443 --use_tls true
プロトコル識別子を指定せずに、DEFAULT_HOSTNAME でゲートウェイの
defaultHostname
プロパティを指定します。例:python3 bookstore_client.py --host=my-gateway-a12bcd345e67f89g0h.uc.gateway.dev --port 443 --use_tls true
API の活動を追跡する
Google Cloud コンソールの [API Gateway] ページで API のアクティビティ グラフを確認します。API をクリックして、[概要] ページにアクティビティ グラフを表示します。グラフにリクエストが反映されるまでにしばらく時間がかかる場合があります。
[ログビューア] ページで API のリクエストログを確認します。[ログ エクスプローラ] ページへのリンクは、Google Cloud コンソールの [API Gateway] ページにあります。
[API Gateway] ページで次の操作を行います。- 表示する API を選択します。
- [詳細] タブをクリックします。
- [ログ] の下にあるリンクをクリックします。
これで、gRPC を使用して API Gateway で API をデプロイしてテストできました。
クリーンアップ
このクイックスタートで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。
このチュートリアルで使用した Google Cloud プロジェクトの削除もできます。