Google Cloud コンソールを使用してサービスへのトラフィックを保護する

このページでは、API Gateway に API をデプロイして、バックエンド サービスへのトラフィックを保護する方法について説明します。

Google Cloud コンソールを使用して、Cloud Run functions でバックエンド サービスにアクセスする新しい API をデプロイする手順は次のとおりです。このクイックスタートでは、API キーを使用してバックエンドを不正アクセスから保護する方法についても説明します。

始める前に

  1. Google Cloud コンソールで、[API Gateway] ページに移動します。

    [API Gateway] に移動

  2. API Gateway では、次の Google サービスを有効にする必要があります。

    名前 タイトル
    apigateway.googleapis.com API Gateway API
    servicemanagement.googleapis.com Service Management API
    servicecontrol.googleapis.com Service Control API

    選択したプロジェクトでこれらのサービスをまだ有効にしていない場合は、有効にするよう求められます。

  3. お支払いが有効になっていることを確認します。

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

API バックエンドをデプロイする

API ゲートウェイは、デプロイされたバックエンド サービスの前に配置され、すべての受信リクエストを処理します。このクイックスタートでは、API Gateway は、以下に示す関数を含む helloGET という名前の Cloud Run functions のバックエンドに受信呼び出しをルーティングします。

/**
 * HTTP Cloud Function.
 * This function is exported by index.js, and is executed when
 * you make an HTTP request to the deployed function's endpoint.
 *
 * @param {Object} req Cloud Function request context.
 *                     More info: https://expressjs.com/en/api.html#req
 * @param {Object} res Cloud Function response context.
 *                     More info: https://expressjs.com/en/api.html#res
 */

exports.helloGET = (req, res) => {
  res.send('Hello World!');
};

クイックスタート: Google Cloud CLI の使用の手順に沿って、サンプルの Cloud Run 関数コードをダウンロードし、Cloud Run functions のバックエンド サービスをデプロイします。

API 定義の作成

API Gateway は API 定義を使用してバックエンド サービスに呼び出しを転送します。特殊なアノテーションを含む OpenAPI 仕様を使用して、選択した API Gateway の動作を定義できます。このクイックスタートの OpenAPI 仕様には、Cloud Run functions のバックエンドへの転送手順が含まれています。

# openapi2-functions.yaml
swagger: '2.0'
info:
  title: API_ID optional-string
  description: Sample API on API Gateway with a Google Cloud Functions backend
  version: 1.0.0
schemes:
  - https
produces:
  - application/json
paths:
  /hello:
    get:
      summary: Greet a user
      operationId: hello
      x-google-backend:
        address: https://us-central1-PROJECT_ID.cloudfunctions.net/helloGET
      responses:
        '200':
          description: A successful response
          schema:
            type: string

前の例の OpenAPI 仕様を使用して API を定義するには:

  1. コマンドラインから、openapi2-functions.yaml という名前の新しいファイルを作成します。

  2. 前の例の OpenAPI 仕様の内容をコピーして、新しく作成したファイルに貼り付けます。

  3. ファイルを次のように編集します。

    1. title フィールドで、API_ID を API の名前(次のステップで作成します)に置き換え、optional-string を任意の簡単な説明に置き換えます。このフィールドの値は、この API へのアクセス権を付与する API キーを作成するときに使用されます。API ID の命名規則については、API ID の要件をご覧ください。
    2. address フィールドで、PROJECT_ID を Google Cloud プロジェクトの名前に置き換えます。

ゲートウェイを作成する

これで、API Gateway でゲートウェイを作成してデプロイする準備が整いました。

  1. Google Cloud コンソールで [API Gateway] ページを開きます。

    [API Gateway] に移動

  2. [Create Gateway] をクリックします。

  3. [API] セクションで、次の操作を行います。

    1. 新しい API を作成するか、[API を選択] プルダウンから既存の API を選択することができます。このチュートリアルでは、[新しい API を作成] を選択します。
    2. API の表示名を入力します。
    3. API の API ID を入力します。
    4. (省略可)Key-Value 形式を使用して API にラベルを追加します。複数のラベルを追加するには、[Add Label] をクリックし、値を入力します。
  4. [API Config] セクションで、次の操作を行います。

    1. 新しい API 構成を作成するか、[構成を選択] プルダウンから既存の API 構成を選択することができます。このチュートリアルでは、[新しい API 構成を作成] を選択します。
    2. API の定義に使用する openapi2-functions.yaml をファイル ブラウザを使用してアップロードします。
    3. API 構成の表示名を入力します。
    4. プルダウン リストからサービス アカウントを選択します。選択したサービス アカウントが API Gatewayの ID として使用されます。

    5. (省略可)Key-Value 形式を使用して、API 構成にラベルを追加します。複数のラベルを追加するには、[Add Label] をクリックし、値を入力します。

  5. [Gateway details] セクションで、次の操作を行います。

    1. ゲートウェイの表示名を入力します。ゲートウェイの URL は自動的に生成されます。
    2. プルダウン メニューからゲートウェイのロケーションを選択します。
    3. (省略可)Key-Value 形式を使用してゲートウェイにラベルを追加します。複数のラベルを追加するには、[Add Label] をクリックし、値を入力します。
  6. [Create Gateway] をクリックします。

