ESPv2 を使用して Cloud Run 関数用の Cloud Endpoints OpenAPI を設定する
このページでは、Cloud Run 関数に Cloud Endpoints を設定する方法を説明します。Endpoints は Extensible Service Proxy V2(ESPv2)を API ゲートウェイとして使用します。Cloud Run 関数向けに API 管理機能を提供するには、事前にビルドされた ESPv2 コンテナを Cloud Run にデプロイします。Cloud Run 関数 IAM を使用して関数を保護し、ESPv2 が関数を起動できるようにします。
この設定では、ESPv2 が関数に対するすべてのリクエストを傍受し、必要なチェック(認証など)を行ってから、該当する関数を呼び出します。関数が応答すると、ESPv2 は次の図に示すようにテレメトリーを収集して報告します。関数の指標は、 Google Cloud コンソールの [エンドポイント] > [サービス] ページで確認できます。
  
Cloud Endpoints の概要については、Endpoints についてと Endpoints アーキテクチャをご覧ください。
ESPv2 に移行する
Cloud Endpoints の以前のリリースでは、Cloud Run 関数との Extensible Service Proxy(ESP)の使用がサポートされていました。既存の API を ESPv2 に移行するには、詳細について Extensible Service Proxy V2 への移行をご覧ください。
タスクリスト
次のタスクリストを参照しながら、チュートリアルを実施してください。このチュートリアルを完了するには、すべてのタスクを行う必要があります。
- Google Cloud プロジェクトを作成します。独自の Cloud Run 関数をデプロイしていない場合は、サンプルのバックエンド関数をデプロイします。始める前にをご覧ください。
- ESPv2 サービス用に Cloud Run のホスト名を予約します。Cloud Run ホスト名の予約をご覧ください。
- API を記述する OpenAPI ドキュメントを作成し、Cloud Run 関数へのルートを構成します。Endpoints を構成するをご覧ください。
- OpenAPI ドキュメントをデプロイして、マネージド サービスを作成します。Endpoints 構成をデプロイするをご覧ください。
- Endpoints サービス構成で新しい ESPv2 Docker イメージをビルドします。新しい ESPv2 イメージをビルドするをご覧ください。
- ESPv2 コンテナを Cloud Run にデプロイします。次に、サービスを呼び出すための Identity and Access Management(IAM)権限を ESPv2 に付与します。ESPv2 コンテナをデプロイするをご覧ください。
- 関数を呼び出します。API にリクエストを送信するをご覧ください。
- 関数に対するアクティビティを追跡します。API の活動を追跡するをご覧ください。
- Google Cloud アカウントに課金されないようにします。 クリーンアップをご覧ください。
費用
このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。
 
  
 
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
Cloud Run 関数用の Endpoints を使用する前に、次のことをおすすめします。
- ESPv2 コンテナを Cloud Run にデプロイするときに使用する新しい Google Cloud プロジェクトを作成します。 
- Cloud Run 関数用に新規のプロジェクトを作成するか、既存のプロジェクトを選択します。 
次の手順に従って設定します。
- Google Cloud コンソールで [リソースの管理] ページに移動し、プロジェクトを作成します。 
- プロジェクトに対して課金が有効になっていることを確認します。 
- 後で必要になるため、プロジェクト ID をメモしておきます。このページでは以降、このプロジェクト ID を ESPv2_PROJECT_ID として記載します。 
- 後で必要になるため、プロジェクト番号をメモしておきます。このページでは以降、このプロジェクト番号を ESPv2_PROJECT_NUMBER として記載します。 
- Google Cloud CLI をダウンロードしてインストールします。 
- 独自のバックエンド Cloud Run 関数をデプロイしていない場合は、クイックスタート: Google Cloud CLI の使用の手順に沿って、 Google Cloud プロジェクトを選択または作成し、サンプル関数をデプロイします。関数がデプロイされているリージョンとプロジェクト ID をメモしておきます。このページでは以降、このプロジェクト ID を FUNCTIONS_PROJECT_ID とします。 
Cloud Run ホスト名の予約
OpenAPI ドキュメントまたは gRPC サービス構成を構成するには、ESPv2 サービス用の Cloud Run ホスト名を予約する必要があります。ホスト名を予約するには、Cloud Run にサンプル コンテナをデプロイします。後で、同じ Cloud Run サービスに ESPv2 コンテナをデプロイします。
- 
gcloud CLI がデータやサービスにアクセスできるように承認されていることを確認します。- ログインします。gcloud auth login 
- 表示された新しいブラウザタブで、ESPv2 を Cloud Run にデプロイするために作成した Google Cloud プロジェクトの編集者またはオーナーのロールが割り当てられているアカウントを選択します。
 
