API Gateway と Cloud Run for gRPC のスタートガイド

このページでは、gRPC で Cloud Run バックエンド サービスを管理、保護するために API Gateway を設定する方法を説明します。

タスクリスト

次のタスクリストを参照しながら、チュートリアルを実施してください。gRPC を使用して Cloud Run バックエンド サービスの API Gateway をデプロイするには、すべてのタスクを行う必要があります。

  1. Google Cloud プロジェクトを作成または選択する。
  2. 独自の Cloud Run をデプロイしていない場合は、サンプルのバックエンド gRPC サービスをデプロイします。始める前にのステップ 7 をご覧ください。
  3. 必要な API Gateway サービスを有効にします。
  4. API を記述する gRPC API 構成ドキュメントを作成し、Cloud Run へのルートを構成します。 gRPC を使用した API 構成をご覧ください。
  5. API 構成を使用して API Gateway をデプロイします。API ゲートウェイのデプロイをご覧ください。
  6. リクエストを送信して API のデプロイをテストします。API にリクエストを送信するをご覧ください。
  7. サービスに対するアクティビティを追跡します。API の活動を追跡するをご覧ください。
  8. Google Cloud アカウントへの課金が発生しないようにします。クリーンアップをご覧ください。

準備

  1. Google Cloud コンソールで [ダッシュボード] ページに移動し、Google Cloud プロジェクトを選択または作成します。

    ダッシュボードに移動

  2. プロジェクトに対して課金が有効になっていることを確認します。

    課金を有効にする

  3. 後で必要になるため、プロジェクト ID をメモしておきます。このページでは以降、このプロジェクト ID を PROJECT_ID として記載します。

  4. 後で必要になるため、プロジェクト番号をメモしておきます。このページでは以降、このプロジェクト番号を PROJECT_NUMBER として記載します。

  5. Google Cloud CLI をダウンロードしてインストールします。

    gcloud CLI をダウンロードする

  6. gRPC Python クイックスタートの手順に従い、gRPC と gRPC ツールをインストールします。

  7. このチュートリアルで使用する 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.com
gcloud services enable servicemanagement.googleapis.com
gcloud services enable servicecontrol.googleapis.com

gcloud サービスの詳細については、gcloud サービスをご覧ください。

gRPC での API 構成の作成

bookstore-grpc サンプルには、ローカルにコピーして構成する必要のあるファイルが含まれています。

  1. サービスの .proto ファイルから、自己完結型 protobuf 記述子ファイルを作成します。
    1. サンプル リポジトリから現在の作業ディレクトリに bookstore.proto のコピーを保存します。このファイルは Bookstore サービスの API を定義します。
    2. 作業ディレクトリの下に次のディレクトリを作成します。mkdir generated_pb2
    3. 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 を変更します。

  2. 現在の作業ディレクトリ(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 と同じレベルにする必要があります。
  3. name フィールドの *.apigateway.PROJECT_ID.cloud.goog という名前のサービス。ここで、PROJECT_ID は、Google Cloud プロジェクト ID の名前です。
  4. backend.rules セクションの address フィールドで、grpcs://python-grpc-bookstore-server-HASH-uc.a.run.apppython-grpc-bookstore-server バックエンド gRPC Cloud Run サービスの実際の URL に置き換えます。ここで、HASH はサービスの作成時に生成された一意のハッシュコードです。

    この例では、始める前にで作成した gRPC Bookstore バックエンド サービスを使用していることを想定しています。必要であれば、この値を Cloud Run サービスの URL に置き換えます。

  5. gRPC API 構成ドキュメントを保存します。
  6. 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 ゲートウェイのデプロイ

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 クライアントを使用できます。

  1. gRPC クライアント コードがホストされる git リポジトリのクローンを作成します。

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
  2. 作業ディレクトリに移動します。

    cd python-docs-samples/endpoints/bookstore-grpc/
  3. 依存関係をインストールします。

    pip3 install virtualenv
    virtualenv env
    source env/bin/activate
    pip3 install -r requirements.txt
  4. サンプル 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 の活動を追跡する

  1. Google Cloud コンソールの [API Gateway] ページで API のアクティビティ グラフを確認します。API をクリックして、[概要] ページにアクティビティ グラフを表示します。グラフにリクエストが反映されるまでにしばらく時間がかかる場合があります。

  2. [ログ エクスプローラ] ページで API のリクエストログを確認します。[ログ エクスプローラ] ページへのリンクは、Google Cloud コンソールの [API Gateway] ページにあります。

    [API Gateway] に移動

    [API Gateway] ページで次の操作を行います。

    1. 表示する API を選択します。
    2. [詳細] タブをクリックします。
    3. [ログ] の下にあるリンクをクリックします。

これで、gRPC を使用して API Gateway で API をデプロイしてテストできました。

クリーンアップ

このクイックスタートで使用したリソースに対して、Google Cloud アカウントに課金されないようにするには、次の操作を行います。

このチュートリアルで使用した Google Cloud プロジェクトの削除もできます。