Kubernetes 用の Apigee APIM Operator を使用して API 管理ポリシーを更新する

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

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

API 管理のニーズが増大したり変化したりすると、クラスタに新しいサービスを追加したり、既存のルートや Ingress オプションを更新したりする必要があります。このページでは、クラスタを更新して次のタスクを完了する方法について説明します。

始める前に

このタスクを開始する前に、Kubernetes 用の Apigee APIM Operator でポリシーを適用するで説明されている手順を完了してください。このページでは、Google Kubernetes Engine(GKE)クラスタを設定し、Kubernetes 用の Apigee APIM Operator をインストールし、Google Kubernetes Engine(GKE)Gateway を作成し、Gateway に 1 つ以上の API 管理ポリシーを適用していることを前提としています。

必要なロール

Kubernetes 用 Apigee APIM オペレータをインストールするで説明されているように、必要なロールをサービス アカウントに割り当てた場合は、これらのタスクを完了するために追加の IAM ロールや権限は必要ありません。

Kubernetes に組み込まれたロールベースのアクセス制御(RBAC)メカニズムを使用して、Google Kubernetes Engine クラスタ内のリソースに対するアクションを認可できます。詳細については、 ロールベース アクセス制御を使用してクラスタ内のアクションを認可するをご覧ください。

新しい Gateway と HTTPRoute を追加する

このセクションでは、新しい Gateway と HTTPRoute をクラスタに追加します。前のタスクガイドでは、サンプル構成で外部 GKE Gateway を使用しました。複数の Gateway が同じリージョンにデプロイされている場合は、同じタイプ(外部と内部の両方または内部の両方)である必要があります。このため、このガイドのサンプル構成でも外部 Gateway を使用します。

APIM Operator は、内部または外部の GKE ゲートウェイで使用できますが、同じリージョンに両方のタイプのゲートウェイをデプロイすることはできません。