- ログインします。
- 
リージョンを設定します。
gcloud config set run/region us-central1 
- 
サンプル イメージ gcr.io/cloudrun/helloを Cloud Run にデプロイします。ESPv2_CLOUD_RUN_SERVICE_NAME は、このサービスに使用する名前に置き換えます。gcloud run deploy ESPv2_CLOUD_RUN_SERVICE_NAME \ --image="gcr.io/cloudrun/hello" \ --allow-unauthenticated \ --platform managed \ --project=ESPv2_PROJECT_IDこのコマンドが正常に完了すると、次のようなメッセージが表示されます。 Service [ESPv2_CLOUD_RUN_SERVICE_NAME] revision [ESPv2_CLOUD_RUN_SERVICE_NAME-REVISION_NUM] has been deployed and is serving traffic at CLOUD_RUN_SERVICE_URL ESPv2_CLOUD_RUN_SERVICE_NAME を gatewayに設定した場合:Service [gateway] revision [gateway-00001] has been deployed and is serving traffic at https://gateway-12345-uc.a.run.app この例では、 https://gateway-12345-uc.a.run.appが CLOUD_RUN_SERVICE_URL で、gateway-12345-uc.a.run.appが v2_CLOUD_RUN_HOSTNAME です。
- ESPv2_CLOUD_RUN_SERVICE_NAME と ESPv2_CLOUD_RUN_HOSTNAME をメモします。ESPv2 ベータ版を後で ESPv2_CLOUD_RUN_SERVICE_NAME Cloud Run サービスにデプロイします。OpenAPI ドキュメントの hostフィールドで ESPv2_CLOUD_RUN_HOSTNAME を指定します。
Endpoints を構成する
OpenAPI 仕様 v2.0 に準拠した、関数の surface と認証要件を記述した OpenAPI ドキュメントを用意する必要があります。また、ESPv2 が関数を呼び出すために必要な情報を取得できるよう、このドキュメントには各関数の URL を設定した Google 固有のフィールドも追加する必要があります。OpenAPI を初めて使用する場合は、OpenAPI の概要で詳細をご覧ください。
- 
openapi-functions.yamlという名前のテキスト ファイルを作成します。(便宜上、このページでは OpenAPI ドキュメントをファイル名で表記していますが、必要に応じてファイル名以外の名前を指定することもできます)。
- 
各関数は、openapi-functions.yamlファイルのpathsセクションに表示されている必要があります。次に例を示します。swagger: '2.0' info: title: Cloud Endpoints + GCF description: Sample API on Cloud Endpoints with a Google Cloud Functions backend version: 1.0.0 host: HOST schemes: - https produces: - application/json paths: /hello: get: summary: Greet a user operationId: hello x-google-backend: address: https://REGION-FUNCTIONS_PROJECT_ID.cloudfunctions.net/FUNCTIONS_NAME protocol: h2 responses: '200': description: A successful response schema: type: string hostフィールドはinfoと同じレベルにする必要があります。
- 
x-google-backendセクションのaddressフィールドで、REGION を関数が配置されている Google Cloud リージョンに、FUNCTIONS_PROJECT_ID を Google Cloud プロジェクト ID に、FUNCTIONS_NAME を関数名に、それぞれ置き換えます。次に例を示します。x-google-backend: address: https://us-central1-myproject.cloudfunctions.net/helloGET jwt_audienceが指定されていない場合は、addressフィールドに関数名を含めます。次に例を示します。x-google-backend: address: https://REGION-FUNCTIONS_PROJECT_ID.cloudfunctions.net/FUNCTIONS_NAME path_translation: CONSTANT_ADDRESS jwt_audienceを指定する場合は、その値にも関数名を含める必要があります。次に例を示します。x-google-backend: address: https://REGION-FUNCTIONS_PROJECT_ID.cloudfunctions.net jwt_audience: https://REGION-FUNCTIONS_PROJECT_ID.cloudfunctions.net/FUNCTIONS_NAME path_translation: APPEND_PATH_TO_ADDRESS audienceが必要です。ESPv2 は、指定されていればjwt_audienceフィールドの値を使用して ID トークン用にaudienceを設定し、指定されていない場合は、addressフィールドを使用します。
- hostフィールドで、CLOUD_RUN_HOSTNAME を指定します。これは、Cloud Run ホスト名の予約で予約した URL のホスト名の部分です。プロトコルの識別子である- https://は含めません。次に例を示します。- swagger: '2.0' info: title: Cloud Endpoints + GCF description: Sample API on Cloud Endpoints with a Google Cloud Functions backend version: 1.0.0 host: gateway-12345-uc.a.run.app
- openapi-functions.yamlファイルの- titleプロパティの値をメモします。- title: Cloud Endpoints + GCF - titleプロパティの値は、構成をデプロイした後の Endpoints サービスの名前になります。
- OpenAPI ドキュメントを保存します。
Endpoints に必要な OpenAPI ドキュメントのフィールドについては、Endpoints を構成するをご覧ください。
Endpoints 構成をデプロイする
Endpoints の構成をデプロイするには、gcloud endpoints services deploy コマンドを使用します。このコマンドを実行すると、Service Management を使用してマネージド サービスが作成されます。
Endpoints 構成をデプロイするには:
- OpenAPI ドキュメントが格納されているディレクトリに移動します。
- 構成をアップロードしてマネージド サービスを作成します。 - gcloud endpoints services deploy openapi-functions.yaml \ --project ESPv2_PROJECT_ID- これにより、 - openapi-functions.yamlファイルの- hostフィールドに指定した名前で、新しい Endpoints サービスが作成されます。このサービスは、OpenAPI ドキュメントに従って構成されています。- Service Management でサービスの作成と構成が行われるとき、情報がデバイスに出力されます。デプロイが完了すると、次のようなメッセージが表示されます。 - Service Configuration [CONFIG_ID] uploaded for service [CLOUD_RUN_HOSTNAME] - CONFIG_ID は、デプロイによって作成される一意の Endpoints サービス構成 ID です。次に例を示します。 - Service Configuration [2019-02-01r0] uploaded for service [gateway-12345-uc.a.run.app] - サービス構成 ID は、日付スタンプとそれに続くリビジョン番号で構成されます。同じ日に - openapi-functions.yamlを再度デプロイすると、サービス構成 ID のリビジョン番号が増分されます。 Google Cloud コンソールで [エンドポイント] > [サービス] ページを開くと、サービス構成とデプロイの履歴を確認できます。- エラー メッセージが表示された場合は、Endpoints 構成のデプロイのトラブルシューティングをご覧ください。 
必要なサービスの確認
Endpoints と ESP を使用するには、少なくとも次の Google サービスの有効化が必要です。| 名前 | タイトル | 
|---|---|
| servicemanagement.googleapis.com | Service Management API | 
| servicecontrol.googleapis.com | Service Control API | 
ほとんどの場合、gcloud endpoints services deploy コマンドによってこれらの必須サービスが有効化されます。ただし、以下の状況では、gcloud コマンドは正常に完了しますが、必須サービスが有効になりません。
- Terraform などのサードパーティのアプリケーションを使用していて、上記のサービスを含めていない場合。 
- 上記のサービスが明示的に無効にされている既存のGoogle Cloud プロジェクトに Endpoints 構成をデプロイした場合。 
必要なサービスが有効になっていることを確認するには、次のコマンドを実行します。
gcloud services list
必要なサービスが表示されない場合は、次のコマンドを使用してサービスを有効にします。
gcloud services enable servicemanagement.googleapis.com
gcloud services enable servicecontrol.googleapis.comEndpoints サービスも有効にします。
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 サービスをご覧ください。
新しい ESPv2 イメージをビルドする
新しい ESPv2 Docker イメージに Endpoints サービス構成をビルドします。その後、このイメージを予約済みの Cloud Run サービスにデプロイします。
新しい ESPv2 Docker イメージにサービス構成をビルドするには:
- gcloud CLI がインストールされているローカルマシンにこのスクリプトをダウンロードします。 
- 次のコマンドでスクリプトを実行します。 - chmod +x gcloud_build_image- ./gcloud_build_image -s ESPv2_CLOUD_RUN_HOSTNAME \ -c CONFIG_ID -p ESPv2_PROJECT_ID- ESPv2_CLOUD_RUN_HOSTNAME には、Cloud Run ホスト名の予約で予約した URL のホスト名を指定します。プロトコルの識別子である - https://は含めません。- 次に例を示します。 - chmod +x gcloud_build_image- ./gcloud_build_image -s gateway-12345-uc.a.run.app \ -c 2019-02-01r0 -p your-project-id
- 
   このスクリプトは、 gcloudコマンドを使用してサービス構成をダウンロードし、新しい ESPv2 イメージにサービス構成をビルドして、新しいイメージを次のプロジェクト コンテナ レジストリにアップロードします。このスクリプトは、出力イメージ名に ESPv2_VERSION で示される ESPv2 の最新リリースを自動的に使用します。出力イメージは次の場所にアップロードされます。gcr.io/ESPv2_PROJECT_ID/endpoints-runtime-serverless:ESPv2_VERSION-ESPv2_CLOUD_RUN_HOSTNAME-CONFIG_ID 次に例を示します。 gcr.io/your-project-id/endpoints-runtime-serverless:2.14.0-gateway-12345-uc.a.run.app-2019-02-01r0" 
