GKE Gateway にポリシーを追加する

このページの内容は Apigee に適用されます。Apigee ハイブリッドには適用されません。

Apigee Edge のドキュメントを表示する。

このページでは、Apigee APIM Operator for Kubernetes(プレビュー版)を使用して、Apigee ランタイム ポリシーとトークン挿入ポリシーを Google Kubernetes Engine(GKE)Gateway に追加する方法について説明します。 Google 使用可能なポリシーセットを Gateway に追加すると、Gateway の機能を API プロダクトの適用を超えて拡張し、追加のセキュリティ ルールとビジネスルールを含めることができます。

Kubernetes 用の Apigee APIM Operator を使用して、Gateway に次のポリシーを追加できます。

概要

以降のセクションでは、次の方法について説明します。

始める前に

このガイドの例として使用されているポリシーの完全なセットを使用して GKE Gateway を変更するには、Apigee 内でトークンを作成し、プロキシと拡張機能をデプロイするために必要なロールを持つサービス アカウントが必要です。 Google トークンを作成しない場合は、サービス アカウントに追加のロールを追加する必要はありません。次のセクションに進みます。

必要な権限を持つサービス アカウントを作成するには:

  1. Kubernetes 用の Apigee APIM Operator のインストールガイドapigee-apim-gsa という名前のサービス アカウントを作成した場合は、この手順をスキップして次の手順に進みます。それ以外の場合は、サービス アカウントを作成します。
    gcloud iam service-accounts create apigee-apim-gsa --project=${PROJECT_ID}
  2. トークンの作成に必要なロールをサービス アカウントに付与します。
    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member "serviceAccount:apigee-apim-gsa@${PROJECT_ID}.iam.gserviceaccount.com" \
      --role "roles/iam.serviceAccountTokenCreator"
  3. apigee-apim-gsa サービス アカウントに、プロキシと拡張機能をデプロイするために必要なロールを付与します。
    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member "serviceAccount:apigee-apim-gsa@${PROJECT_ID}.iam.gserviceaccount.com" \
      --role "roles/iam.serviceAccountUser"

ポリシーを使用して GKE Gateway を変更する

1 つ以上のポリシーを使用して GKE Gateway を変更し、機能を拡張できます。このチュートリアルの例では、2 つの Apigee ポリシーと Google トークン挿入ポリシーの仕様を含む yaml ファイルを Gateway に適用します。

次の yaml ファイルを使用して Gateway に適用されるポリシーは、Gateway に送信されたリクエストを評価するときに異なるロールを実行します。

  • SpikeArrest ポリシーは、一定の時間内に許可されるリクエストの最大レートを定義することで、ピーク メッセージ レートを制御します。この例では、最大レートは 1 分あたり 5 に設定されています。SpikeArrest ポリシーを使用してトラフィックの急増を緩和する方法については、SpikeArrest ポリシーをご覧ください。
  • JavaScript ポリシーを使用すると、Gateway リクエストにカスタム JavaScript コードを追加できます。この例では、ポリシーを使用してリクエストにカスタム ヘッダーを追加します。JavaScript ポリシーを使用してカスタムコードを追加する方法については、JavaScript ポリシーをご覧ください。
  • トークン挿入ポリシーは、AssignMessage ポリシーを使用して、認証アクセス トークンを Gateway リクエストに挿入するために使用されます。 Google Google Apigee は、 Google OAuth トークンまたは OpenID Connect トークンを使用して Google サービスで認証することをサポートしています。認証トークンの詳細については、Google 認証システムの使用をご覧ください。