新しい Gateway と HTTPRoute をクラスタに追加する手順は次のとおりです。

  1. 新しい外部 GKE Gateway を設定します。詳細と手順については、外部 Gateway をデプロイするをご覧ください。
  2. apim Namespace に gateway2.yaml という名前の新しいファイルを作成します。
  3. 次の内容を新しいファイルにコピーします。
    # gateway2.yaml
    apiVersion: gateway.networking.k8s.io/v1beta1
    kind: Gateway
    metadata:
      name: global-ext-lb2
      spec: 
      gatewayClassName: gke-l7-global-external-managed
      listeners:
      - name: https
        protocol: HTTPS
        allowedRoutes:
          kinds:
          - kind: HTTPRoute
          namespaces:
            from: All
        port: 443
        tls:
          options:
            networking.gke.io/pre-shared-certs: apigee-lb-new-cert-sept
  4. /post の新しい HTTPRoute を同じファイルに追加します(以下をハイライト表示)。
    # http-route2.yaml
      apiVersion: gateway.networking.k8s.io/v1beta1
      kind: HTTPRoute
      metadata:
        name: http-bin-route-post
        namespace: http
      spec:
        parentRefs:
          - kind: Gateway
            name: global-ext-lb2
            namespace: default
        hostnames:
          - HOST_NAME_2
        rules:
        - matches:
          - path:
              type: PathPrefix
              value: "/post"
          backendRefs:
          - name: httpbin
            kind: Service
            port: 80
            namespace: http
  5. 新しい Gateway と HTTPRoute を適用します。
    kubectl apply -f gateway2.yaml
  6. 次のコマンドを使用して HTTPRoute のステータスを確認します。
    kubectl -n http get HttpRoute

    出力例を以下に示します。

    NAME             HOSTNAMES                                                  AGE
    http-bin-route   ["my-hostname-2"]   12d
    
  7. 次のコマンドを使用して Gateway のステータスを確認します。
    kubectl get gateway global-ext-lb2

    出力は次のようになります。

    NAME             CLASS                            ADDRESS        PROGRAMMED   AGE
    global-ext-lb2   gke-l7-global-external-managed   34.54.193.92   True         11d
    

    Address 列に有効な IP アドレスが含まれていて、Programmed のステータスが True であることを確認します。

  8. Gateway を記述して、ルートが接続されていることを確認します。
    kubectl describe gateway global-ext-lb2
  9. 出力例を以下に示します。

    ...
    Listeners:
      Attached Routes:  1
      Conditions:
        Last Transition Time:  2024-10-03T03:10:17Z
    ...

    Attached Routes の値が 1 であることを確認します。

  10. Gateway にリクエストを送信して、ルートが機能していることを確認します。
    curl -X POST http://GATEWAY_IP_ADDRESS/post -H "Host: HOST_NAME"

    ここで

    • GATEWAY_IP_ADDRESS は、ステップ 7 で返されたレスポンスの Address 列に示すように、Gateway の IP アドレスです。
    • HOST_NAME は、Gateway の HTTPRoute で定義されたホスト名です。

  11. 出力例を以下に示します。
      {
        "args": {}, 
        "headers": {
          "Accept": "*/*", 
          "Host": "apigee-apim-operator-test.apigee.net", 
          "User-Agent": "curl/8.7.1", 
          "X-Cloud-Trace-Context": "2bb8a80e29e80662ff9cb89971c447d9/13083106619927322701"
        }, 
        "origin": "67.164.1.10,34.54.193.72", 
        "url": "https://apigee-apim-operator-test.apigee.net/post"
      }
      
  12. 前の手順で作成した新しい Gateway の HTTPRoute を参照する新しい APIM 拡張ポリシーを作成します。
    1. apim Namespace に apim-policy2.yaml という名前の新しいファイルを作成します。
    2. 次の内容を新しいファイルにコピーします。
      # apim-policy2.yaml
      apiVersion: apim.googleapis.com/v1alpha1
      kind: APIMExtensionPolicy
      metadata:
        name: global-ext-lb2-apim-policy-2
        namespace: apim
      spec:
        location: global
        failOpen: false
        timeout: 1000ms
        targetRef: # identifies the Gateway where the extension should be installed
          name: global-ext-lb2 
          kind: Gateway
          namespace: default
    3. 新しい APIM 拡張機能ポリシーを適用します。
      kubectl apply -f apim-policy2.yaml

      ファイルが適用されると、APIM Operator はバックグラウンドでネットワーキング リソースを作成します。

    4. APIM 拡張ポリシーのステータスを確認します。
      kubectl -n apim get APIMExtensionPolicy

      出力例を以下に示します。

      NAME                           STATE        ERRORMESSAGE
      global-ext-lb2-apim-policy-2   RUNNING  
      

      STATE の値が RUNNING であることを確認します。

    5. 変更がすべてのロードバランサ インスタンスに伝播されるまで 5 分待ってから、次のコマンドを使用して、新しい Gateway へのリクエストが失敗することを確認します。
      curl -X POST http://GATEWAY_IP_ADDRESS/post -H "Host: HOSTNAME"

      ここで

      • GATEWAY_IP_ADDRESS は、 前の手順で取得した Gateway の IP アドレスです。
      • HOST_NAME は、Gateway の HTTPRoute で定義されたホスト名です。

      リクエストは失敗し、次のようなレスポンスが返されます。

      {
        "fault": {
          "faultstring": "Raising fault. Fault name : RF-insufficient-request-raise-fault",
          "detail": {
            "errorcode": "steps.raisefault.RaiseFault"
          }
        }
      }

      これは、Apigee へのサービス拡張が有効であり、API キーとアクセス トークンの検証が適用されていることを意味します。デベロッパー アプリの作成、API キーの取得、キーを使用した新しい Gateway のテストに必要な手順については、Apigee サービス拡張機能をテストするをご覧ください。

API プロダクトを更新する