ESPv2 コンテナをデプロイする
- 前の手順で作成した新しいイメージを使用して、ESPv2 Cloud Run サービスをデプロイします。CLOUD_RUN_SERVICE_NAME は、Cloud Run ホスト名の予約で、前の手順でホスト名を予約したときと同じ Cloud Run サービスの名前に置き換えます。 - gcloud run deploy CLOUD_RUN_SERVICE_NAME \ --image="gcr.io/ESPv2_PROJECT_ID/endpoints-runtime-serverless:ESPv2_VERSION-CLOUD_RUN_HOSTNAME-CONFIG_ID" \ --allow-unauthenticated \ --platform managed \ --project=ESPv2_PROJECT_ID 
- CORS を有効にするなどの追加の ESPv2 起動オプションを使用するように Endpoints を構成する場合は、引数を - ESPv2_ARGS環境変数に渡すことができます。- gcloud run deploy CLOUD_RUN_SERVICE_NAME \ --image="gcr.io/ESPv2_PROJECT_ID/endpoints-runtime-serverless:ESPv2_VERSION-CLOUD_RUN_HOSTNAME-CONFIG_ID" \ --set-env-vars=ESPv2_ARGS=--cors_preset=basic \ --allow-unauthenticated \ --platform managed \ --project ESPv2_PROJECT_ID - 使用可能なオプション、複数のオプションの指定方法など、 - ESPv2_ARGS環境変数の詳細と設定例については、Extensible Service Proxy V2 ベータ版のフラグをご覧ください。
- Service Management と Service Control を呼び出す権限を ESPv2 に付与します。 
- Google Cloud コンソールで、[Cloud Run] ページに移動します。
- デプロイした Cloud Run インスタンスと、それに関連付けられたサービス アカウントを確認できます。
- サービス アカウントに必要な権限を付与します。
- 関数を呼び出すための権限を ESPv2 に付与します。関数ごとに次のコマンドを実行します。このコマンドでは、次の要素を置き換えてください。 - FUNCTION_NAME は関数の名前に置き換え、FUNCTION_REGION は関数のデプロイ先のリージョンに置き換えます。クイックスタート: Google Cloud CLI の使用で作成した関数を使用している場合、helloGETを名前として使用します。
- ESPv2_PROJECT_NUMBER は、ESPv2 に作成したプロジェクトのプロジェクト番号に置き換えます。この番号を調べる 1 つの方法としては、 Google Cloud コンソールの IAM ページに移動して、デフォルトのコンピューティング サービス アカウントを探す方法があります。memberフラグでは、このサービス アカウントを使用しています。
 - gcloud functions add-iam-policy-binding FUNCTION_NAME \ --region FUNCTION_REGION \ --member "serviceAccount:ESPv2_PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role "roles/cloudfunctions.invoker" \ --project FUNCTIONS_PROJECT_ID 
