GKE 게이트웨이에 정책 추가

이 페이지는 Apigee에 적용되지만 Apigee Hybrid에는 적용되지 않습니다.

Apigee Edge 문서 보기

이 페이지에서는 Kubernetes용 Apigee APIM Operator를 사용하여 Google Kubernetes Engine(GKE) 게이트웨이에 Apigee 런타임 정책 및 Google 토큰 삽입 정책을 추가하는 방법을 설명합니다. 게이트웨이에 사용 가능한 정책 집합을 추가하면 API 제품 시행을 넘어 보안 및 비즈니스 규칙을 추가하여 게이트웨이의 기능을 확장할 수 있습니다.

Kubernetes용 Apigee APIM Operator를 사용하여 게이트웨이에 다음 정책을 추가할 수 있습니다.

개요

다음 섹션에서는 아래 작업을 수행하는 방법을 설명합니다.

시작하기 전에

이 가이드의 예시로 사용된 전체 정책 집합으로 GKE 게이트웨이를 수정하려면 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 게이트웨이 수정

하나 이상의 정책으로 GKE 게이트웨이를 수정하여 기능을 확장할 수 있습니다. 이 예시 둘러보기에서는 두 개의 Apigee 정책 및 Google 토큰 삽입 정책에 관한 사양이 포함된 yaml 파일을 게이트웨이에 적용합니다.

다음 yaml 파일을 사용하여 게이트웨이에 적용된 각 정책은 게이트웨이로 전송된 요청을 평가할 때 서로 다른 역할을 수행합니다.

  • SpikeArrest 정책은 시간 단위당 허용되는 최대 요청 비율을 정의하여 최대 메시지 비율을 제어합니다. 이 예시에서 최대 비율은 분당 5로 설정됩니다. SpikeArrest 정책을 사용하여 트래픽의 급증을 완화하는 방법에 관한 자세한 내용은 SpikeArrest 정책을 참조하세요.
  • JavaScript 정책을 사용하면 게이트웨이 요청에 커스텀 JavaScript 코드를 추가할 수 있습니다. 이 예시에서는 정책이 요청에 커스텀 헤더를 추가하는 데 사용됩니다. JavaScript 정책을 사용하여 커스텀 코드를 추가하는 방법에 관한 자세한 내용은 JavaScript 정책을 참조하세요.
  • Google 토큰 삽입 정책은 AssignMessage 정책을 사용하여 Google 인증 액세스 토큰을 게이트웨이 요청에 삽입하는 데 사용됩니다. Apigee에서는 Google OAuth 토큰 또는 OpenID Connect 토큰을 사용하여 Google 서비스로 인증할 수 있도록 지원합니다. 인증 토큰에 관한 자세한 내용은 Google 인증 사용을 참조하세요.

