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 Console の [エンドポイント] の [サービス] ページで確認できます。

Endpoints アーキテクチャ

Cloud Endpoints の概要については、Endpoints についてEndpoints アーキテクチャをご覧ください。

ESPv2 に移行する

Cloud Endpoints の以前のリリースでは、Cloud Functions との Extensible Service Proxy(ESP)の使用がサポートされていました。 既存の API を ESPv2 に移行するには、Extensible Service Proxy V2 への移行をご覧ください。

タスクリスト

次のタスクリストを参照しながら、チュートリアルを実施してください。このチュートリアルを完了するには、すべてのタスクを行う必要があります。

  1. Google Cloud プロジェクトを作成します。独自の Cloud Run 関数をデプロイしていない場合は、サンプルのバックエンド関数をデプロイします。始める前にをご覧ください。
  2. ESPv2 サービス用に Cloud Run のホスト名を予約します。Cloud Run ホスト名の予約をご覧ください。
  3. API を記述する OpenAPI ドキュメントを作成し、Cloud Run 関数へのルートを構成します。Endpoints を構成するをご覧ください。
  4. OpenAPI ドキュメントをデプロイして、マネージド サービスを作成します。Endpoints 構成をデプロイするをご覧ください。
  5. Endpoints サービス構成で新しい ESPv2 Docker イメージをビルドします。新しい ESPv2 イメージをビルドするをご覧ください。
  6. ESPv2 コンテナを Cloud Run にデプロイします。次に、サービスを呼び出すための Identity and Access Management(IAM)権限を ESPv2 に付与します。ESPv2 コンテナをデプロイするをご覧ください。
  7. 関数を呼び出します。API にリクエストを送信するをご覧ください。
  8. 関数に対するアクティビティを追跡します。API の活動を追跡するをご覧ください。
  9. Google Cloud アカウントへの課金が発生しないようにします。クリーンアップをご覧ください。

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

Cloud Run 関数用の Endpoints を使用する前に、次のことをおすすめします。

  • ESPv2 コンテナを Cloud Run にデプロイするときに使用する新しい Google Cloud プロジェクトを作成します。

  • Cloud Run 関数用に新規のプロジェクトを作成するか、既存のプロジェクトを選択します。

次の手順に従って設定します。

  1. Google Cloud コンソールで [リソースの管理] ページに移動し、プロジェクトを作成します。

    [リソースの管理] ページに移動

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

    課金を有効にする方法について

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

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

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

    gcloud CLI をダウンロードする

  6. 独自のバックエンド Cloud Run 関数をデプロイしていない場合は、クイックスタート: Google Cloud CLI の使用の手順に沿って、Google Cloud プロジェクトを選択または作成し、サンプル関数をデプロイします。関数がデプロイされているリージョンとプロジェクト ID をメモしておきます。このページでは以降、このプロジェクト ID を FUNCTIONS_PROJECT_ID として記載します。

Cloud Run ホスト名の予約

OpenAPI ドキュメントまたは gRPC サービス構成を構成するには、ESPv2 サービス用の Cloud Run ホスト名を予約する必要があります。ホスト名を予約するには、Cloud Run にサンプル コンテナをデプロイします。後で、同じ Cloud Run サービスに ESPv2 コンテナをデプロイします。

  1. gcloud CLI がデータやサービスにアクセスできるように承認されていることを確認します。
    1. ログインします。
      gcloud auth login
    2. 表示された新しいブラウザタブで、ESPv2 を Cloud Run にデプロイするために作成した Google Cloud プロジェクトの編集者またはオーナーのロールが割り当てられているアカウントを選択します。
  2. リージョンを設定します。
    gcloud config set run/region us-central1
  3. サンプル イメージ gcr.io/cloudrun/hello を Cloud Run にデプロイします。CLOUD_RUN_SERVICE_NAME は、このサービスに使用する名前に置き換えます。
    gcloud run deploy CLOUD_RUN_SERVICE_NAME \
        --image="gcr.io/cloudrun/hello" \
        --allow-unauthenticated \
        --platform managed \
        --project=ESP_PROJECT_ID
    

    このコマンドが正常に完了すると、次のようなメッセージが表示されます。

    Service [CLOUD_RUN_SERVICE_NAME] revision [CLOUD_RUN_SERVICE_NAME-REVISION_NUM] has been deployed and is serving traffic at CLOUD_RUN_SERVICE_URL

    CLOUD_RUN_SERVICE_NAMEgateway に設定した場合:

    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.appCLOUD_RUN_SERVICE_URL で、gateway-12345-uc.a.run.appCLOUD_RUN_HOSTNAME です。

  4. CLOUD_RUN_SERVICE_NAMECLOUD_RUN_HOSTNAME をメモします。ESPv2 ベータ版を後で CLOUD_RUN_SERVICE_NAME Cloud Run サービスにデプロイします。OpenAPI ドキュメントの host フィールドで CLOUD_RUN_HOSTNAME を指定します。