- FUNCTION_NAME は関数の名前に置き換え、FUNCTION_REGION は関数のデプロイ先のリージョンに置き換えます。クイックスタート: Google Cloud CLI の使用で作成した関数を使用している場合、
gcloud projects add-iam-policy-binding PROJECT_NAME \ --member "serviceAccount:SERVICE_ACCOUNT" \ --role roles/servicemanagement.serviceController
詳細については、IAM によるアクセス管理をご覧ください。
API にリクエストを送信する
このセクションでは、API にリクエストを送信する方法を説明します。
- Endpoints サービス名の環境変数を作成します。これは、OpenAPI ドキュメントの hostフィールドで指定した名前です。例:- Linux または macOS: - export ENDPOINTS_HOST=gateway-12345-uc.a.run.app
- Windows PowerShell: - $Env: ENDPOINTS_HOST="gateway-12345-uc.a.run.app"
 
Linux または Mac OS
前の手順で設定した ENDPOINTS_HOST 環境変数を使用して、curl で HTTP リクエストを送信します。
curl --request GET \
   --header "content-type:application/json" \
   "https://${ENDPOINTS_HOST}/hello"PowerShell
前の手順で設定した ENDPOINTS_HOST 環境変数を使用して、Invoke-WebRequest で HTTP リクエストを送信します。
(Invoke-WebRequest -Method GET `
    -Headers @{"content-type"="application/json"} `
    -URI "https://$Env:ENDPOINTS_HOST/hello").Content
