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/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 파일을 적용합니다.
    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/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 네임스페이스에 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 게이트웨이 정책 배포

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

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

  1. apim 네임스페이스에 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. 새 게이트웨이 정책의 배포 상태를 확인합니다.
    kubectl -n apim get ApigeeGatewayPolicy

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

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

정책 시행 확인

Apigee 게이트웨이 정책이 예상대로 작동하는지 확인하려면 게이트웨이에 요청을 전송하고 Google 토큰이 요청에 삽입되는지 확인합니다.

다음 명령어를 사용하여 게이트웨이에 요청을 전송합니다.

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

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

  • 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"
}

문제 해결

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

다음 단계