このチュートリアルでは、Google Kubernetes Engine(GKE)上の Extensible Service Proxy V2(ESPv2)を使用して、単純な gRPC サービスの例をデプロイする方法について説明します。このチュートリアルでは、bookstore-grpc
サンプルの Python 版を使用しています。他の言語の gRPC サンプルについては、次のステップ セクションをご覧ください。
このチュートリアルでは、事前にビルドされたサンプルコードと ESPv2 のコンテナ イメージを使用します。これらは、Artifact Registry に保存されています。コンテナをまだよく理解していない場合は、次の情報をご覧ください。
Cloud Endpoints の概要については、Endpoints についてと Endpoints アーキテクチャをご覧ください。
目標
タスクの概要を示す次のリストを参照しながら、チュートリアルを実施してください。API にリクエストを送信するには、すべてのタスクを行う必要があります。
- Google Cloud プロジェクトをセットアップして、必要なソフトウェアをダウンロードします。始める前にをご覧ください。
bookstore-grpc
サンプルからファイルをコピーして構成します。Endpoints を構成するをご覧ください。- Endpoints 構成をデプロイして Endpoints サービスを作成します。Endpoints 構成をデプロイするをご覧ください。
- API を提供するバックエンドを作成し、API をデプロイします。API バックエンドをデプロイするをご覧ください。
- サービスの外部 IP アドレスを取得します。サービスの外部 IP アドレスを取得するをご覧ください。
- API にリクエストを送信します。API にリクエストを送信するをご覧ください。
- Google Cloud アカウントへの課金が発生しないようにします。クリーンアップをご覧ください。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- 後で必要になるので、Google Cloud プロジェクト ID はメモしておいてください。
- Google Cloud CLI をインストールして初期化します。
- gcloud CLI を更新し、Endpoints コンポーネントをインストールします。
gcloud components update
- Google Cloud CLI(
gcloud
)が、Google Cloud にある対象のデータとサービスへのアクセスが許可されていることを確認します。 新しいブラウザタブが開き、アカウントの選択を要求するプロンプトが表示されます。gcloud auth login
- デフォルト プロジェクトを実際のプロジェクト ID に設定します。
gcloud config set project YOUR_PROJECT_ID
YOUR_PROJECT_ID を実際のプロジェクト ID に置き換えます。
他にも Google Cloud プロジェクトがあり、
gcloud
を使用してそのプロジェクトを管理する場合は、gcloud CLI 構成の管理をご覧ください。 kubectl
のインストール:gcloud components install kubectl
- アプリケーションのデフォルト認証情報用に使用する新しいユーザー認証情報を取得します。ユーザー認証情報は
kubectl
を承認するために必要です。 表示された新しいブラウザタブで、アカウントを選択します。gcloud auth application-default login
- gRPC Python クイックスタートの手順に従い、gRPC と gRPC ツールをインストールします。
Endpoints を構成する
bookstore-grpc
サンプルには、ローカルにコピーして構成する必要のあるファイルが含まれています。
- Create a self-contained protobuf descriptor file from your service
.proto
file:- Save a copy of
bookstore.proto
from the example repository. This file defines the Bookstore service's API. - Create the following directory:
mkdir generated_pb2
- Create the descriptor file,
api_descriptor.pb
, by using theprotoc
protocol buffers compiler. Run the following command in the directory where you savedbookstore.proto
:python -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
In the preceding command,
--proto_path
is set to the current working directory. In your gRPC build environment, if you use a different directory for.proto
input files, change--proto_path
so the compiler searches the directory where you savedbookstore.proto
.
- Save a copy of
- Create a gRPC API configuration YAML file:
- Save a copy of the
api_config.yaml
file. This file defines the gRPC API configuration for the Bookstore service. - Replace MY_PROJECT_ID in your
api_config.yaml
file with your Google Cloud project ID. For example:# # Name of the service configuration. # name: bookstore.endpoints.example-project-12345.cloud.goog
Note that the
apis.name
field value in this file exactly matches the fully-qualified API name from the.proto
file; otherwise deployment won't work. The Bookstore service is defined inbookstore.proto
inside packageendpoints.examples.bookstore
. Its fully-qualified API name isendpoints.examples.bookstore.Bookstore
, just as it appears in theapi_config.yaml
file.apis: - name: endpoints.examples.bookstore.Bookstore
- Save a copy of the
詳細については、Endpoints を構成するをご覧ください。
Endpoints 構成をデプロイする
Endpoints の構成をデプロイするには、gcloud endpoints services deploy
コマンドを使用します。このコマンドを実行すると、Service Management を使用してマネージド サービスが作成されます。
api_descriptor.pb
ファイルとapi_config.yaml
ファイルがあるディレクトリにいることを確認します。gcloud
コマンドライン ツールが現在使用しているデフォルト プロジェクトが、エンドポイント構成をデプロイする Google Cloud プロジェクトであることを確認します。それには、次のコマンドを使用して返されるプロジェクト ID を確認してください。これは、間違ったプロジェクト内にサービスが作成されないようにするためです。gcloud config list project
デフォルト プロジェクトを変更する必要がある場合は、次のコマンドを実行します。
gcloud config set project YOUR_PROJECT_ID
- Google Cloud CLI を使用して、
proto descriptor
ファイルと構成ファイルをデプロイします。gcloud endpoints services deploy api_descriptor.pb api_config.yaml
サービスが作成され構成されるに従い、ターミナルには Service Management からの情報が出力されます。デプロイが完了すると、次のようなメッセージが表示されます。
Service Configuration [CONFIG_ID] uploaded for service [bookstore.endpoints.example-project.cloud.goog]
CONFIG_ID は、デプロイによって作成される一意の Endpoints サービス構成 ID です。例:
Service Configuration [2017-02-13r0] uploaded for service [bookstore.endpoints.example-project.cloud.goog]
上記の例では、
2017-02-13r0
はサービス構成 ID で、bookstore.endpoints.example-project.cloud.goog
はサービス名です。サービス構成 ID は、日付スタンプとそれに続くリビジョン番号で構成されます。Endpoints の構成を同じ日に再デプロイすると、サービス構成 ID のリビジョン番号が増分されます。
必要なサービスの確認
Endpoints と ESP を使用するには、少なくとも次の Google サービスの有効化が必要です。名前 | タイトル |
---|---|
servicemanagement.googleapis.com |
Service Management API |
servicecontrol.googleapis.com |
Service Control API |
endpoints.googleapis.com |
Google Cloud Endpoints |
ほとんどの場合、gcloud endpoints services deploy
コマンドによってこれらの必須サービスが有効化されます。ただし、以下の状況では、gcloud
コマンドは正常に完了しますが、必須サービスが有効になりません。
Terraform などのサードパーティのアプリケーションを使用していて、上記のサービスを含めていない場合。
上記のサービスが明示的に無効にされている既存の Google Cloud プロジェクトに Endpoints 構成をデプロイした場合。
必要なサービスが有効になっていることを確認するには、次のコマンドを実行します。
gcloud services list
必要なサービスが表示されない場合は、次のコマンドを使用してサービスを有効にします。
gcloud services enable servicemanagement.googleapis.comgcloud services enable servicecontrol.googleapis.com
gcloud services enable endpoints.googleapis.com
Endpoints サービスも有効にします。
gcloud services enable ENDPOINTS_SERVICE_NAME
ENDPOINTS_SERVICE_NAME を確認するには、次のいずれかを行います。
Endpoints 構成をデプロイ後、Cloud コンソールの [Endpoints] ページに移動します。[サービス名] 列に、考えられる ENDPOINTS_SERVICE_NAME のリストが表示されます。
OpenAPI の場合、ENDPOINTS_SERVICE_NAME は OpenAPI 仕様の
host
フィールドで指定したものです。gRPC の場合、ENDPOINTS_SERVICE_NAME は gRPC Endpoints 構成のname
フィールドで指定したものです。
gcloud
コマンドの詳細については、gcloud
サービスをご覧ください。
エラー メッセージが表示された場合は、Endpoints 構成のデプロイのトラブルシューティングをご覧ください。
詳しくは、Endpoints 構成をデプロイするをご覧ください。
API バックエンドをデプロイする
ここまでの手順でサービス構成を Service Management にデプロイしましたが、API バックエンドを処理するコードはまだデプロイしていません。ここでは、API バックエンドをホストする GKE クラスタを作成して API をデプロイする手順を説明します。
コンテナ クラスタの作成
コンテナ ネイティブのロード バランシングを使用するためには、クラスタに IP エイリアスが必要です。この例では、IP エイリアスを持つコンテナ クラスタを作成します。
gcloud container clusters create espv2-demo-cluster \ --enable-ip-alias \ --create-subnetwork="" \ --network=default \ --zone=us-central1-a
上記のコマンドにより、ゾーン us-central1-a
で自動プロビジョニングされるサブネットワークを持つクラスタ espv2-demo-cluster
が作成されます。
コンテナ クラスタに対する kubectl
の認証
kubectl
を使用してクラスタ リソースを作成し、管理するには、クラスタの認証情報を取得して kubectl
で使用可能にする必要があります。この操作を行うには、次のコマンドを実行します。NAME は新しいクラスタ名、ZONE はクラスタゾーンで置き換えます。
gcloud container clusters get-credentials NAME --zone ZONE
必要な権限を確認する
ESP と ESPv2 は、IAM を使用して、呼び出し元の ID が、使用されている IAM リソースにアクセスするための十分な権限を持っているかどうかを確認する Google サービスを呼び出します。呼び出し元の ID は、ESP と ESPv2 をデプロイする、接続されたサービス アカウントです。
接続されたサービス アカウントは、GKE Pod にデプロイされると、ノードのサービス アカウントです。通常、それは、Compute Engine のデフォルト サービス アカウントです。この権限の推奨事項に従って、適切なノードのサービス アカウントを選択してください。
Workload Identity を使用する場合、ノードのサービス アカウントとは別のサービス アカウントを使用して Google サービスと通信できます。Pod 用の Kubernetes サービス アカウントを作成して ESP と ESPv2 を実行し、Google サービス アカウントを作成して Kubernetes サービス アカウントを Google サービス アカウントに関連付けることができます。
この手順に沿って、Kubernetes サービス アカウントを Google サービス アカウントに関連付けます。この Google サービス アカウントは、接続されているサービス アカウントです。
接続されたサービス アカウントがプロジェクトの Compute Engine のデフォルト サービス アカウントで、エンドポイント サービス構成が同じプロジェクトにデプロイされている場合、サービス アカウントには、IAM リソースにアクセスするための十分な権限があるため、続く IAM ロールの設定手順はスキップできます。これに該当しない場合は、次の IAM ロールを、接続されたサービス アカウントに追加する必要があります。
必要な IAM ロールを追加する
このセクションでは、ESP と ESPv2 で使用される IAM リソースと、これらのリソースにアクセスするために接続されたサービス アカウントに必要な IAM ロールについて説明します。
エンドポイント サービスの構成
ESP と ESPv2 は、エンドポイント サービス構成を使用する Service Control を呼び出します。エンドポイント サービスの構成は IAM リソースであり、ESP と ESPv2 にはサービス コントローラ ロールが必要です。
IAM ロールは、プロジェクトではなく、エンドポイント サービスの構成に対するものです。1 つのプロジェクトには、複数のエンドポイント サービス構成が存在する場合があります。
次の gcloud コマンドを使用して、エンドポイント サービス構成の接続されたサービス アカウントにロールを追加します。
gcloud endpoints services add-iam-policy-binding SERVICE_NAME \ --member serviceAccount:SERVICE_ACCOUNT_NAME@DEPLOY_PROJECT_ID.iam.gserviceaccount.com \ --role roles/servicemanagement.serviceController
ここで、
* SERVICE_NAME
は、エンドポイント サービス名です。
* SERVICE_ACCOUNT_NAME@DEPLOY_PROJECT_ID.iam.gserviceaccount.com
は、接続されたサービス アカウントです。
Cloud Trace
ESP と ESPv2 は Cloud Trace サービスを呼び出して、Trace をプロジェクトにエクスポートします。このプロジェクトはトレース プロジェクトと呼ばれます。ESP では、トレース プロジェクトと、エンドポイント サービス構成を有するプロジェクトは同じです。ESPv2 では、トレース プロジェクトはフラグ --tracing_project_id
で指定できます。デフォルトはデプロイ プロジェクトです。
ESP と ESPv2 では、Cloud Trace を有効にするために、Cloud Trace エージェント ロールが必要です。
次の gcloud コマンドを使用して、接続されたサービス アカウントにロールを追加します。
gcloud projects add-iam-policy-binding TRACING_PROJECT_ID \ --member serviceAccount:SERVICE_ACCOUNT_NAME@DEPLOY_PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudtrace.agent
ここで、
* TRACING_PROJECT_ID は、トレース プロジェクト ID です。
* SERVICE_ACCOUNT_NAME@DEPLOY_PROJECT_ID.iam.gserviceaccount.comは、接続されたサービス アカウントです。詳細については、ロールと権限についてをご覧ください。
SSL 鍵と証明書を構成する
コンテナ ネイティブのロード バランシングでは、TLS で暗号化する必要がある HTTP2 LB を使用します。そのため、GKE Ingress と ESPv2 に TLS 証明書をデプロイする必要があります。独自の証明書を使用することも、自己署名証明書を使用することもできます。
openssl を使用して自己署名証明書と鍵を作成します。「共通名(CN)」の入力を求められたら、必ず同じ FQDN
bookstore.endpoints.MY_PROJECT_ID.cloud.goog
を入力してください。この名前は、クライアントがサーバー証明書を確認するために使用します。openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout ./server.key -out ./server.crt
SSL 鍵と証明書を使用して Kubernetes secret を作成します。Secret は GKE Ingress と ESPv2 の両方に渡されるため、証明書は
server.crt
とtls.crt
の 2 か所にコピーされることに注意してください。GKE Ingress は証明書パスtls.crt
を探し、ESPv2 が証明書パスserver.crt
を探します。kubectl create secret generic esp-ssl \ --from-file=server.crt=./server.crt --from-file=server.key=./server.key \ --from-file=tls.crt=./server.crt --from-file=tls.key=./server.key
サンプル API と ESPv2 のクラスタへのデプロイ
gRPC サンプル サービスをクラスタにデプロイし、クライアントで使用可能にするには:
- このリポジトリを
git clone
して開き、grpc-bookstore.yaml デプロイ マニフェスト ファイルを編集します。 - SERVICE_NAME は、Ingress コンテナと ESPv2 コンテナの Endpoints サービスの名前に置き換えます。これは、
api_config.yaml
ファイルのname
フィールドで構成した名前と同じです。--rollout_strategy=managed
オプションを指定すると、デプロイ済みの最新のサービス構成を使用するように ESPv2 が構成されます。このオプションを指定すると、新しいサービス構成をデプロイしてから 1 分以内に ESPv2 が変更を検出し、自動的に使用します。ESPv2 が特定の構成 ID でなく、このオプションを使用するようにしてください。ESPv2 引数の詳細については、ESPv2 スタートアップ オプションをご覧ください。例:
spec: containers: - name: esp image: gcr.io/endpoints-release/endpoints-runtime:2 args: [ "--listener_port=9000", "--service=bookstore.endpoints.example-project-12345.cloud.goog", "--rollout_strategy=managed", "--backend=grpc://127.0.0.1:8000" ]
- サービスを起動します。
kubectl create -f grpc-bookstore.yaml
エラー メッセージが表示された場合は、GKE での Endpoints のトラブルシューティングをご覧ください。
サービスの外部 IP アドレスを取得する
サンプル API にリクエストを送信するには、サービスの外部 IP アドレスが必要です。コンテナでサービスを開始してから外部 IP アドレスを確認できるまで数分かかる場合があります。
外部 IP アドレスを表示します。
kubectl get ingress
EXTERNAL-IP
の値をメモしておき、SERVER_IP 環境変数に保存します。この外部 IP アドレスは、リクエストをサンプル API に送信するために使用されます。export SERVER_IP=YOUR_EXTERNAL_IP
API にリクエストを送信する
サンプル API にリクエストを送信するには、Python で作成された gRPC クライアントを使用できます。
gRPC クライアント コードがホストされる git リポジトリのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
作業ディレクトリに移動します。
cd python-docs-samples/endpoints/bookstore-grpc/
依存関係をインストールします。
pip install virtualenv
virtualenv env
source env/bin/activate
python -m pip install -r requirements.txt
自己署名証明書のルート CA を作成します
openssl x509 -in server.crt -out client.pem -outform PEM
サンプル API にリクエストを送信します。
python bookstore_client.py --host SERVER_IP --port 443 \ --servername bookstore.endpoints.MY_PROJECT_ID.cloud.goog --use_tls true --ca_path=client.pem
[エンドポイント] > [サービス] ページで API のアクティビティ グラフを確認します。
グラフにリクエストが反映されるまでしばらくかかります。
[ログ エクスプローラ] ページで、API のリクエストログを確認します。
正常なレスポンスが返されない場合は、レスポンス エラーのトラブルシューティングをご覧ください。
これで Endpoints の API のデプロイとテストが完了しました。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
API を削除します。
gcloud endpoints services delete SERVICE_NAME
SERVICE_NAME は、API の名前に置き換えます。
GKE クラスタを削除します。
gcloud container clusters delete NAME --zone ZONE