上記の例では、最初の 2 行はバッククォートで終わります。この例を PowerShell に貼り付けるとき、バッククォートの後にスペースがないことを確認してください。このリクエスト例で使用されているオプションについては、Microsoft のドキュメントの Invoke-WebRequest をご覧ください。
サードパーティ製アプリ
Chrome ブラウザの拡張機能である Postman のリクエストなど、サードパーティ製アプリケーションを使用できます。
- HTTP 動詞として GETを選択します。
- ヘッダーで、キー content-typeとその値application/jsonを選択します。
- 環境変数ではなく、実際の URL を使用します。次に例を示します。 - https://gateway-12345-uc.a.run.app/hello
正常なレスポンスが返されなかった場合は、レスポンス エラーのトラブルシューティングをご覧ください。
これで Endpoints の API のデプロイとテストが完了しました。
API の活動を追跡する
- Google Cloud コンソールの [エンドポイント] > [サービス] ページで、API のアクティビティ グラフを表示します。 - グラフにリクエストが反映されるまでしばらくかかります。 
- [ログ エクスプローラ] ページで、API のリクエストログを確認します。Endpoints のリクエストログを表示 
クリーンアップ
このページで使用したリソースについて、 Google Cloud アカウントに課金されないようにするには、次の手順を実施します。
このチュートリアルで使用したサービスを停止する場合は、API と API インスタンスを削除するをご覧ください。