これにより、新しく作成されたゲートウェイに API 構成がデプロイされます。ゲートウェイに API 構成をデプロイすると、API クライアントで API へのアクセスに使用できる外部 URL が定義されます。

オペレーションが完了するまでに数分かかることがあります。次の図に示すように、作成およびデプロイのプロセスのステータスを確認するには、メイン ナビゲーション バーの [通知] アイコンをクリックしてステータス通知を表示します。

ステータス通知の通知パネル

正常に完了すると、[Gateways] ランディング ページでゲートウェイの詳細を確認できます。

[API Gateway] に移動

ゲートウェイの URL をメモします。これは、次のステップでデプロイメントをテストするために使用します。

API デプロイのテスト

これでゲートウェイのデプロイ時に生成された URL を使用して API にリクエストを送信できるようになりました。

ブラウザに次の URL を入力します。

  • GATEWAY_URL は、デプロイするゲートウェイ URL を指定します。
  • hello は、API 構成で指定されたパスです。
https://GATEWAY_URL/hello

次に例を示します。

https://my-gateway-a12bcd345e67f89g0h.uc.gateway.dev/hello

ブラウザに「Hello World!」というメッセージが表示されます。

API Gateway が正常に作成されてデプロイされました。

API キーを使用してアクセスを保護する

API バックエンドへのアクセスを保護するには、プロジェクトに関連付けられた API キーを生成し、そのキーに API を呼び出す権限を付与します。詳細については、API キーで API アクセスを制限するをご覧ください。

このクイックスタートで使用している Google Cloud プロジェクトに関連付けられた API キーがまだ存在しない場合は、API キーの作成の手順に沿って追加できます。

API キーを使用してゲートウェイへのアクセスを保護するには:

  1. サービスの API キーサポートを有効にします。
    1. Google Cloud コンソールで、[API とサービス] > [ライブラリ] に移動します。
    2. 検索バーに、作成した API のマネージド サービス名を入力します。この値は、API ランディング ページの API の [マネージド サービス] 列で確認できます。次のような例になります。
      my-api-123abc456def1.apigateway.my-project.cloud.goog
    3. サービスのランディング ページで、[有効にする] をクリックします。
  2. API 構成の作成に使用される OpenAPI 仕様を変更して、すべてのトラフィックに API キー検証セキュリティ ポリシーを適用する手順を含めます。次のように、security タイプと securityDefinitions を追加します。
        # openapi2-functions.yaml
        swagger: '2.0'
        info:
          title: API_ID optional-string
          description: Sample API on API Gateway with a Google Cloud Functions backend
          version: 1.0.0
        schemes:
          - https
        produces:
          - application/json
        paths:
          /hello:
            get:
              summary: Greet a user
              operationId: hello
              x-google-backend:
                address:https://us-central1.PROJECT_ID.cloudfunctions.net/helloGET
              security:
              - api_key: []
              responses:
                '200':
                  description: A successful response
                  schema:
                    type: string
        securityDefinitions:
          # This section configures basic authentication with an API key.
          api_key:
            type: "apiKey"
            name: "key"
            in: "query"
        
    securityDefinition は、仕様で定義されているすべてのパスへのアクセスをリクエストするときに、key という名前のクエリ パラメータとして渡される API キーを要求するように API を構成します。
  3. 新しい API 構成を作成して既存のゲートウェイにデプロイします。
    1. [Gateways] ランディング ページに移動します。

      [API Gateway] に移動

    2. リストからゲートウェイを選択して、詳細を表示します。
    3. [編集] をクリックして、ゲートウェイ構成ペインを開きます。
    4. [API config] セクションで次の操作を行います。
      1. 使用可能なプルダウンから [Create a new API config] を選択します。
      2. ファイル ブラウザを使用して、変更した OpenAPI 仕様をアップロードします。
      3. 新しい API 構成の表示名を入力します。
      4. プルダウン リストからサービス アカウントを選択します。選択したサービス アカウントが API Gatewayの ID として使用されます。
      5. (省略可)Key-Value 形式を使用して、API 構成にラベルを追加します。複数のラベルを追加するには、[Add Label] をクリックし、値を入力します。
    5. [更新] をクリックします。

API キーのテスト

変更した API を作成してデプロイしたら、API にリクエストを送信してみてください。

ブラウザに次の URL を入力します。

  • GATEWAY_URL は、デプロイするゲートウェイ URL を指定します。
  • hello は、API 構成で指定されたパスです。
https://GATEWAY_URL/hello

次に例を示します。

https://my-gateway-a12bcd345e67f89g0h.uc.gateway.dev/hello

これにより次のエラーが発生するはずです。

UNAUTHENTICATED:Method doesn't allow unregistered callers (callers without established identity). Please use API Key or other form of API consumer identity to call this API.

ブラウザに次の URL を入力します。

https://GATEWAY_URL/hello?key=API_KEY

ブラウザに「Hello World!」と表示されます。

これで完了です。これで API バックエンドは API Gateway で正常に保護されました。追加の API キーを生成して、新しい API クライアントのオンボーディングを開始できます。

API の活動を追跡する

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

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

    [API Gateway] に移動

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

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

クリーンアップ

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

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

次のステップ