ポリシーを Gateway に追加します。

  1. apim Namespace に apigee-policies.yaml という名前の新しいファイルを作成します。
  2. 次のファイルの内容を、作成した新しいファイルにコピーします。
    # apigee-policies.yaml
    apiVersion: apim.googleapis.com/v1alpha1
    kind: SpikeArrest
    metadata:
      name: spike-arrest
      namespace: apim
    spec:
      identifier:
        ref: request.header.name
      useEffectiveCount: true
      peakMessageRate:
        value: "5pm"
    ---
    apiVersion: apim.googleapis.com/v1alpha1
    kind: Javascript
    metadata:
      name: js-add-headers
      namespace: apim
    spec:
      timeLimit: 2000
      source: |
        var sum = 1+1;
        context.setVariable("request.header.first", 1);
        context.setVariable("request.header.second", 1);
        context.setVariable("request.header.sum", sum);
    ---
    apiVersion: apim.googleapis.com/v1alpha1
    kind: AssignMessage
    metadata:
      name: google-token-policy
      namespace: apim
    spec:
      setActions:
        - authentication:
            googleAccessToken:
              scopes:
                - 'https://www.googleapis.com/auth/cloud-platform'
      AssignTo:
        createNew: false
        type: request
      
  3. 次のコマンドを使用して、yaml ファイルを Gateway に適用します。
    kubectl -n apim apply -f apigee-policies.yaml

SharedFlow テンプレートとして TemplateRule を作成する

このステップでは、Gateway に追加したポリシーを適用する TemplateRule を作成します。テンプレート ルールは、組織管理者が作成する SharedFlow のルールです。サービス デベロッパーが Gateway トラフィックに適用するポリシーが承認済みのもののみになるようにします。テンプレート ルールにより、デベロッパーは使用可能なポリシー、特定のユースケースに必要なポリシー、サービス デベロッパーが使用できないポリシーを把握できます。

テンプレート ルールを作成する

AssignMessage ポリシーの使用を適用するテンプレート ルールを作成します。

  1. apim Namespace に template-rule.yaml という名前の新しい yaml ファイルを作成します。
  2. 次のファイルの内容を、作成した新しいファイルにコピーします。
    # template-rule.yaml
    apiVersion: apim.googleapis.com/v1alpha1
    kind: ApimTemplateRule
    metadata:
      name: template-rule
      namespace: apim
    spec:
      allowList: [SpikeArrest, Javascript]
      requiredList: [AssignMessage]
      denyList: []

    この例では、テンプレート ルールは、 Google トークン挿入ポリシーを記述する AssignMessage ポリシーが必要であることをデベロッパーに伝えます。また、API 管理で SpikeArrest ポリシーと JavaScript ポリシーを使用できることもデベロッパーに伝えます。拒否リストに指定されたポリシーはありません。

テンプレート ルールを適用する

次のコマンドを使用してテンプレート ルールを適用します。

kubectl apply -f template-rule.yaml

テンプレート ルールを含めるように Apigee テンプレートを更新する

前のセクションで作成したテンプレート ルールを追加するように Apigee テンプレートを更新します。

  1. apim Namespace に new-admin-template.yaml という名前の新しい yaml ファイルを作成します。
  2. 次のファイルの内容を、作成した新しいファイルにコピーします。
    # new-admin-template.yaml
    apiVersion: apim.googleapis.com/v1alpha1
    kind: ApimTemplate
    metadata:
      name: new-admin-template
      namespace: apim
    spec:
      apimTemplateRule:
        group: apim.googleapis.com
        kind: ApimTemplateRule
        name: template-rule
        namespace: apim
      templates:
      - policies:
          - group: apim.googleapis.com
            kind: SpikeArrest
            name: spike-arrest
            namespace: apim
          - group: apim.googleapis.com
            kind: Javascript
            name: js-add-headers
            namespace: apim
          - group: apim.googleapis.com
            kind: AssignMessage
            name: google-token-policy
            namespace: apim
  3. 次のコマンドを使用して、更新したテンプレートを適用します。
    kubectl apply -f new-admin-template.yaml

Apigee Gateway ポリシーをデプロイする

この手順では、ApigeeGatewayPolicy の仕様を含む新しいファイルを Gateway に適用します。このポリシーは、Apigee テンプレートを Gateway にデプロイするために使用されます。