게이트웨이에 다음과 같이 정책을 추가합니다.

  1. apim 네임스페이스에 apigee-policies.yaml이라는 새 파일을 만듭니다.
  2. 다음 파일의 콘텐츠를 새로 만든 파일에 복사합니다.
    # apigee-policies.yaml
    apiVersion: apim.googleapis.com/v1
    kind: SpikeArrest
    metadata:
      name: spike-arrest
      namespace: apim
    spec:
      identifier:
        ref: request.header.name
      useEffectiveCount: true
      peakMessageRate:
        value: "5pm"
    ---
    apiVersion: apim.googleapis.com/v1
    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/v1
    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
    ---
    apiVersion: apim.googleapis.com/v1
    kind: KVM
    metadata:
      name: kvm-1
      namespace: apim
    spec:
      delete:
      - keys:
        - value: mykey
      description: kvm1
      displayName: kvm1
      exclusiveCache: true
      expiryTimeInSecs: 3600
      get:
      - assignTo: response.header.mykvm
        index: 0
        keys:
        - value: mykey
      initialEntries:
      - keys:s
        - key1
        values:s
        - val1
      - keys:s
        - mykey
        values:
        - initvalue
      isEncrypted: false
      mapIdentifier: mapIdentifier
      mapName:s
        ref: kvm.mapname
        value: kvmname
      put:
      - keys:
        - value: mykey
        values:
        - value: request.header.mykvm
      scope: environment
    ---
    apiVersion: apim.googleapis.com/v1
    kind: OASValidation
    metadata:
      name: oas-validation-1
    spec:
      openApiSpec: |
        openapi: 3.0.4
        info:
          title: Sample API
          description: Optional multi/single line description.
          version: 0.1.9
        servers:
          - url: http://apigee-apim-operator-test.apigee.net
            description: Optional server description, our main host in httproute
        paths:
          /get:
            get:
              summary: just for test
              description: Optional extended description in CommonMark or HTML.
              parameters:
                - name: X-Request-Type
                  in: header
                  description: Must be 'internal' or 'external'.
                  required: true
                  schema:
                    type: string
                    enum:
                      - internal
                      - external
              responses:
                '200': # status code
                  description: A JSON object
                  content:
                    application/json:
                      schema:
                        type: object
                        properties:
                          headers:
                            type: object
      source: request
    ---
    apiVersion: apim.googleapis.com/v1
    kind: ServiceCallout
    metadata:
      name: service-callout-1
      namespace: apim
    spec:
      request:
        clearPayload: true
        variable: myRequest
        ignoreUnresolvedVariables: true
        removeActions:
          - payload: true
          - queryParams:
            - name: rq-param1
            - name: rq-param2
        copyActions:
          - version: true
          - verb: true
        addActions:
          - headers:
            - name: X-header1
              value: value1
            - name: X-header2
              value: value2
          - queryParams:
            - name: q-param1
              value: value1
            - name: q-param2
              value: value2
        setActions:
          - verb: PUT
          - formParams:
            - name: f-param1
              value: value1
            - name: f-param2
              value: value2
      response: calloutResponse
      timeout: 30000
      httpTargetConnection:
        URL: https://httpbin.org/put
        properties:
          - name: success.codes
            value: 1xx,2xx,3xx,400
          - name: supports.http11
            value: "true"
  3. 다음 명령어를 사용하여 게이트웨이에 yaml 파일을 적용합니다.
    kubectl -n apim apply -f apigee-policies.yaml

TemplateRule을 SharedFlow 템플릿으로 만들기

이 단계에서는 게이트웨이에 추가한 정책을 적용할 TemplateRule을 만듭니다. 템플릿 규칙은 서비스 개발자가 게이트웨이 트래픽에 승인된 정책만 적용하도록 조직 관리자가 만든 SharedFlows의 규칙입니다. 템플릿 규칙을 사용하면 개발자가 사용할 수 있는 정책, 특정 사용 사례에 필요한 정책, 서비스 개발자가 사용할 수 없는 정책을 파악할 수 있습니다.

템플릿 규칙 만들기

AssignMessage 정책의 사용을 적용하는 템플릿 규칙을 만듭니다.

  1. apim 네임스페이스에 template-rule.yaml이라는 새 yaml 파일을 만듭니다.
  2. 다음 파일의 콘텐츠를 새로 만든 파일에 복사합니다.
    # template-rule.yaml
    apiVersion: apim.googleapis.com/v1
    kind: ApimTemplateRule
    metadata:
      name: template-rule
      namespace: apim
    spec:
      allowList: [SpikeArrest, Javascript, GenerateJWT, KVM, OASValidation, OAuthv2, ServiceCallout]
      requiredList: [AssignMessage]
      denyList: []

    이 예시에서 템플릿 규칙은 개발자에게 Google 토큰 삽입 정책을 설명하는 AssignMessage 정책이 필요하다고 알려줍니다. 또한 개발자에게 API 관리에서 SpikeArrest, JavaScript, GenerateJWT, KVM, OASValidation, OAuthv2, ServiceCallout 정책을 사용할 수 있다고 안내합니다. 거부 목록에 지정된 정책이 없습니다.

템플릿 규칙 적용

다음 명령어를 사용하여 템플릿 규칙을 적용합니다.

kubectl apply -f template-rule.yaml

템플릿 규칙을 사용할 Apigee 템플릿 만들기