Endpoints を構成する

OpenAPI 仕様 v2.0 に準拠した、関数の surface と認証要件を記述した OpenAPI ドキュメントを用意する必要があります。また、ESPv2 が関数を呼び出すために必要な情報を取得できるよう、このドキュメントには各関数の URL を設定した Google 固有のフィールドも追加する必要があります。OpenAPI を初めて使用する場合は、OpenAPI の概要で詳細をご覧ください。

  1. openapi-functions.yaml という名前のテキスト ファイルを作成します。(便宜上、このページでは OpenAPI ドキュメントをファイル名で表記していますが、必要に応じてファイル名以外の名前を指定することもできます)。
  2. 各関数は、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
    
    yaml 形式ではインデントが重要です。たとえば、host フィールドは info と同じレベルにする必要があります。
  3. 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
    
    ESPv2 に呼び出しのみを許可して Cloud Run 関数を保護する場合で、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
    
    ESPv2 は、認証用の Cloud Run 関数を呼び出すときに ID トークンを生成します。ID トークンには、関数ホストと関数名を指定する適切な audience が必要です。ESPv2 は、指定されていれば jwt_audience フィールドの値を使用して ID トークン用に audience を設定し、指定されていない場合は、address フィールドを使用します。
  4. 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
    
  5. openapi-functions.yaml ファイルの title プロパティの値をメモします。

    title: Cloud Endpoints + GCF

    title プロパティの値は、構成をデプロイした後の Endpoints サービスの名前になります。

  6. OpenAPI ドキュメントを保存します。

Endpoints に必要な OpenAPI ドキュメントのフィールドについては、Endpoints を構成するをご覧ください。

Endpoints 構成をデプロイする

Endpoints の構成をデプロイするには、gcloud endpoints services deploy コマンドを使用します。このコマンドを実行すると、Service Management を使用してマネージド サービスが作成されます。

Endpoints 構成をデプロイするには:

  1. OpenAPI ドキュメントが格納されているディレクトリに移動します。
  2. 構成をアップロードしてマネージド サービスを作成します。

    gcloud endpoints services deploy openapi-functions.yaml \
        --project ESP_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
endpoints.googleapis.com Google Cloud Endpoints

ほとんどの場合、gcloud endpoints services deploy コマンドによってこれらの必須サービスが有効化されます。ただし、以下の状況では、gcloud コマンドは正常に完了しますが、必須サービスが有効になりません。

  • Terraform などのサードパーティのアプリケーションを使用していて、上記のサービスを含めていない場合。

  • 上記のサービスが明示的に無効にされている既存の Google Cloud プロジェクトに Endpoints 構成をデプロイした場合。

必要なサービスが有効になっていることを確認するには、次のコマンドを実行します。

gcloud services list

必要なサービスが表示されない場合は、次のコマンドを使用してサービスを有効にします。

gcloud services enable servicemanagement.googleapis.com
gcloud 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 サービスをご覧ください。

新しい ESPv2 イメージをビルドする

新しい ESPv2 Docker イメージに Endpoints サービス構成をビルドします。その後、このイメージを予約済みの Cloud Run サービスにデプロイします。