Apigee Gateway ポリシーをデプロイします。

  1. apim Namespace に apigee-gateway-policy-withSA.yaml という名前の新しい yaml ファイルを作成します。
  2. 次のファイルの内容を、作成した新しいファイルにコピーします。
    # apigee-gateway-policy-withSA.yaml
    apiVersion: apim.googleapis.com/v1alpha1
    kind: ApigeeGatewayPolicy
    metadata:
      name: apim-template-injection
      namespace: apim
    spec:
      serviceAccount: apigee-apim-gsa@$PROJECT_ID.iam.gserviceaccount.com
      ref:
        group: apim.googleapis.com
        kind: ApimTemplate
        name: new-admin-template
        namespace: apim
      targetRef:
        group: apim.googleapis.com
        kind: APIMExtensionPolicy
        name: global-ext-lb1-apim-policy
        namespace: apim
  3. ポリシーを適用します。
    kubectl apply -f apigee-gateway-policy-withSA.yaml
  4. 新しい Gateway ポリシーのデプロイ ステータスを確認します。
    kubectl -n apim get ApigeeGatewayPolicy

    デプロイすると、ポリシー STATUSCREATED と表示されます。

新しい Gateway ポリシーがデプロイされたら、2 分待ってから Gateway にリクエストを送信し、ポリシーがクラスタに伝播されるようにします。

ポリシー適用を検証する

Apigee Gateway ポリシーが想定どおりに機能していることを確認するには、次のセクションで説明するように Gateway にリクエストを送信します。

AssignMessage ポリシーの適用を確認する

AssignMessage ポリシーを使用して {company_name} トークンがリクエストに挿入されていることを確認するには、次のコマンドを使用して Gateway にリクエストを送信します。

curl http://GATEWAY_IP_ADDRESS/get -H "Host: HOST_NAME" -H "x-api-key: API_KEY"

ここで

  • GATEWAY_IP_ADDRESS は Gateway の IP アドレスです。Gateway の IP アドレスは、次のコマンドを使用して取得できます。
    kubectl get gateway GATEWAY_NAME
  • HOST_NAME はホストの名前です。
  • API_KEY は API キー値です。

成功した場合、レスポンスには、次のような生成されたベアラ トークンを含む Authorization ヘッダーが含まれます。

{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Authorization": "Bearer ya29.c.c0ASRK0Gbw03y9cfvxL11DxaRYBQUU18SmUP4Vu63OckHI5cX7wJ4DmGMG2vbDDS69HXJHqMj-lak4tcqOsJGmE65crn2gNuJLanXidwM8", 
    "First": "1.0", 
    "Host": "apigee-apim-operator-test.apigee.net", 
    "Second": "1.0", 
    "Sum": "2", 
    "User-Agent": "curl/8.7.1", 
    "X-Api-Key": "McYcHGR3PTSGLXExvKADwQ1JJeCjgPDUvAakCl0rJKCFaX0Y", 
    "X-Cloud-Trace-Context": "0fd3dadc2a3c328fa968d5f5f1434c29/18300783092696918345"
  }, 
  "origin": "34.54.108.129", 
  "url": "apigee-apim-operator-test.apigee.net/get"
}

SpikeArrest ポリシーの適用を確認する

SpikeArrest ポリシーの適用をテストするには、1 分以内に Gateway に 10 回リクエストを送信します。

次のスクリプトを実行してリクエストを生成できます。

#!/bin/sh
for i in $(seq 1 11); do
    curl http://GATEWAY_IP_ADDRESS/get -H "Host: HOST_NAME" -H "x-api-key: API_KEY"
    sleep 1
done

ここで

  • GATEWAY_IP_ADDRESS は Gateway の IP アドレスです。Gateway の IP アドレスは、次のコマンドを使用して取得できます。ここで、GATEWAY_NAME は Gateway の名前です。
    kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
  • HOST_NAME は、Gateway の HTTPRoute で定義されたホスト名です。
  • API_KEY は、テストのセットアップで取得した API キー値です。

レスポンスは次のようになります。

"fault":{"faultstring":"Spike arrest violation. Allowed rate : MessageRate{capacity=5, period=Minutes}","detail":{"errorcode":"policies.ratelimit.SpikeArrestViolation"}}}

トラブルシューティング

GKE Gateway にポリシーを追加するときに問題が発生した場合は、APIM Operator のトラブルシューティングで一般的なエラーの解決策をご覧ください。

次のステップ