이전 섹션에서 만든 템플릿 규칙을 포함하는 Apigee 템플릿을 만듭니다.

  1. apim 네임스페이스에 new-admin-template.yaml이라는 새 yaml 파일을 만듭니다.
  2. 다음 파일의 콘텐츠를 새로 만든 파일에 복사합니다.
    # new-admin-template.yaml
    apiVersion: apim.googleapis.com/v1
    kind: ApimTemplate
    metadata:
      name: new-admin-template
      namespace: apim
    spec:
      apimTemplateRule:
        group: apim.googleapis.com
        kind: ApimTemplateRule
        name: template-rule
        namespace: apim
      templates:
      - mode: REQUEST
        flows:
        - name: preflow
          policies:
          - group: apim.googleapis.com
            kind: OASValidation
            name: oas-validation-1
            namespace: apim
          - group: apim.googleapis.com
            kind: SpikeArrest
            name: spike-arrest
            namespace: apim
        - name: ConditionalGetFlow
          policies:
          - group: apim.googleapis.com
            kind: Javascript
            name: js-add-headers
            namespace: apim
          condition: request.verb="GET"
        - name: postflow
          policies:
          - group: apim.googleapis.com
            kind: AssignMessage
            name: google-token-policy
            namespace: apim
          - group: apim.googleapis.com
            kind: ServiceCallout
            name: service-callout-1
            namespace: apim
      - mode: RESPONSE
        flows:
        - name: postflow
          policies:
          - group: apim.googleapis.com
            kind: KVM
            name: kvm-1
            namespace: apim
  3. 다음 명령어를 사용하여 새 템플릿을 적용합니다.
    kubectl apply -f new-admin-template.yaml

Apigee 게이트웨이 정책 배포

이 단계에서는 ApigeeGatewayPolicy 사양이 포함된 새 파일을 게이트웨이에 적용합니다. 이 정책은 Apigee 템플릿을 게이트웨이에 배포하는 데 사용됩니다.

Apigee 게이트웨이 정책을 배포합니다.

  1. apim 네임스페이스에 apigee-gateway-policy-withSA.yaml이라는 새 yaml 파일을 만듭니다.
  2. 다음 파일의 콘텐츠를 새로 만든 파일에 복사합니다.
    # apigee-gateway-policy-withSA.yaml
    apiVersion: apim.googleapis.com/v1
    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. 새 게이트웨이 정책의 배포 상태를 확인합니다.
    kubectl -n apim get ApigeeGatewayPolicy

    배포하면 정책 STATUSCREATED가 표시됩니다.

새 게이트웨이 정책이 배포되면 2분 정도 기다린 후 게이트웨이에 요청을 전송하여 정책이 클러스터에 전파되도록 합니다.

정책 시행 확인

Apigee 게이트웨이 정책이 예상대로 작동하는지 확인하려면 다음 섹션에 설명된 대로 게이트웨이에 요청을 전송합니다.

AssignMessage 정책 시행

AssignMessage 정책을 사용하여 {company_name} 토큰이 요청에 삽입되었는지 확인하려면 다음 명령어를 사용하여 게이트웨이에 요청을 전송합니다.

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

각 항목의 의미는 다음과 같습니다.

  • GATEWAY_IP_ADDRESS는 게이트웨이의 IP 주소입니다. 다음 명령어를 사용하여 게이트웨이 IP 주소를 검색할 수 있습니다.
    kubectl get gateway GATEWAY_NAME
  • HOST_NAME은 호스트의 이름입니다.
  • API_KEY는 API 키 값입니다.

성공적인 응답에는 다음과 같이 생성된 Bearer 토큰과 함께 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 정책 시행

1분 이내에 게이트웨이에 요청을 10번 전송하여 SpikeArrest 정책의 적용을 테스트할 수 있습니다.

다음 스크립트를 실행하여 요청을 생성할 수 있습니다.

#!/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는 게이트웨이의 IP 주소입니다. 다음 명령어를 사용하여 게이트웨이 IP 주소를 검색할 수 있습니다. 여기서 GATEWAY_NAME은 게이트웨이 이름입니다.
    kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
  • HOST_NAME은 게이트웨이의 HTTPRoute에 정의된 호스트 이름입니다.
  • API_KEY테스트 설정에서 획득한 API 키 값입니다.

다음과 비슷한 응답이 표시됩니다.

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

JavaScript 정책 시행

JavaScript 정책이 예상대로 작동하는지 확인하려면 다음 명령어를 사용하여 게이트웨이에 요청을 전송합니다.

curl http://GATEWAY_IP_ADDRESS/get \
  -H "Host: HOST_NAME" \
  -H "x-api-key: API_KEY" \
  -H "X-Request-Type: external" -i

각 항목의 의미는 다음과 같습니다.

  • GATEWAY_IP_ADDRESS는 게이트웨이의 IP 주소입니다. 다음 명령어를 사용하여 게이트웨이 IP 주소를 검색할 수 있습니다. 여기서 GATEWAY_NAME은 게이트웨이 이름입니다.
    kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
  • HOST_NAME은 게이트웨이의 HTTPRoute에 정의된 호스트 이름입니다.
  • API_KEY테스트 설정에서 획득한 API 키 값입니다.