新しい APIM 拡張ポリシーを参照するように既存の API プロダクトを変更します。

  1. apim Namespace に api-product-2.yaml という名前の新しいファイルを作成します。
  2. 次の内容を新しいファイルにコピーします。
    # api-product-2.yaml
    apiVersion: apim.googleapis.com/v1alpha1
    kind: APIProduct
    metadata:
      name: api-product-2
      namespace: apim
    spec:
      name: api-product-2
      approvalType: auto
      description: Http bin GET calls
      displayName: api-product-2
    EnforcementRefs:
      - name: global-ext-lb1-apim-policy 
        kind: APIMExtensionPolicy
        group: apim.googleapis.com
        namespace: apim
      - name: global-ext-lb2-apim-policy 
        kind: APIMExtensionPolicy
        group: apim.googleapis.com
        namespace: apim
      attributes:
      - name: access
        value: private
  3. 新しい API プロダクト ファイルを適用します。
    kubectl apply -f api-product-2.yaml

    変更がクラスタ全体に適用されるまで、約 3 分ほどかかります。

この例では、yaml のハイライト表示された部分に示すように、API プロダクト api-product-2EnforcementRefs セクションが更新され、global-ext-lb1-apim-policyglobal-ext-lb2-apim-policy の両方を参照するようにしています。

新しい API プロダクトを作成する

新しい API プロダクトを作成します。

  1. apim Namespace に api-product-2.yaml という名前の新しいファイルを作成します。
  2. 次の内容を新しいファイルにコピーします。
    # api-product-2.yaml
    apiVersion: apim.googleapis.com/v1alpha1
    kind: APIProduct
    metadata:
      name: api-product-2
      namespace: apim
    spec:
      name: api-product-2
      approvalType: auto
      description: Http bin GET calls
      displayName: api-product-2
      enforcementRefs:
      - name: global-ext-lb2-apim-policy 
        kind: APIMExtensionPolicy
        group: apim.googleapis.com
        namespace: apim
      attributes:
      - name: access
        value: private
  3. 新しい API プロダクト ファイルを適用します。
    kubectl apply -f api-product-2.yaml

    変更がクラスタ全体に適用されるまで、約 3 分ほどかかります。

この例では、yaml のハイライト表示された部分に示すように、新しい API プロダクト api-product-2EnforcementRefs セクションが作成され、global-ext-lb2-apim-policy を参照します。

新しい API オペレーション セットを作成する

新しい API オペレーション セットを作成します。

  1. apim Namespace に item-set-post.yaml という名前の新しいファイルを作成します。
  2. 次の内容を新しいファイルにコピーします。
    # item-set-post.yaml
    apiVersion: apim.googleapis.com/v1alpha1
    kind: APIOperationSet
    metadata:
      name: item-set-post
      namespace: apim
    spec:
      apiProductRefs:
        - name: api-product-1
          kind: APIProduct
          group: apim.googleapis.com
          namespace: apim
      quota:
        limit: 1
        interval: 1
        timeUnit: minute
      restOperations:
        - name: PostItems
          path: "/post"
          methods:
          - POST
  3. 新しい API オペレーション セット ファイルを適用します。
    kubectl apply -f item-set-post.yaml

    変更がクラスタ全体に適用されるまで、約 3 分ほどかかります。

この例では、ファイルのハイライト表示された部分に示すように、新しい API オペレーション セット item-set-postrestOperations 値が作成され、/post パスを参照します。

新しい Gateway 構成をテストする

新しい Gateway 構成をテストするには、新しい /post パスに次のリクエストを送信します。

curl -X POST http://GATEWAY_IP_ADDRESS/post -H "Host: HOST_NAME"

ここで

  • GATEWAY_IP_ADDRESS は、 前の手順で取得した Gateway の IP アドレスです。
  • HOST_NAME は、Gateway の HTTPRoute で定義されたホスト名です。

リクエストが成功すると、次のようなレスポンスが返されます。

{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Host": "apigee-apim-operator-test.apigee.net",
    "User-Agent": "curl/8.7.1",
    "X-Api-Key": "f0N6sXXXclGXXXe0oP5XXXdA20PjgrP2x8xXXh7z4XXXKiYt",
    "X-Cloud-Trace-Context": "bb3a768787099bda628781188bfb318b/15554891713516675739"
  },
  "origin": "34.54.193.72",
  "url": "https://34.54.193.72/post"
}

トラブルシューティング

APIM Operator で使用される API 管理ポリシーの更新と拡張中に問題が発生した場合は、APIM Operator のトラブルシューティングで一般的なエラーの解決策をご覧ください。

次のステップ