新しい ESPv2 Docker イメージにサービス構成をビルドするには:

  1. gcloud CLI がインストールされているローカルマシンにこのスクリプトをダウンロードします。

  2. 次のコマンドでスクリプトを実行します。

    chmod +x gcloud_build_image
    
    ./gcloud_build_image -s CLOUD_RUN_HOSTNAME \
        -c CONFIG_ID -p ESP_PROJECT_ID
    

    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
    
  3. このスクリプトは、gcloud コマンドを使用してサービス構成をダウンロードし、新しい ESPv2 イメージにサービス構成をビルドして、新しいイメージを次のプロジェクト コンテナ レジストリにアップロードします。このスクリプトは、出力イメージ名に ESP_VERSION で示される ESPv2 の最新リリースを自動的に使用します。出力イメージは次の場所にアップロードされます。

    gcr.io/ESP_PROJECT_ID/endpoints-runtime-serverless:ESP_VERSION-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 コンテナをデプロイする

  1. 前の手順で作成した新しいイメージを使用して、ESPv2 Cloud Run サービスをデプロイします。CLOUD_RUN_SERVICE_NAME は、Cloud Run ホスト名の予約で、前の手順でホスト名を予約したときと同じ Cloud Run サービスの名前に置き換えます。

    gcloud run deploy CLOUD_RUN_SERVICE_NAME \
      --image="gcr.io/ESP_PROJECT_ID/endpoints-runtime-serverless:ESP_VERSION-CLOUD_RUN_HOSTNAME-CONFIG_ID" \
      --allow-unauthenticated \
      --platform managed \
      --project=ESP_PROJECT_ID
  2. CORS を有効にするなどの追加の ESPv2 起動オプションを使用するように Endpoints を構成する場合は、引数を ESPv2_ARGS 環境変数に渡すことができます。

    gcloud run deploy CLOUD_RUN_SERVICE_NAME \
      --image="gcr.io/ESP_PROJECT_ID/endpoints-runtime-serverless:ESP_VERSION-CLOUD_RUN_HOSTNAME-CONFIG_ID" \
      --set-env-vars=ESPv2_ARGS=--cors_preset=basic \
      --allow-unauthenticated \
      --platform managed \
      --project ESP_PROJECT_ID

    使用可能なオプション、複数のオプションの指定方法など、ESPv2_ARGS 環境変数の詳細と設定例については、Extensible Service Proxy V2 ベータ版のフラグをご覧ください。

  3. Service ManagementService Control を呼び出す権限を ESPv2 に付与します。

    • Google Cloud コンソールで [Cloud Run] ページに移動します。
    • [Cloud Run] ページに移動

    • デプロイした Cloud Run インスタンスと、それに関連付けられたサービス アカウントを確認できます。
    • サービス アカウントに必要な権限を付与します。
    • gcloud projects add-iam-policy-binding PROJECT_NAME \
         --member "serviceAccount:SERVICE_ACCOUNT" \
         --role roles/servicemanagement.serviceController
    詳細については、ロールと権限についてをご覧ください。
  4. 関数を呼び出すための権限を ESPv2 に付与します。関数ごとに次のコマンドを実行します。このコマンドでは、次の要素を置き換えてください。

    • FUNCTION_NAME は関数の名前に置き換え、FUNCTION_REGION は関数のデプロイ先のリージョンに置き換えます。クイックスタート: Google Cloud CLI の使用で作成した関数を使用している場合、helloGET を名前として使用します。
    • ESP_PROJECT_NUMBER は、ESPv2 に作成したプロジェクトのプロジェクト番号に置き換えます。この番号を調べる 1 つの方法としては、Google Cloud コンソールの [IAM] ページに移動して、デフォルトのコンピューティング サービス アカウントを探す方法があります。member フラグでは、このサービス アカウントを使用しています。
    gcloud functions add-iam-policy-binding FUNCTION_NAME \
       --region FUNCTION_REGION \
       --member "serviceAccount:ESP_PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
       --role "roles/cloudfunctions.invoker" \
       --project FUNCTIONS_PROJECT_ID
    

詳細については、IAM によるアクセス管理をご覧ください。

API にリクエストを送信する

このセクションでは、API にリクエストを送信する方法を説明します。

  1. 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 の活動を追跡する

  1. Google Cloud コンソールで [Endpoints] > [サービス] ページに移動して、API のアクティビティ グラフを表示します。

    Endpoints のアクティビティ グラフを表示

    グラフにリクエストが反映されるまでしばらくかかります。

  2. [ログ エクスプローラ] ページで、API のリクエストログを確認します。Endpoints のリクエストログを表示

API のデベロッパー ポータルを作成する

Cloud Endpoints Portal を使用してデベロッパー ポータルを作成できます。デベロッパー ポータルとは、サンプル API の操作に使用できるウェブサイトです。詳細については、Cloud Endpoints Portal の概要をご覧ください。

クリーンアップ

このページで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。

このチュートリアルで使用したサービスを停止する場合は、API と API インスタンスを削除するをご覧ください。

次のステップ