JavaScript 정책은 응답에 표시된 대로 First, Second, Sum의 3가지 요청 헤더를 설정합니다.

HTTP/1.1 200 OK
...
{
  "args": {},
  "headers": {
    ...
    "First": "1.0",
    ...
    "Second": "1.0",
    "Sum": "2",
    ...
  },
  ...
}

OASValidation 정책 시행

OASValidation 정책이 예상대로 작동하는지 확인하려면 다음 명령어를 사용하여 게이트웨이에 요청을 전송합니다.

curl "http://GATEWAY_IP_ADDRESS/get"  \
  -H "Host: HOST_NAME" \
  -H "x-api-key: API_KEY" \
  -H "X-Request-Type: badvalue"

각 항목의 의미는 다음과 같습니다.

  • GATEWAY_IP_ADDRESS는 게이트웨이의 IP 주소입니다. 다음 명령어를 사용하여 게이트웨이 IP 주소를 검색할 수 있습니다. 여기서 GATEWAY_NAME은 게이트웨이 이름입니다.
    kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
  • HOST_NAME은 게이트웨이의 HTTPRoute에 정의된 호스트 이름입니다.
  • API_KEY테스트 설정에서 획득한 API 키 값입니다.

명령어에 잘못된 X-Request-Type 헤더 값이 포함되어 있습니다. 다음과 유사한 응답이 표시되면서 요청이 실패합니다.

{"fault":{"faultstring":"OASValidation oas-validation-1 with resource \"oas:\/\/oas-validation-1.yaml\": failed with reason: \"[ERROR - Instance value (\"badvalue\") not found in enum (possible values: [\"internal\",\"external\"]): []]\"","detail":{"errorcode":"steps.oasvalidation.Failed"}}}

유효한 X-Request-Type 헤더 값을 사용하여 동일한 요청을 전송하면 성공합니다. 예를 들면 다음과 같습니다.

curl "http://GATEWAY_IP_ADDRESS/get"  \
  -H "Host: HOST_NAME" \
  -H "x-api-key: API_KEY" \
  -H "X-Request-Type: external" -i

각 항목의 의미는 다음과 같습니다.

  • GATEWAY_IP_ADDRESS는 게이트웨이의 IP 주소입니다. 다음 명령어를 사용하여 게이트웨이 IP 주소를 검색할 수 있습니다. 여기서 GATEWAY_NAME은 게이트웨이 이름입니다.
    kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
  • HOST_NAME은 게이트웨이의 HTTPRoute에 정의된 호스트 이름입니다.
  • API_KEY테스트 설정에서 획득한 API 키 값입니다.

ServiceCallout 정책 시행

디버그 세션을 열고 프록시에 유효한 요청을 몇 개 전송하여 ServiceCallout 정책의 시행을 확인할 수 있습니다.

디버그 세션을 열려면 다음 단계를 따르세요.

  1. Google Cloud 콘솔에서 API 프록시 페이지로 이동합니다.

    API 프록시로 이동

  2. Kubernetes용 Apigee APIM Operator를 위해 생성된 환경에 배포한 global-ext-lb1-apim-policy 프록시를 선택합니다.
  3. 디버그 탭을 클릭합니다.
  4. 디버그 세션 창에서 디버그 세션 시작을 클릭합니다.
  5. Debug session 창에서 다음과 같이 선택합니다.
    • 환경: 사용 가능한 환경 목록에서 APIM Operator용으로 만든 환경을 선택합니다.
    • 필터: 없음(모든 트랜잭션)을 선택합니다.
  6. 시작을 클릭합니다.

세션이 시작되면 유효한 요청을 프록시에 보낼 수 있습니다.

curl "GATEWAY_IP_ADDRESSget"  \
  -H "Host: HOST_NAME" \
  -H "x-api-key: API_KEY" \
  -H "X-Request-Type: external" -i

각 항목의 의미는 다음과 같습니다.

  • GATEWAY_IP_ADDRESS는 게이트웨이의 IP 주소입니다. 다음 명령어를 사용하여 게이트웨이 IP 주소를 검색할 수 있습니다. 여기서 GATEWAY_NAME은 게이트웨이 이름입니다.
    kubectl get gateway GATEWAY_NAME
  • HOST_NAME은 게이트웨이의 HTTPRoute에 정의된 호스트 이름입니다.
  • API_KEY테스트 설정에서 획득한 API 키 값입니다.

요청 및 응답 트랜잭션이 트랜잭션 창에 표시됩니다. 목록에서 성공한 트랜잭션을 선택하여 흐름을 표시합니다. ServiceCallout 정책이 성공적으로 실행되었음을 확인할 수 있습니다.

KVM 정책 시행

KVM 정책이 성공적으로 실행되면 mykey 키의 시작 값으로 KVM을 초기화합니다. 응답 트랜잭션이 있으면 KVM 정책이 mykey 값을 검색하여 응답 헤더 mykvm에 저장합니다. KVM 정책이 다시 실행되면 요청 헤더 mykvm에서 가져온 mykey의 새 값이 삽입됩니다.

각 트랜잭션의 헤더를 확인하여 정책이 한 트랜잭션에서 KVM에 값을 저장하고 다음 트랜잭션에서 동일한 값을 검색하는지 확인할 수 있습니다(다음 예 참고).

KVM 정책을 테스트합니다.

  1. 요청을 게이트웨이에 보냅니다.
    curl -i "http://GATEWAY_IP_ADDRESS/get" \
      -H "Host: HOST_NAME" \
      -H "x-api-key: API_KEY" \
      -H "X-Request-Type: external" \
      -H "KVM_NAME: next-value1" -i

    각 항목의 의미는 다음과 같습니다.

    • GATEWAY_IP_ADDRESS는 게이트웨이의 IP 주소입니다. 다음 명령어를 사용하여 게이트웨이 IP 주소를 검색할 수 있습니다. 여기서 GATEWAY_NAME은 게이트웨이 이름입니다.
      kubectl get gateway GATEWAY_NAME
    • HOST_NAME은 게이트웨이의 HTTPRoute에 정의된 호스트 이름입니다.
    • API_KEY테스트 설정에서 획득한 API 키 값입니다.
    • KVM_NAME은 KVM의 이름입니다.

  2. 응답 헤더를 확인하여 KVM 정책이 성공적으로 실행되었고 초기 값이 mykvm에 저장되었는지 확인합니다. 다음과 비슷한 응답이 표시됩니다.
    HTTP/1.1 200 OK
    access-control-allow-credentials: true
    access-control-allow-origin: *
    Content-Length: 517
    content-type: application/json
    date: ...
    server: gunicorn/19.9.0
    mykvm: initvalue
    via: 1.1 google
    {
      "args": {
      ...
      "url": "http://apigee-apim-operator-test.apigee.net/get"
      }
    }
  3. 게이트웨이에 다른 요청을 보냅니다.
    curl -i "http://GATEWAY_IP_ADDRESS/get" \
      -H "Host: HOST_NAME" \
      -H "x-api-key: API_KEY" \
      -H "mykvm: next"X-Request-Type: external" -H "mykvm: next-value2" -i

    응답은 다음과 비슷하게 표시됩니다.

    HTTP/1.1 200 OK
    access-control-allow-credentials: true
    access-control-allow-origin: *
    Content-Length: 517
    content-type: application/json
    date: ...
    server: gunicorn/19.9.0
    mykvm: next-value2
    via: 1.1 google
    {
      "args": {
      ...
      "url": "http://apigee-apim-operator-test.apigee.net/get?rq-param2=rq-val1&x-param1=xval1"
      }
    }

    mykvm 헤더 값이 요청 헤더 mykvm 값으로 업데이트되었으므로 KVM 정책이 성공적으로 실행되었음을 확인할 수 있습니다.

  4. 요청을 한 번 더 보냅니다.
    curl -i "http://GATEWAY_IP_ADDRESS/get" \
      -H "Host: HOST_NAME" \
      -H "x-api-key: API_KEY" \
      -H "X-Request-Type: external" -H "mykvm: next-value3" -i

    응답은 다음과 비슷하게 표시됩니다.

    HTTP/1.1 200 OK
    access-control-allow-credentials: true
    access-control-allow-origin: *
    Content-Length: 517
    content-type: application/json
    date: ...
    server: gunicorn/19.9.0
    mykvm: next-value2
    via: 1.1 google
    {
      "args": {
      ...
      "url": "http://apigee-apim-operator-test.apigee.net/get?rq-param2=rq-val1&x-param1=xval1"
      }
    }

    mykvm 헤더의 값이 다시 업데이트되어 응답에 표시된 값이 이전 트랜잭션에 저장된 값임을 보여줍니다.

문제 해결

GKE 게이트웨이에 정책을 추가할 때 문제가 발생하면 APIM Operator 문제 해결에서 일반적인 오류의 해결 방법을 참조하세요.

다음 단계