3장. APIcast 정책


APIcast 정책은 APIcast 작동 방식을 수정하는 기능 단위입니다. 정책을 활성화, 비활성화 및 구성하여 APIcast 수정 방법을 제어할 수 있습니다. 정책을 사용하여 기본 APIcast 배포에서 사용할 수 없는 기능을 추가합니다. 자체 정책을 생성하거나 Red Hat 3scale에서 제공하는 표준 정책을 사용할 수 있습니다.

다음 주제에서는 표준 APIcast 정책에 대한 정보를 제공하고, 정책 체인을 생성하며, 사용자 정의 APIcast 정책을 생성합니다.

3.1. 기본 3scale API Management APIcast 동작을 변경하는 표준 정책

3scale은 APIcast 요청 및 응답을 처리하는 방법을 수정하는 기능 단위인 기본 제공 표준 정책을 제공합니다. APIcast 수정 방법을 제어하도록 정책을 활성화, 비활성화 또는 구성할 수 있습니다.

자세한 내용은 3scale 관리 포털에서 정책 활성화를 참조하십시오. 3scale은 다음과 같은 표준 정책을 제공합니다.

3.1.1. 3scale API Management 관리 포털에서 정책 활성화

관리 포털에서 각 3scale API 제품에 대해 하나 이상의 정책을 활성화할 수 있습니다.

사전 요구 사항

  • 3scale API 제품입니다.

절차

  1. 3scale에 로그인합니다.
  2. 관리 포털 대시보드에서 정책을 활성화할 API 제품을 선택합니다.
  3. [your_product_name] 에서 통합 > 정책으로 이동합니다.
  4. POLICIES 섹션에서 정책 추가를 클릭합니다.
  5. 추가할 정책을 선택하고 필수 필드에 값을 입력합니다.
  6. Update Policy Chain 을 클릭하여 정책 체인을 저장합니다.

3.1.2. 3scale API Management 인증 캐싱

참고

항상 정책 체인의 APIcast 정책 앞에 auth 캐싱 정책을 배치합니다.

3scale 인증 캐싱 정책은 APIcast에 대한 인증 호출을 캐시합니다. 운영 모드를 선택하여 캐시 작업을 구성할 수 있습니다.

3scale 인증 캐싱은 다음과 같은 모드에서 사용할 수 있습니다.

1. Strict - 인증된 호출만 캐시합니다.

"제한" 모드는 권한이 부여된 호출만 캐시합니다. 정책이 "제한" 모드로 실행되고 호출이 실패하거나 거부되는 경우 정책은 캐시 항목을 무효화합니다. 백엔드에 연결할 수 없는 경우 캐시된 상태에 관계없이 캐시된 모든 호출이 거부됩니다.

2. 복원력 - 백엔드가 중단될 때 마지막 요청에 따라 인증합니다.

"Resilient" 모드는 인증된 호출과 거부된 호출을 모두 캐시합니다. 정책이 "resilient" 모드에서 실행 중인 경우 실패한 호출은 기존 캐시 항목을 무효화하지 않습니다. 백엔드에 연결할 수 없는 경우 캐시에 도달한 호출은 캐시된 상태에 따라 계속 인증되거나 거부됩니다.

3. allow - 백엔드가 다운되면 이전 및 거부되지 않는 한 모든 것을 허용합니다.

"Allow" 모드는 권한이 부여된 호출과 거부된 호출을 모두 캐시합니다. 정책이 "허용" 모드에서 실행 중인 경우 캐시된 호출은 캐시된 상태에 따라 계속 거부되거나 허용됩니다. 그러나 새 호출은 권한 부여로 캐시됩니다.

중요

"허용" 모드에서 작동하면 보안에 영향을 미칩니다. "allow" 모드를 사용할 때 다음과 같은 의미와 동작을 고려하십시오.

4. none - 캐싱을 비활성화합니다.

"없음" 모드에서는 캐싱을 비활성화합니다. 이 모드는 정책을 활성 상태로 유지하되 캐싱을 사용하지 않으려는 경우에 유용합니다.

구성 속성

속성description필수 여부

caching_type

caching_type 속성을 사용하면 캐시가 작동할 모드를 정의할 수 있습니다.

데이터 유형: 열거된 문자열 [resilient, strict, allow, none]

제공됨

정책 오브젝트 예

{
  "name": "caching",
  "version": "builtin",
  "configuration": {
    "caching_type": "allow"
  }
}

정책을 구성하는 방법에 대한 자세한 내용은 문서의 정책 체인 생성 섹션을 참조하십시오.

3.1.3. 3scale API Management Batcher

3scale Batcher 정책은 APIcast가 수신하는 각 API 요청에 대해 3scale 백엔드(Service Management API)에 대한 하나의 호출을 수행하는 표준 APIcast 권한 부여 메커니즘에 대한 대안을 제공합니다.

중요

이 정책을 사용하려면 정책 체인의 3scale APIcast 정책 앞에 3scale Batcher 를 배치해야 합니다.

3scale Batcher 정책은 권한 부여 상태 및 배치 사용 보고서를 캐시하므로 3scale 백엔드에 대한 요청 수를 크게 줄일 수 있습니다. 3scale Batcher 정책을 사용하면 대기 시간을 줄이고 처리량을 높여 APIcast 성능을 향상시킬 수 있습니다.

3scale Batcher 정책이 활성화되면 APIcast는 다음 권한 부여 흐름을 사용합니다.

  1. 각 요청에서 정책은 인증 정보가 캐시되었는지 확인합니다.

    • 자격 증명이 캐시되면 정책은 3scale 백엔드를 호출하는 대신 캐시된 권한 부여 상태를 사용합니다.
    • 인증 정보가 캐시되지 않으면 정책은 백엔드를 호출하고 구성 가능한 Time to Live(TTL)로 권한 부여 상태를 캐시합니다.
  2. 3scale 백엔드 요청에 해당하는 사용량을 즉시 보고하는 대신, 정책은 사용 카운터를 누적하여 일괄 처리로 백엔드에 보고합니다. 별도의 스레드는 누적된 사용 카운터를 구성 가능한 빈도와 함께 단일 호출로 3scale 백엔드에 보고합니다.

3scale Batcher 정책은 정확도가 감소하면서 처리량을 개선합니다. 사용량 제한과 현재 사용률은 3scale에 저장되며 APIcast는 3scale 백엔드를 호출할 때만 올바른 권한 부여 상태를 가져올 수 있습니다. 3scale Batcher 정책이 활성화되면 APIcast가 3scale에 호출을 보내지 않는 기간이 있습니다. 이 기간 동안 호출을 수행하는 애플리케이션은 정의된 제한을 통과할 수 있습니다.

속도 제한의 정확성보다 처리량이 더 중요한 경우 높은 로드 API에 대해 이 정책을 사용합니다. 3scale Batcher 정책은 보고 빈도 및 권한 TTL이 속도 제한 기간보다 훨씬 적은 경우 정확도 측면에서 더 나은 결과를 제공합니다. 예를 들어 하루에 제한이 있고 보고 빈도 및 권한 부여 TTL이 몇 분으로 구성된 경우입니다.

3scale Batcher 정책은 다음과 같은 구성 설정을 지원합니다.

  • auths_ttl: 권한 부여 캐시가 만료될 때 TTL을 초 단위로 설정합니다.

    • 현재 호출에 대한 인증이 캐시되면 APIcast는 캐시된 값을 사용합니다. auths_ttl 매개변수에 설정된 시간이 지나면 APIcast에서 캐시를 제거하고 3scale 백엔드를 호출하여 권한 부여 상태를 검색합니다.
    • auths_ttl 매개변수를 0 이 아닌 값으로 설정합니다. auths_ttl0 으로 설정하면 요청이 캐시될 때 권한 부여 카운터가 업데이트되어 속도 제한이 적용되지 않습니다.
  • batch_report_seconds: APIcast가 3scale 백엔드로 보내는 일괄 보고서 빈도를 설정합니다. 기본값은 10 초입니다.

3.1.4. 3scale API Management Referrer

3scale Referrer 정책에서는 Referrer Filtering 기능을 활성화합니다. 서비스 정책 체인에서 정책이 활성화되면 APIcast는 3scale Referrer 정책 값을 서비스 관리 API 에 upwards AuthRep 호출로 보냅니다. 3scale Referrer 정책의 값은 호출의 참조 매개변수로 전송됩니다.

참조 필터링이 작동하는 방법에 대한 자세한 내용은 인증 패턴 아래의 참조 필터링 섹션을 참조하십시오.

3.1.5. 익명 액세스

익명 액세스 정책은 인증 없이 서비스를 노출합니다. 예를 들어 인증 매개 변수를 전송하도록 조정할 수 없는 레거시 애플리케이션에 유용할 수 있습니다. 익명 액세스 정책은 API 키 및 앱 ID / 앱 키 인증 옵션이 있는 서비스를 지원합니다. 인증 정보가 제공되지 않은 API 요청에 대해 정책이 활성화되면 APIcast는 정책에 구성된 기본 인증 정보를 사용하여 호출을 승인합니다. API 호출을 승인하려면 구성된 인증 정보가 있는 애플리케이션이 존재하고 활성 상태여야 합니다.

애플리케이션 계획을 사용하여 기본 인증 정보에 사용되는 애플리케이션의 속도 제한을 구성할 수 있습니다.

참고

정책 체인에서 이러한 두 정책을 함께 사용할 때 APIcast 정책 앞에 익명 액세스 정책을 배치해야 합니다.

다음은 정책에 필요한 구성 속성입니다.

  • auth_type

    아래 대안 중 하나에서 값을 선택하고 속성이 API에 대해 구성된 인증 옵션에 해당하는지 확인합니다.

    • app_id_and_app_key

      App ID / 앱 키 인증 옵션의 경우

    • user_key

      API 키 인증 옵션의 경우

  • app_id ( app_id_and_app_key 인증 유형 전용)

    API 호출과 함께 제공되는 인증 정보가 없는 경우 권한 부여에 사용할 애플리케이션의 앱 ID입니다.

  • app_key ( app_id_and_app_key 인증 유형 전용)

    API 호출과 함께 제공되는 인증 정보가 없는 경우 권한 부여에 사용할 애플리케이션의 앱 키입니다.

  • user_key ( user_key auth_type만 해당)

    API 호출과 함께 제공되는 인증 정보가 없는 경우 권한 부여에 사용할 애플리케이션의 API 키입니다.

그림 3.1. 익명 액세스 정책

익명 액세스 정책

3.1.6. Camel 서비스

Camel 서비스 정책을 사용하여 3scale 트래픽이 정의된 Apache Camel 프록시를 통해 전송되는 HTTP 프록시를 정의할 수 있습니다. 이 경우 Camel은 역방향 HTTP 프록시로 작동하며 APIcast에서 트래픽을 Camel로 보낸 다음 Camel에서 트래픽을 API 백엔드로 보냅니다.

다음 예제에서는 트래픽 흐름을 보여줍니다.

Camel 서비스 정책 요청 흐름

3scale 백엔드로 전송된 모든 APIcast 트래픽은 Camel 프록시를 사용하지 않습니다. 이 정책은 Camel 프록시와 APIcast와 API 백엔드 간의 통신에만 적용됩니다.

프록시를 통해 모든 트래픽을 보내려면 HTTP_PROXY 환경 변수를 사용해야 합니다.

참고
  • Camel 서비스 정책은 도메인 이름이 여러 IP 주소로 확인되면 로드 밸런싱 업스트림의 APIcast 기능을 비활성화합니다. Camel 서비스는 업스트림 서비스의 DNS 확인을 관리합니다.
  • HTTP_PROXY,HTTPS_PROXY 또는 ALL_PROXY 매개변수가 정의된 경우 이 정책은 해당 값을 덮어씁니다.
  • 프록시 연결은 인증을 지원하지 않습니다. 인증을 위해 헤더 수정 정책을 사용합니다.

설정

다음 예제에서는 정책 체인 구성을 보여줍니다.

"policy_chain": [
    {
      "name": "apicast.policy.apicast"
    },
    {
      "name": "apicast.policy.camel",
      "configuration": {
          "all_proxy": "http://192.168.15.103:8080/",
          "http_proxy": "http://192.168.15.103:8080/",
          "https_proxy": "http://192.168.15.103:8443/"
      }
    }
]

all_proxy 값은 http_proxy 또는 https_proxy 가 정의되지 않은 경우 사용됩니다.

사용 사례 예

Camel 서비스 정책은 Apache Camel을 사용하여 3scale에서 보다 세분화된 정책과 변환을 적용하도록 설계되었습니다. 이 정책은 Apache Camel over HTTP 및 HTTPS와의 통합을 지원합니다. 자세한 내용은 5장. Fuse의 정책 확장을 사용하여 3scale API Management 메시지 콘텐츠 변환 에서 참조하십시오.

일반 HTTP 프록시 정책 사용에 대한 자세한 내용은 3.1.25절. “프록시 서비스” 을 참조하십시오.

프로젝트 예

GitHub의 Camel 프록시 정책에서 사용 가능한 camel-netty-proxy 예제를 참조하십시오. 이 예제 프로젝트는 응답 본문을 API 백엔드에서 대문자로 변환하는 HTTP 프록시를 보여줍니다.

3.1.7. 조건부 정책

조건 정책은 정책 체인을 포함하므로 다른 APIcast 정책과 다릅니다. 각 nginx 단계에서 평가되는 조건을 정의합니다(예: 액세스,다시 작성,로그 등). 조건이 true이면 조건 정책은 체인에 포함된 각 정책에 대해 해당 단계를 실행합니다.

중요

APIcast 조건부 정책은 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다. Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.

다음 예제에서는 조건 정책이 다음 조건을 정의한다고 가정합니다. 요청 방법은 POST입니다.

APIcast --> Caching --> Conditional --> Upstream

                             |
                             v

                          Headers

                             |
                             v

                       URL Rewriting

이 경우 요청이 POST 인 경우 각 단계의 실행 순서는 다음과 같습니다.

  1. APIcast
  2. 캐싱
  3. headers
  4. URL 재작성
  5. 업스트림

요청이 POST 가 아닌 경우 각 단계의 실행 순서는 다음과 같습니다.

  1. APIcast
  2. 캐싱
  3. 업스트림

조건

조건부 정책 체인에서 정책을 실행할지 여부를 결정하는 조건은 JSON 을 사용하여 표현하고 유동성 템플릿을 사용합니다.

이 예에서는 요청 경로가 /example_path 인지 여부를 확인합니다.

{
  "left": "{{ uri }}",
  "left_type": "liquid",
  "op": "==",
  "right": "/example_path",
  "right_type": "plain"
}

왼쪽 및 오른쪽 피연산자는 모두 유해한 문자열 또는 일반 문자열로 평가될 수 있습니다. 일반 문자열이 기본값입니다.

작업을 및 또는 또는 결합할 수 있습니다. 이 구성은 이전 예제와 동일하게 확인되고 백엔드 헤더의 값이 추가됩니다.

{
  "operations": [
    {
      "left": "{{ uri }}",
      "left_type": "liquid",
      "op": "==",
      "right": "/example_path",
      "right_type": "plain"
    },
    {
      "left": "{{ headers['Backend'] }}",
      "left_type": "liquid",
      "op": "==",
      "right": "test_upstream",
      "right_type": "plain"
    }
  ],
  "combine_op": "and"
}

자세한 내용은 정책 구성 스키마를 참조하십시오.

유동성에서 지원되는 변수

  • URI
  • host
  • remote_addr
  • headers['Some-Header']

업데이트된 변수 목록은 여기에서 확인할 수 있습니다. ngx_ECDHE.lua

이 예제에서는 요청의 백엔드 헤더가 staging 인 경우 업스트림 정책을 실행합니다.

{
   "name":"conditional",
   "version":"builtin",
   "configuration":{
      "condition":{
         "operations":[
            {
               "left":"{{ headers['Backend'] }}",
               "left_type":"liquid",
               "op":"==",
               "right":"staging"
            }
         ]
      },
      "policy_chain":[
         {
            "name":"upstream",
            "version": "builtin",
            "configuration":{
               "rules":[
                  {
                     "regex":"/",
                     "url":"http://my_staging_environment"
                  }
               ]
            }
         }
      ]
   }
}

3.1.8. 콘텐츠 캐싱

Content Caching 정책을 사용하면 사용자 정의된 조건에 따라 캐싱을 활성화 및 비활성화할 수 있습니다. 이러한 조건은 정책에서 업스트림 응답을 사용할 수 없는 클라이언트 요청에만 적용할 수 있습니다.

Content Caching 정책이 정책 체인에 있을 때 APIcast는 요청 업스트림을 보내기 전에 HEAD 요청을 GET 요청으로 변환합니다. 이 변환을 원하지 않는 경우 정책 체인에 Content Caching 정책을 추가하지 마십시오.

cache-control 헤더를 보낸 경우 APIcast에서 설정한 시간 초과보다 우선합니다.

다음 예제 구성은 Method가 GET인 경우 응답을 캐시합니다.

설정 예

{
  "name": "apicast.policy.content_caching",
  "version": "builtin",
  "configuration": {
    "rules": [
      {
        "cache": true,
        "header": "X-Cache-Status-POLICY",
        "condition": {
          "combine_op": "and",
          "operations": [
            {
              "left": "{{method}}",
              "left_type": "liquid",
              "op": "==",
              "right": "GET"
            }
          ]
        }
      }
    ]
  }
}

지원되는 구성

  • POST,PUT 또는 DELETE 방법 중 하나에 대해 콘텐츠 캐싱 정책을 disabled로 설정합니다.
  • 하나의 규칙이 일치하고 캐시를 활성화하면 실행이 중지되고 비활성화되지 않습니다. 여기서 우선순위별로 정렬하는 것이 중요합니다.

업스트림 응답 헤더

NGINX proxy_cache_valid 지시문 정보는 APICAST_CACHE_STATUS_CODESAPICAST_CACHE_MAX_TIME 를 사용하여 전역적으로 설정할 수 있습니다. 업스트림에 시간 초과와 관련하여 다른 동작이 필요한 경우 Cache-Control 헤더를 사용하십시오.

3.1.9. CORS 요청 처리

CORS(Cross Origin Resource Sharing) 요청 처리 정책을 사용하면 다음을 지정할 수 있으므로 CORS 동작을 제어할 수 있습니다.

  • 허용된 헤더
  • 허용된 방법
  • 허용된 원본 헤더
  • 허용되는 인증 정보
  • 최대 기간

CORS 요청 처리 정책은 지정되지 않은 모든 CORS 요청을 차단합니다.

참고

이러한 두 정책을 정책 체인에서 함께 사용할 때 APIcast 정책 앞에 CORS 요청 처리 정책을 배치해야합니다.

구성 속성

속성description필수 여부

allow_headers

allow_headers 속성은 허용할 CORS 헤더 APIcast를 지정할 수 있는 배열입니다.

데이터 유형: 문자열 배열, CORS 헤더여야 합니다.

제공되지 않음

allow_methods

allow_methods 속성은 사용자가 허용할 CORS 메서드 APIcast를 지정할 수 있는 배열입니다.

데이터 유형: 열거된 문자열 [GET, HEAD, POST, PUT, PUT, PATCH, OPTIONS, CONNECT]의 배열

제공되지 않음

allow_origin

allow_origin 속성을 사용하면 원본 도메인 APIcast 허용을 지정할 수 있습니다.

데이터 유형: 문자열

제공되지 않음

allow_credentials

allow_credentials 속성을 사용하면 APIcast에서 인증 정보가 있는 CORS 요청을 허용할지 여부를 지정할 수 있습니다.

데이터 유형: 부울

제공되지 않음

max_age

max_age 속성을 사용하면 사전 요청 결과를 캐시할 수 있는 시간을 설정할 수 있습니다.

데이터 유형: 정수

제공되지 않음

정책 오브젝트 예

{
  "name": "cors",
 "version": "builtin",
 "configuration": {
   "allow_headers": [
     "App-Id", "App-Key",
     "Content-Type", "Accept"
   ],
   "allow_credentials": true,
   "allow_methods": [
     "GET", "POST"
   ],
   "allow_origin": "https://example.com",
   "max_age" : 200
  }
}

정책을 구성하는 방법에 대한 자세한 내용은 3scale API Management 관리 포털의 정책 체인 수정을 참조하십시오.

3.1.10. 사용자 정의 메트릭

Custom Metrics 정책은 업스트림 API에서 보낸 응답 후 지표를 추가하는 가용성을 추가합니다. 이 정책의 주요 사용 사례는 응답 코드 상태, 헤더 또는 다른 NGINX 변수에 따라 지표를 추가하는 것입니다.

사용자 정의 메트릭의 제한 사항

  • 요청이 업스트림 API로 전송되기 전에 인증이 이루어지면 새 메트릭을 업스트림 API에 보고하기 위해 백엔드에 대한 두 번째 호출이 수행됩니다.
  • 이 정책은 일괄 처리 정책에서는 작동하지 않습니다.
  • 정책이 지표 값을 푸시하려면 관리 포털에서 지표를 생성해야 합니다.

요청 흐름 예

다음 차트는 인증이 캐시되지 않은 경우의 요청 흐름 예와 인증이 캐시될 때의 흐름을 보여줍니다.

구성 예

이 정책은 업스트림 API에서 400 상태를 반환하는 경우 헤더에 의해 지표 오류가 증가합니다.

{
  "name": "apicast.policy.custom_metrics",
  "configuration": {
    "rules": [
      {
        "metric": "error",
        "increment": "{{ resp.headers['increment'] }}",
        "condition": {
          "operations": [
            {
              "right": "{{status}}",
              "right_type": "liquid",
              "left": "400",
              "op": "=="
            }
          ],
          "combine_op": "and"
        }
      }
    ]
  }
}

이 정책은 업스트림 API에서 200 상태를 반환하는 경우 status_code 정보로 적중 지표를 늘립니다.

{
  "name": "apicast.policy.custom_metrics",
  "configuration": {
    "rules": [
      {
        "metric": "hits_{{status}}",
        "increment": "1",
        "condition": {
          "operations": [
            {
              "right": "{{status}}",
              "right_type": "liquid",
              "left": "200",
              "op": "=="
            }
          ],
          "combine_op": "and"
        }
      }
    ]
  }
}

3.1.11. echo

echo 정책은 선택적 HTTP 상태 코드와 함께 들어오는 요청을 클라이언트에 다시 인쇄합니다.

구성 속성

속성description필수 여부

status

echo 정책이 클라이언트로 반환되는 HTTP 상태 코드

데이터 유형: 정수

제공되지 않음

종료

echo 정책이 사용할 종료 모드를 지정합니다. 요청 종료 모드에서는 들어오는 요청이 처리되지 않도록 중지합니다. 설정된 종료 모드에서는 재작성 단계를 건너뜁니다.

데이터 유형: 열거된 문자열 [request, set]

제공됨

정책 오브젝트 예

{
  "name": "echo",
  "version": "builtin",
  "configuration": {
    "status": 404,
    "exit": "request"
  }
}

정책을 구성하는 방법에 대한 자세한 내용은 설명서의 3scale API Management 섹션에서 정책 체인 생성 을 참조하십시오.

3.1.12. 엣지 제한

Edge 제한 정책은 백엔드 API로 전송된 트래픽에 대해 유연한 속도 제한을 제공하는 것을 목표로 하며 기본 3scale 권한 부여와 함께 사용할 수 있습니다. 정책에서 지원하는 사용 사례의 예는 다음과 같습니다.

  • 최종 사용자 속도 제한: 요청의 Authorization 헤더에 전달된 JWT 토큰의 sub (주체) 클레임 값에 따른 속도 제한입니다. 이는 {{ jwt.sub }} 로 구성됩니다.
  • 초당 요청(RPS) 속도 제한입니다.
  • 서비스당 글로벌 속도 제한: 애플리케이션 대신 서비스당 제한을 적용합니다.
  • 동시 연결 제한: 허용되는 동시 연결 수를 설정합니다.

제한 유형

이 정책은 lua-resty-limit-traffic 라이브러리에서 제공하는 다음 유형의 제한 유형을 지원합니다.

  • leaky_bucket_limiters

    평균 요청 수와 최대 버스트 크기를 기반으로 하는 누출 버킷 알고리즘에 기반합니다.

  • fixed_window_limiters

    고정 시간 창에 따라 마지막 n초입니다.

  • connection_limiters

    동시 연결 수에 따라 다릅니다.

서비스 또는 전역으로 제한 범위를 지정할 수 있습니다.

제한 정의

제한에는 IP 주소, 서비스, 끝점, 식별자, 특정 헤더 및 기타 엔티티와 같은 제한을 정의하는 데 사용되는 엔티티를 인코딩하는 키가 있습니다. 이 키는 제한자의 매개변수에 지정됩니다.

key 는 다음 속성으로 정의된 오브젝트입니다.

  • name

    키 이름을 정의합니다. 범위에서 고유해야 합니다.

  • scope

    키의 범위를 정의합니다. 지원되는 범위는 다음과 같습니다.

    • 서비스 범위별로 하나의 서비스(서비스)에 영향을 미칩니다.
    • 모든 서비스(글로벌)에 영향을 미치는전역범위입니다.
  • name_type _ name 값이 평가되는 방법을 정의합니다.

    • 일반 텍스트(일반)
    • 예를 들면 Liquid (theLiquid)

또한 각 제한에는 유형에 따라 다른 일부 매개 변수가 있습니다.

  • leaky_bucket_limiters

    속도,버스트.

    • 속도

      지연 없이 초당 요청할 수 있는 요청 수를 정의합니다.

    • burst

      허용된 속도를 초과할 수 있는 초당 요청 수를 정의합니다. 인위적인 지연은 유량에 의해 지정된 허용된 속도 이상의 요청에 대해 도입됩니다. burst 에 정의된 것보다 초당 더 많은 요청으로 속도를 초과하면 요청이 거부됩니다.

  • fixed_window_limiters

    count,. count창에 정의된 초 수당 수행할 수 있는 요청 수를 정의합니다.

  • connection_limiters

    Conn,burst,delay.

    • Conn

      허용되는 최대 동시 연결 수를 정의합니다. 초당 버스트 연결로 해당 수를 초과할 수 있습니다.

    • delay

      제한을 초과하는 연결을 지연할 시간(초)을 정의합니다.

예제

  • service_A에 분당 10개의 요청을 허용합니다.

    {
      "key": { "name": "service_A" },
      "count": 10,
      "window": 60
    }
  • 1 초의 지연으로 10의 버스트와 100 개의 연결을 허용합니다.

    {
      "key": { "name": "service_A" },
      "conn": 100,
      "burst": 10,
      "delay": 1
    }

각 서비스에 대해 여러 제한을 정의할 수 있습니다. 여러 제한이 정의된 경우 하나 이상의 제한에 도달하면 요청을 거부하거나 지연할 수 있습니다.

유동성 템플릿

Edge 제한 정책을 사용하면 키에서 Liquid 변수를 지원함으로써 동적 키의 제한을 지정할 수 있습니다. 이를 위해 키의 name_type 매개 변수를 모방으로 설정해야 하며 name 매개변수는 Liquid 변수를 사용할 수 있습니다. 예를 들어 클라이언트 IP 주소에 대한 {{ remote_addr }} 또는 JWT 토큰의 하위 클레임의 경우 {{ jwt. sub }} 입니다.

예제

{
  "key": { "name": "{{ jwt.sub }}", "name_type": "liquid" },
  "count": 10,
  "window": 60
}

Liquid 지원에 대한 자세한 내용은 4.1절. “정책에서 변수 및 필터 사용” 을 참조하십시오.

조건 적용

각 제한에는 제한이 적용되는 시기를 정의하는 조건이 있어야 합니다. 조건은 제한자의 condition 속성에 지정됩니다.

조건은 다음 속성으로 정의됩니다.

  • combine_op

    작업 목록에 적용된 부울 연산자입니다. 또는 의 값이 지원됩니다.

  • 작업

    평가해야 하는 조건 목록입니다. 각 작업은 다음 속성이 있는 개체로 표시됩니다.

    • left

      작업의 왼쪽 부분입니다.

    • left_type

      왼쪽 속성을 평가하는 방법(일반 또는 유동)입니다.

    • right

      작업의 올바른 부분입니다.

    • right_type

      올바른 속성(일반 또는 유동)을 평가하는 방법

    • op

      왼쪽과 오른쪽 부분 사이에 적용되는 Operator입니다. 다음 두 값이 지원됩니다. == (equals) 및 != (동일하지 않음).

예제

"condition": {
  "combine_op": "and",
  "operations": [
    {
      "op": "==",
      "right": "GET",
      "left_type": "liquid",
      "left": "{{ http_method }}",
      "right_type": "plain"
    }
  ]
}

속도 제한 카운터의 스토리지 구성

기본적으로 Edge 제한 정책은 속도 제한 카운터에 OpenResty 공유 사전을 사용합니다. 그러나 공유 사전 대신 외부 Redis 서버를 사용할 수 있습니다. 이 기능은 여러 APIcast 인스턴스가 배포된 경우 유용할 수 있습니다. redis_url 매개변수를 사용하여 Redis 서버를 구성할 수 있습니다.

오류 처리

제한자는 다음 매개변수를 지원하여 오류 처리 방법을 구성합니다.

  • limits_exceeded_error

    구성된 제한이 초과될 때 클라이언트에 반환되는 오류 상태 코드 및 메시지를 지정합니다. 다음 매개변수를 구성해야 합니다.

    • status_code

      제한이 초과된 요청의 상태 코드입니다. 기본값: 429.

    • error_handling

      다음 옵션을 사용하여 오류를 처리하는 방법을 지정합니다.

      • 종료

        처리 요청을 중지하고 오류 메시지를 반환합니다.

      • log

        처리 요청을 완료하고 출력 로그를 반환합니다.

  • configuration_error

    잘못된 구성의 경우 클라이언트에 반환되는 오류 상태 코드와 메시지를 지정합니다. 다음 매개변수를 구성해야 합니다.

    • status_code

      구성 문제가 있을 때 상태 코드입니다. 기본값: 500.

    • error_handling

      다음 옵션을 사용하여 오류를 처리하는 방법을 지정합니다.

      • 종료

        처리 요청을 중지하고 오류 메시지를 반환합니다.

      • log

        처리 요청을 완료하고 출력 로그를 반환합니다.

3.1.13. 헤더 수정

헤더 수정 정책을 사용하면 기존 헤더를 수정하거나 들어오는 요청 또는 응답에 추가하거나 제거할 추가 헤더를 정의할 수 있습니다. 응답 헤더와 요청 헤더를 둘 다 수정할 수 있습니다.

헤더 수정 정책은 다음과 같은 구성 매개변수를 지원합니다.

  • 요청

    요청 헤더에 적용할 작업 목록

  • 응답

    응답 헤더에 적용할 작업 목록

각 작업은 다음 매개 변수로 구성됩니다.

  • 적용할 작업을 지정합니다. add 작업은 기존 헤더에 값을 추가합니다. set 작업에서는 헤더와 값을 생성하고 기존 헤더 값이 이미 있는 경우 덮어씁니다. 내보내기 작업은 헤더와 값을 생성하지만 이미 존재하는 경우 기존 헤더의 값을 덮어쓰지 않습니다. 대신 push 는 기존 헤더에 값을 추가합니다. 삭제 작업에서는 헤더를 제거합니다.
  • header: 생성 또는 수정할 헤더를 지정하고 헤더 이름으로 사용할 모든 문자열(예: Custom-Header )일 수 있습니다.
  • value_type: 헤더 값이 평가되는 방법을 정의하고 일반 텍스트 또는 리쿼리드 템플릿으로 평가를 위한 유동성 일 수 있습니다. 자세한 내용은 4.1절. “정책에서 변수 및 필터 사용”의 내용을 참조하십시오.
  • value: 헤더에 사용할 값을 지정합니다. 값 유형 "liquid"의 경우 값은 {{ variable_from_context }} 형식이어야 합니다. 삭제할 때 필요하지 않습니다.

정책 오브젝트 예

{
  "name": "headers",
  "version": "builtin",
  "configuration": {
    "response": [
      {
        "op": "add",
        "header": "Custom-Header",
        "value_type": "plain",
        "value": "any-value"
      }
    ],
    "request": [
      {
        "op": "set",
        "header": "Authorization",
        "value_type": "plain",
        "value": "Basic dXNlcm5hbWU6cGFzc3dvcmQ="
      },
      {
        "op": "set",
        "header": "Service-ID",
        "value_type": "liquid",
        "value": "{{service.id}}"
      }
    ]
  }
}

정책을 구성하는 방법에 대한 자세한 내용은 설명서의 3scale API Management 섹션에서 정책 체인 생성 을 참조하십시오.

3.1.14. HTTP 상태 코드 덮어쓰기

API 공급자는 HTTP 상태 코드 오버 쓰기 정책을 API 제품에 추가할 수 있습니다. 이 정책을 통해 지정한 응답 코드로 업스트림 응답 코드를 변경할 수 있습니다. 3scale은 HTTP 상태 코드 덮어쓰기 정책을 업스트림 서비스에서 보낸 응답 코드에 적용합니다. 즉, 3scale이 노출하는 API에서 상황에 맞지 않는 코드를 반환하는 경우 HTTP 상태 코드 덮어쓰기 정책을 구성하여 애플리케이션에 의미 있는 응답 코드로 해당 코드를 변경할 수 있습니다.

정책 체인에서 변경할 응답 코드를 생성하는 모든 정책은 HTTP 상태 코드 덮어쓰기 정책보다 먼저여야 합니다. 변경하려는 상태 코드를 생성하는 정책이 없는 경우 HTTP 상태 코드 덮어쓰기 정책의 정책 체인 위치는 중요하지 않습니다.

관리 포털에서 제품의 정책 체인에 HTTP 상태 코드 오버 쓰기 정책을 추가합니다. 정책 체인에서 정책을 클릭하여 변경할 업스트림 응답 코드와 대신 반환하려는 응답 코드를 지정합니다. 덮어쓸 각 추가 업스트림 응답 코드의 더하기 기호를 클릭합니다. 예를 들어 HTTP 상태 코드 덮어쓰기 정책을 사용하여 업스트림 201, "Created", 응답 코드를 200, "OK", 응답 코드로 변경할 수 있습니다.

변경하려는 응답 코드의 또 다른 예는 콘텐츠 제한을 초과할 때의 응답입니다. 업스트림에서는 응답 코드가 414 이고 request-URI가 너무 긴 경우 413 페이로드가 너무 클 수 있습니다.

관리 포털에서 HTTP 상태 코드 덮어쓰기 정책을 추가하는 대신 3scale API를 정책 체인 구성 파일과 함께 사용하는 것입니다.

예제

정책 체인 구성 파일의 다음 JSON 구성은 두 개의 업스트림 응답 코드를 덮어씁니다.

{
  "name": "statuscode_overwrite",
  "version": "builtin",
  "configuration": {
    "http_statuses": [
      {
        "upstream": 201,
        "apicast": 200
      },
      {
        "upstream": 413,
        "apicast": 414
      }
    ]
  }
}

3.1.15. HTTP2 Endpoint

HTTP2 Endpoint 정책을 사용하면 요청과 APIcast를 전송하는 소비자 애플리케이션 간에 HTTP/2 프로토콜 및 GRPC(Remote Procedure call) 연결을 사용할 수 있습니다. HTTP2 끝점 정책이 제품의 정책 체인에 있는 경우 APIcast에 요청하는 소비자 애플리케이션에서 업스트림 서비스로의 전체 통신 흐름은 HTTP/2 프로토콜 및 gRPC를 사용할 수 있습니다.

HTTP2 Endpoint 정책이 정책 체인에 있는 경우:

  • 인증 요청은 JSON 웹 토큰 또는 App_IDApp_Key 쌍을 사용해야 합니다. API 키 인증은 지원되지 않습니다.
  • gRPC 끝점은 TLS(Transport Layer Security)를 종료합니다.
  • HTTP2 끝점 정책은 3scale APIcast 정책보다 먼저여야 합니다.
  • 업스트림 서비스의 백엔드는 HTTP/1.1 일반 텍스트 또는 TLS(Transport Layer Security)를 구현할 수 있습니다.
  • 정책 체인에는 TLS 종료 정책도 포함되어야 합니다.

    APIcast 구성 정책 체인의 예:

    "policy_chain": [
      { "name": "apicast.policy.tls" },
      { "name": "apicast.policy.grpc" },
      { "name": "apicast.policy.apicast" }
    ]

3.1.16. IP 확인

IP Check 정책은 IP 목록을 기반으로 요청을 거부하거나 허용하는 데 사용됩니다.

구성 속성

속성description데이터 유형필수 여부

check_type

check_type 속성에는 허용 목록 또는 블랙리스트 의 두 가지 가능한 값이 있습니다. 블랙리스트 는 목록에 있는 IP의 모든 요청을 거부합니다. 화이트리스트는 목록에 없는 IP의 모든 요청을 거부합니다.

string은 허용 목록 또는 블랙리스트여야 합니다.

제공됨

ips

ips 속성을 사용하면 허용 목록 또는 블랙리스트에 IP 주소 목록을 지정할 수 있습니다. 단일 IP 및 CIDR 범위를 모두 사용할 수 있습니다.

문자열 배열은 유효한 IP 주소여야 합니다.

제공됨

error_msg

error_msg 속성을 사용하면 요청이 거부될 때 반환된 오류 메시지를 구성할 수 있습니다.

string

제공되지 않음

client_ip_sources

client_ip_sources 속성을 사용하면 클라이언트 IP 검색 방법을 구성할 수 있습니다. 기본적으로 마지막 호출자 IP가 사용됩니다. 다른 옵션은 X-Forwarded-ForX-Real-IP 입니다.

문자열 배열, 유효한 옵션은 X-Forwarded-For,X-Real-IP,last_caller 중 하나 이상입니다.

제공되지 않음

정책 오브젝트 예

{
  "name": "ip_check",
  "configuration": {
    "ips": [ "3.4.5.6", "1.2.3.0/4" ],
    "check_type": "blacklist",
    "client_ip_sources": ["X-Forwarded-For", "X-Real-IP", "last_caller"],
    "error_msg": "A custom error message"
  }
}

정책을 구성하는 방법에 대한 자세한 내용은 설명서의 3scale API Management 섹션에서 정책 체인 생성 을 참조하십시오.

3.1.17. JWT 클레임 확인

JSON 웹 토큰(JWT) 클레임을 기반으로 JWT 클레임을 통해 리소스 대상 및 메서드 차단에 대한 새 규칙을 정의할 수 있습니다.

JWT 클레임 검사 정책 정보

JWT 클레임 값을 기반으로 라우팅하려면 JWT를 검증하고 정책에서 공유하는 컨텍스트에 클레임을 저장하는 체인에 정책이 필요합니다.

JWT Claim Check 정책이 리소스 및 메서드를 차단하는 경우 정책은 JWT 작업도 검증합니다. 또는 메서드 리소스가 일치하지 않는 경우 요청은 백엔드 API로 계속됩니다.

예: GET 요청의 경우 요청이 거부되지 않는 경우 JWT에 admin으로 역할 클레임이 있어야 합니다. 반면, GET이 아닌 요청은 JWT 작업의 유효성을 검사하지 않으므로 JWT 제약 조건 없이 POST 리소스가 허용됩니다.

{
  "name": "apicast.policy.jwt_claim_check",
  "configuration": {
      "error_message": "Invalid JWT check",
      "rules": [
          {
              "operations": [
                  {"op": "==", "jwt_claim": "role", "jwt_claim_type": "plain", "value": "admin"}
              ],
              "combine_op":"and",
              "methods": ["GET"],
              "resource": "/resource",
              "resource_type": "plain"
          }
      ]
  }
}

정책 체인에서 JWT 클레임 검사 정책 구성

정책 체인에서 JWT 클레임 검사 정책을 구성하려면 다음을 수행합니다.

  • 3scale 설치에 액세스해야 합니다.
  • 모든 배포가 완료될 때까지 기다려야 합니다.

정책 구성

  1. API에 JWT 클레임 확인 정책을 추가하려면 3scale API Management 관리 포털에서 정책 활성화에 설명된 단계를 수행하고 JWT 클레임 검사를 선택합니다.
  2. JWT 클레임 확인 링크를 클릭합니다.
  3. 정책을 활성화하려면 Enabled 확인란을 선택합니다.
  4. 규칙을 추가하려면 더하기 + 아이콘을 클릭합니다.
  5. resource_type 을 지정합니다.
  6. operator를 선택합니다.
  7. 규칙으로 제어하는 리소스를 나타냅니다.
  8. 허용된 방법을 추가하려면 더하기 + 아이콘을 클릭합니다.
  9. 트래픽이 차단될 때 사용자에게 표시할 오류 메시지를 입력합니다.
  10. JWT 클레임 확인으로 API 설정을 완료하면 업데이트 정책.

    해당 섹션에서 더하기 + 아이콘을 클릭하여 더 많은 리소스 유형과 허용된 메서드를 추가할 수 있습니다.

  11. Update Policy Chain 을 클릭하여 변경 사항을 저장합니다.

3.1.18. 유동적인 컨텍스트 디버그

참고

Liquid Context Debug 정책은 개발 환경의 디버깅 목적으로만 사용되며 프로덕션에는 사용할 수 없습니다.

이 정책은 컨텍스트에서 사용 가능한 오브젝트 및 값을 포함하는 JSON 을 사용하여 API 요청에 응답하며 Liquid 템플릿을 평가하는 데 사용할 수 있습니다. 3scale APIcast 또는 업스트림 정책과 결합될 때 Liquid Context Debug를 정책 체인에 배치하여 올바르게 작동합니다. 원형 참조를 방지하기 위해 정책에는 중복된 오브젝트만 포함되어 스텁 값으로 교체합니다.

정책이 활성화된 경우 APIcast에서 반환된 값의 예입니다.

    {
      "jwt": {
        "azp": "972f7b4f",
        "iat": 1537538097,
        ...
        "exp": 1537574096,
        "typ": "Bearer"
      },
      "credentials": {
        "app_id": "972f7b4f"
      },
      "usage": {
        "deltas": {
          "hits": 1
        },
        "metrics": [
          "hits"
        ]
      },
      "service": {
        "id": "2",
        ...
      }
      ...
    }

3.1.19. 로깅

로깅 정책에는 다음 두 가지 용도가 있습니다.

  • 액세스 로그 출력을 활성화하고 비활성화하려면 다음을 수행합니다.
  • 각 서비스에 대한 사용자 정의 액세스 로그 형식을 생성하고 사용자 정의 액세스 로그를 작성할 조건을 설정하려면 다음을 수행합니다.

로깅 정책과 액세스 로그 위치에 대한 전역 설정을 결합할 수 있습니다. APICAST_ACCESS_LOG_FILE 환경 변수를 설정하여 APIcast 액세스 로그의 위치를 구성합니다. 기본적으로 이 변수는 표준 출력 장치인 /dev/stdout 으로 설정됩니다. 글로벌 APIcast 매개변수에 대한 자세한 내용은 APIcast 환경 변수를 참조하십시오.

또한 로깅 정책에는 다음과 같은 기능이 있습니다.

  • 이 정책은 enable_access_logs 구성 매개변수만 지원합니다.
  • 액세스 로그를 활성화하려면 enable_access_logs 매개변수를 선택하거나 로깅 정책을 비활성화합니다.
  • API에 대한 액세스 로깅을 비활성화하려면 다음을 수행합니다.

    1. 정책을 활성화합니다.
    2. enable_access_logs 매개변수를 지웁니다.
    3. 제출 버튼을 클릭합니다.
  • 기본적으로 이 정책은 정책 체인에서 활성화되어 있지 않습니다.

3.1.19.1. 모든 API에 대한 로깅 정책 구성

APICAST_ENVIRONMENT 를 사용하여 정책이 모든 API 제품에 전역적으로 적용되는 구성을 로드할 수 있습니다. 다음은 이러한 작업을 수행하는 방법의 예입니다. APICAST_ENVIRONMENT는 배포, 템플릿 또는 Operator의 유형에 따라 파일의 경로를 가리키는 데 사용됩니다.

로깅 정책을 전역적으로 구성하려면 배포 유형에 따라 다음을 고려하십시오.

  • 템플릿 기반 배포의 경우: ConfigMap 및 VolumeMount를 통해 컨테이너에 파일을 마운트해야 합니다.
  • 3scale Operator 기반 배포의 경우:

    • 3scale 2.11 이전 버전에서는 ConfigMap 및 VolumeMount를 통해 컨테이너에 파일을 마운트해야 합니다.
    • 3scale 2.11부터는 APIManager CR(사용자 정의 리소스)에서 참조하는 시크릿을 사용해야 합니다.
  • APIcast Operator 배포의 경우:

    • 3scale 2.11 이전 버전에서는 구성할 수 없습니다.
    • 3scale 2.11부터 APIManager CR에서 참조하는 보안을 사용해야 합니다.
  • Docker에 배포된 APIcast 자체 관리의 경우 컨테이너에 파일을 마운트해야 합니다.

로깅 옵션을 사용하면 API에서 올바르게 포맷되지 않은 로그 관련 문제를 방지할 수 있습니다.

다음은 모든 서비스에서 로드하는 정책의 예입니다.

custom_env.lua file

local cjson = require('cjson')
local PolicyChain = require('apicast.policy_chain')
local policy_chain = context.policy_chain

local logging_policy_config = cjson.decode([[
{
  "enable_access_logs": false,
  "custom_logging": "\"{{request}}\" to service {{service.id}} and {{service.name}}"
}
]])

policy_chain:insert( PolicyChain.load_policy('logging', 'builtin', logging_policy_config), 1)

return {
  policy_chain = policy_chain,
  port = { metrics = 9421 },
}

3.1.19.1.1. ConfigMap 및 VolumeMount를 통해 컨테이너에 파일을 마운트하여 모든 API에 대한 로깅 정책 구성
  1. custom_env.lua 파일을 사용하여 ConfigMap을 생성합니다.

    $ oc create configmap logging --from-file=/path/to/custom_env.lua
  2. ConfigMap의 볼륨을 마운트합니다(예: apicast-staging ):

    $ oc set volume dc/apicast-staging --add --name=logging --mount-path=/opt/app-root/src/config/custom_env.lua --sub-path=custom_env.lua -t configmap --configmap-name=logging
  3. 환경 변수를 설정합니다.

    $ oc set env dc/apicast-staging APICAST_ENVIRONMENT=/opt/app-root/src/config/custom_env.lua
3.1.19.1.2. APIManager CR에서 참조되는 보안을 사용하여 모든 API의 로깅 정책 구성

Operator 기반 배포의 3scale 2.11에서 로깅 정책을 시크릿으로 구성하고 APIManager CR의 시크릿을 참조합니다.

참고

다음 절차는 3scale Operator에만 유효합니다. 그러나 이러한 단계를 사용하여 유사한 방식으로 APIcast Operator를 구성할 수 있습니다.

사전 요구 사항

  • Lua로 코딩된 하나 이상의 사용자 지정 환경입니다.

절차

  1. 사용자 정의 환경 콘텐츠를 사용하여 보안을 생성합니다.

    $ oc create secret generic custom-env --from-file=./custom_env.lua
  2. APIcast 사용자 정의 환경을 사용하여 APIManager CR을 구성하고 배포합니다.

    apimanager.yaml 콘텐츠:

    apiVersion: apps.3scale.net/v1alpha1
    kind: APIManager
    metadata:
      name: apimanager-apicast-custom-environment
    spec:
      apicast:
        productionSpec:
          customEnvironments:
            - secretRef:
                name: custom-env
        stagingSpec:
          customEnvironments:
            - secretRef:
                name: custom-env

  3. APIManager CR을 배포합니다.

    $ oc apply -f apimanager.yaml

secret이 없는 경우 Operator는 CR을 실패로 표시합니다. 보안을 변경하려면 APIcast를 반영하기 위해 pod/container를 재배포해야 합니다.

사용자 정의 환경 업데이트

사용자 지정 환경 콘텐츠를 수정해야 하는 경우 다음 두 가지 옵션이 있습니다.

  • 권장: 다른 이름으로 다른 보안을 생성하고 APIManager CR 필드를 업데이트합니다.

    customEnvironments[].secretRef.name

    Operator는 롤링 업데이트에서 새 사용자 지정 환경 콘텐츠를 로드하도록 트리거합니다.

  • 기존 보안 콘텐츠를 업데이트하고 APIcast를 재배포하여 spec.apicast.productionSpec.replicas 또는 spec.apicast.stagingSpec.replicas 를 0으로 설정한 다음 이전 값으로 돌아갑니다.
3.1.19.1.3. Docker에 배포된 APIcast 자체 관리를 위한 모든 API에 대한 로깅 정책 구성

다음 docker 명령을 사용하여 custom_env.lua를 마운트하여 이 특정 환경에서 APIcast를 실행합니다.

docker run --name apicast --rm -p 8080:8080 \
    -v $(pwd):/config \
    -e APICAST_ENVIRONMENT=/config/custom_env.lua \
    -e THREESCALE_PORTAL_ENDPOINT=https://ACCESS_TOKEN@ADMIN_PORTAL_DOMAIN \
    quay.io/3scale/apicast:master

다음은 고려해야 할 docker 명령의 주요 개념입니다.

  • 현재 Lua 파일을 컨테이너에 공유 -v $(pwd):/config.
  • APICAST_ENVIRONMENT 변수를 /config 디렉터리에 저장된 Lua 파일로 설정합니다.

3.1.19.2. 로깅 정책의 예

다음은 로깅 정책의 예입니다. 다음 경고는 다음과 같습니다.

  • custom_logging 또는 enable_json_logs 속성이 활성화된 경우 기본 액세스 로그가 비활성화됩니다.
  • enable_json_logs 가 활성화된 경우 custom_logging 필드가 생략됩니다.

액세스 로그 비활성화

{
  "name": "apicast.policy.logging",
  "configuration": {
    "enable_access_logs": false
  }
}

사용자 정의 액세스 로그 활성화

{
  "name": "apicast.policy.logging",
  "configuration": {
    "enable_access_logs": false,
    "custom_logging": "[{{time_local}}] {{host}}:{{server_port}} {{remote_addr}}:{{remote_port}} \"{{request}}\" {{status}} {{body_bytes_sent}} ({{request_time}}) {{post_action_impact}}",
  }
}

서비스 식별자를 사용하여 사용자 정의 액세스 로그 활성화

{
  "name": "apicast.policy.logging",
  "configuration": {
    "enable_access_logs": false,
    "custom_logging": "\"{{request}}\" to service {{service.id}} and {{service.serializable.name}}",
  }
}

JSON 형식으로 액세스 로그 구성

{
  "name": "apicast.policy.logging",
  "configuration": {
    "enable_access_logs": false,
    "enable_json_logs": true,
    "json_object_config": [
      {
        "key": "host",
        "value": "{{host}}",
        "value_type": "liquid"
      },
      {
        "key": "time",
        "value": "{{time_local}}",
        "value_type": "liquid"
      },
      {
        "key": "custom",
        "value": "custom_method",
        "value_type": "plain"
      }
    ]
  }
}

성공적인 요청에 대해서만 사용자 정의 액세스 로그 구성

{
  "name": "apicast.policy.logging",
  "configuration": {
    "enable_access_logs": false,
    "custom_logging": "\"{{request}}\" to service {{service.id}} and {{service.name}}",
    "condition": {
      "operations": [
        {"op": "==", "match": "{{status}}", "match_type": "liquid", "value": "200"}
      ],
      "combine_op": "and"
    }
  }
}

응답 상태가 200 또는 500과 일치하는 액세스 로그 사용자 정의

{
  "name": "apicast.policy.logging",
  "configuration": {
    "enable_access_logs": false,
    "custom_logging": "\"{{request}}\" to service {{service.id}} and {{service.name}}",
    "condition": {
      "operations": [
        {"op": "==", "match": "{{status}}", "match_type": "liquid", "value": "200"},
        {"op": "==", "match": "{{status}}", "match_type": "liquid", "value": "500"}
      ],
      "combine_op": "or"
    }
  }
}

3.1.19.3. 사용자 정의 로깅에 대한 추가 정보

사용자 지정 로깅의 경우 내보낸 변수와 함께 Liquid 템플릿을 사용할 수 있습니다. 이러한 변수는 다음과 같습니다.

  • NGINX 기본 지시문 변수: log_format. 예: {{remote_addr}}.
  • 응답 및 요청 헤더:

    • {{req.headers.FOO}}: 요청에 FOO 헤더를 가져옵니다.
    • {{Res.headers.FOO}}: 응답으로 FOO 헤더를 검색합니다.
  • 서비스 정보(예: {{service.id}} ) 및 이러한 매개변수에서 제공하는 모든 서비스 속성:

    • THREESCALE_CONFIG_FILE
    • THREESCALE_PORTAL_ENDPOINT

3.1.20. 유지 관리 모드

에 대한 유지 관리 모드 정책을 사용하면 지정된 상태 코드 및 메시지를 사용하여 들어오는 요청을 거부할 수 있습니다. 유지 관리 기간 또는 API를 일시적으로 차단하는 데 유용합니다.

구성 속성

다음은 가능한 속성 및 기본값 목록입니다.

속성valuedefaultdescription

status

정수, 선택 사항

503

응답 코드

message

문자열, 선택 사항

503 서비스 Unavailable - 유지 관리

응답 메시지

유지 관리 모드 정책 예

{
  "policy_chain": [
    {"name": "maintenance-mode", "version": "1.0.0",
    "configuration": {"message": "Be back soon..", "status": 503} },
  ]
}

특정 업스트림에 대한 유지 관리 모드 적용

{
    "name": "maintenance_mode",
    "version": "builtin",
    "configuration": {
        "message_content_type": "text/plain; charset=utf-8",
        "message": "Echo API /test is currently Unavailable",
        "condition": {
            "combine_op": "and",
            "operations": [
                {
                    "left_type": "liquid",
                    "right_type": "plain",
                    "op": "==",
                    "left": "{{ original_request.path }}",
                    "right": "/test"
                }
            ]
        },
        "status": 503
    }
}

정책을 구성하는 방법에 대한 자세한 내용은 설명서의 3scale API Management 섹션에서 정책 체인 생성 을 참조하십시오.

3.1.21. NGINX 필터

NGINX는 일부 요청 헤더를 자동으로 확인하고 해당 헤더를 검증할 수 없을 때 요청을 거부합니다. 예를 들어, NGINX는 NGINX에서 검증할 수 없는 If-Match 헤더가 있는 요청을 거부합니다. NGINX에서 특정 헤더의 유효성 검사를 건너뛰려면 NGINX 필터 정책을 추가합니다.

NGINX 필터 정책을 추가하면 NGINX에서 검증을 건너뛰려는 하나 이상의 요청 헤더를 지정합니다. 지정하는 각 헤더에 대해 요청에 헤더를 유지할지 여부를 나타냅니다. 예를 들어 다음 JSON 코드는 NGINX 필터 정책을 추가하여 If-Match 헤더의 유효성 검사를 건너뛰지만 업스트림 서버로 전달되는 요청에 If-Match 헤더를 유지합니다.

{ "name": "apicast.policy.nginx_filters",
  "configuration": {
    "headers": [
      {"name": "If-Match", "append": true}
    ]
  }
}

다음 예제에서는 If-Match 헤더의 유효성 검사를 생략하지만 이 코드는 업스트림 서버에 요청을 보내기 전에 NGINX에 If-Match 헤더를 삭제하도록 지시합니다.

{ "name": "apicast.policy.nginx_filters",
  "configuration": {
    "headers": [
      {"name": "If-Match", "append": false}
    ]
  }
}

지정된 헤더를 업스트림 서버로 이동하는 요청에 추가했는지 여부에 관계없이 NGINX 412 응답 코드를 사용자가 지정하는 헤더를 검증할 수 없습니다.

중요

헤더 수정 정책에 대해 동일한 헤더를 지정하고 NGINX 필터 정책에 대해 지정하는 것은 충돌의 잠재적인 소스입니다.

3.1.22. OAuth 2.0 상호 TLS 클라이언트 인증

이 정책은 모든 API 호출에 대해 OAuth 2.0 상호 TLS 클라이언트 인증을 실행합니다.

OAuth 2.0 상호 작용 TLS 클라이언트 인증 정책 JSON 의 예는 다음과 같습니다.

{
  "$schema": "http://apicast.io/policy-v1/schema#manifest#",
  "name": "OAuth 2.0 Mutual TLS Client Authentication",
  "summary": "Configure OAuth 2.0 Mutual TLS Client Authentication.",
  "description": ["This policy executes OAuth 2.0 Mutual TLS Client Authentication ",
    "(https://tools.ietf.org/html/draft-ietf-oauth-mtls-12) for every API call."
  ],
  "version": "builtin",
  "configuration": {
    "type": "object",
    "properties": { }
  }
}

3.1.23. OAuth 2.0 토큰 인트로스펙션

OAuth 2.0 토큰 인트로스펙션 정책을 사용하면 토큰 발행자(Red Hat Single Sign-On)의 토큰 검사 끝점을 사용하여 OIDC(OpenID Connect) 인증 옵션을 사용하는 서비스에 사용되는 JSON 웹 토큰(JWT) 토큰을 검증할 수 있습니다.

APIcast는 auth_type 필드에서 다음 인증 유형을 지원하여 Token Introspection Endpoint 및 이 끝점을 호출할 때 APIcast가 사용되는 인증 정보를 결정합니다.

  • use_3scale_oidc_issuer_endpoint: APIcast는 서비스 통합 페이지에 구성된 OIDC Issuer 설정의 클라이언트 자격 증명, 클라이언트 ID 및 클라이언트 시크릿 을 사용하며, OIDC Issuer 설정의 Token Introspection Endpoint를 사용합니다. APIcast는 token_introspection_endpoint 필드에서 Token Introspection 끝점을 검색합니다. 이 필드는 OIDC 발행자가 반환하는 .well-known/openid-configuration 끝점에 있습니다.

    use_3scale_oidc_issuer_endpoint 로 설정된 인증 유형 :

    "policy_chain": [
    …​
      {
        "name": "apicast.policy.token_introspection",
        "configuration": {
          "auth_type": "use_3scale_oidc_issuer_endpoint"
        }
      }
    …​
    ],
  • client_id+client_secret: 이 옵션을 사용하면 다른 Token Introspection Endpoint와 Client IDClient Secret APIcast가 토큰 정보를 요청하는 데 사용할 수 있습니다. 이 옵션을 사용하는 경우 다음 구성 매개변수를 설정합니다.

    • client_id: 토큰 인트로스펙션 끝점의 클라이언트 ID를 설정합니다.
    • client_secret: 토큰 인트로스펙션 끝점의 클라이언트 시크릿을 설정합니다.
    • introspection_url: 인트로스펙션 엔드 포인트 URL을 설정합니다.

      인증 유형을 client_id+client_secret 으로 설정합니다.

      "policy_chain": [
      …​
        {
          "name": "apicast.policy.token_introspection",
          "configuration": {
            "auth_type": "client_id+client_secret",
            "client_id": "myclient",
            "client_secret": "mysecret",
            "introspection_url": "http://red_hat_single_sign-on/token/introspection"
          }
        }
      …​
      ],

auth_type 필드의 설정에 관계없이 APIcast는 기본 인증을 사용하여 Token Introspection 호출(Authorization: Basic <token> 헤더)을 승인합니다. 여기서 < token >은 Base64로 인코딩된 < client_id>:<client_secret > 설정입니다.

OAuth 2.0 토큰 인트로스펙션 설정

Token Introspection Endpoint의 응답에는 active 속성이 포함되어 있습니다. APIcast는 이 속성의 값을 확인합니다. 특성 값에 따라 APIcast는 호출을 승인하거나 거부합니다.

  • true

    전화가 승인됨

  • false

    Authentication Failed 오류와 함께 호출이 거부됩니다.

이 정책을 통해 동일한 JWT 토큰에 대한 모든 호출에서 Token Introspection Endpoint를 호출하지 않도록 토큰 캐싱을 활성화할 수 있습니다. Token Introspection 정책에 대한 토큰 캐싱을 활성화하려면 max_cached_tokens 필드를 기능을 비활성화하는 0 으로부터 값으로 설정하고 10000 을 설정합니다. 또한 max_ttl_tokens 필드의 토큰에 대해 Time to Live(TTL) 값을 1 에서 3600 초로 설정할 수 있습니다.

3.1.24. On Fail

API 공급자로 On Fail 정책을 API 제품에 추가할 수 있습니다. On Fail 정책이 정책 체인에 있고 지정된 API 소비자 요청에 대한 정책 실행이 실패하면 APIcast는 다음을 수행합니다.

  • 요청 처리를 중지합니다.
  • 요청을 보낸 애플리케이션에 지정하는 상태 코드를 반환합니다.

On Fail 정책은 잘못된 구성으로 인해 또는 사용자 정의 정책의 비호환 코드 때문에 APIcast에서 정책을 처리할 수 없는 경우에 유용합니다. 정책 체인에서 On Fail 정책이 없으면 APIcast에서 적용할 수 없는 정책을 건너뛰고 체인의 다른 정책을 처리하며 업스트림 API로 요청을 보냅니다. 정책 체인의 On Fail 정책을 사용하면 APIcast에서 요청을 거부합니다.

정책 체인에서 On Fail 정책은 모든 위치에 있을 수 있습니다.

관리 포털에서 제품의 정책 체인에 On Fail 정책을 추가합니다. 정책 체인에서 정책을 클릭하여 On Fail 정책을 적용할 때 APIcast를 반환할 상태 코드를 지정합니다. 예를 들어 400 을 지정하면 클라이언트의 잘못된 요청을 나타낼 수 있습니다.

3.1.25. 프록시 서비스

프록시 서비스 정책을 사용하여 3scale 트래픽이 정의된 프록시를 사용하여 전송되는 일반 HTTP 프록시 를 정의할 수 있습니다. 이 경우 프록시 서비스는 역방향 HTTP 프록시로 작동합니다. 여기서 APIcast는 트래픽을 HTTP 프록시로 전송한 다음 프록시는 트래픽을 API 백엔드로 보냅니다.

다음 예제에서는 트래픽 흐름을 보여줍니다.

프록시 서비스 정책 요청 흐름

3scale 백엔드로 전송된 모든 APIcast 트래픽은 프록시를 사용하지 않습니다. 이 정책은 프록시와 API 백엔드와 API 백엔드 간의 통신에만 적용됩니다.

프록시를 통해 모든 트래픽을 보내려면 HTTP_PROXY 환경 변수를 사용해야 합니다.

참고
  • * 도메인 이름이 여러 IP 주소로 확인되면 Camel 서비스 정책은 로드 밸런싱 업스트림의 APIcast 기능을 비활성화합니다. Camel 서비스는 업스트림 서비스의 DNS 확인을 관리합니다.
  • HTTP_PROXY,HTTPS_PROXY 또는 ALL_PROXY 매개변수가 정의된 경우 이 정책은 해당 값을 덮어씁니다.
  • 프록시 연결은 인증을 지원하지 않습니다. 인증을 위해 헤더 수정 정책을 사용합니다.

설정

다음 예제에서는 정책 체인 구성을 보여줍니다.

"policy_chain": [
    {
      "name": "apicast.policy.apicast"
    },
    {
      "name": "apicast.policy.http_proxy",
      "configuration": {
          "all_proxy": "http://192.168.15.103:8888/",
          "https_proxy": "https://192.168.15.103:8888/",
          "http_proxy": "https://192.168.15.103:8888/"
      }
    }
]

all_proxy 값은 http_proxy 또는 https_proxy 가 정의되지 않은 경우 사용됩니다.

사용 사례 예

Proxy 서비스 정책은 Apache Camel over HTTP를 사용하여 3scale에서 보다 세분화된 정책과 변환을 적용하도록 설계되었습니다. 그러나 프록시 서비스 정책을 일반 HTTP 프록시 서비스로 사용할 수도 있습니다. HTTPS를 통한 Apache Camel과의 통합은 3.1.6절. “Camel 서비스” 에서 참조하십시오.

프로젝트 예

GitHub에서 camel-netty-proxy 예제를 참조하십시오. 이 프로젝트는 응답 본문을 API 백엔드에서 대문자로 변환하는 HTTP 프록시를 보여줍니다.

3.1.26. 속도 제한 헤더

속도 제한 헤더 정책은 애플리케이션이 속도 제한이 있는 애플리케이션 계획에 서브스크립션할 때 응답 메시지에 RateLimit 헤더를 추가합니다. 이러한 헤더는 구성된 요청 할당량 제한과 현재 시간 창에서 나머지 요청 할당량과 초에 대한 유용한 정보를 제공합니다.

제품에 대한 정책 체인에서 Rate Limit Headers 정책을 추가하는 경우 3scale APIcast 정책 앞에 있어야 합니다. 3scale APIcast 정책이 Rate Limit Headers 정책 이전의 경우 Rate Limit Headers 정책이 작동하지 않습니다.

RateLimit 헤더

각 메시지에 다음 RateLimit 헤더가 추가됩니다.

  • RateLimit-Limit

    구성된 시간 창에 총 요청 할당량을 표시합니다(예: 10 개의 요청).

  • RateLimit-Remaining

    현재 시간 창에 나머지 요청 할당량을 표시합니다(예: 5 개의 요청).

  • RateLimit-Reset

    현재 시간 창에 남아 있는 시간(예: 30 초)을 표시합니다. 이 헤더의 동작은 Retry-After 헤더의 delta-seconds 표기법과 호환됩니다.

기본적으로 Rate Limit Headers 정책이 구성되지 않았거나 애플리케이션 계획에 속도 제한이 없는 경우 응답 메시지에 속도 제한 헤더가 없습니다.

참고

속도 제한이 없는 API 메트릭을 요청하고 있지만 상위 메트릭에 제한이 구성되어 있는 경우 상위 제한이 적용되므로 속도 제한 헤더가 여전히 응답에 포함됩니다.

3.1.27. 응답/요청 콘텐츠 제한

API 공급자는 API 제품에 Response/Request Content Limits 정책을 추가할 수 있습니다. 이 정책을 사용하면 요청 크기를 업스트림 API로 제한할 뿐만 아니라 업스트림 API의 응답 크기를 제한할 수 있습니다. 이 정책이 없으면 요청/응답 크기가 무제한입니다.

이 정책은 의 과부하를 방지하는 데 유용합니다.

  • 백엔드가 너무 큰 페이로드에서 작동해야 하기 때문입니다.
  • 최종 사용자(API 소비자)는 처리할 수 있는 것보다 더 많은 데이터를 수신하기 때문입니다.

요청 또는 응답에서 3scale이 Response/Request Content Limits 정책을 적용하려면 콘텐츠 길이 헤더가 필요합니다.

관리 포털에서 제품에 Response/Request Content Limits 정책을 추가한 후 이를 클릭하여 제한을 바이트 단위로 지정합니다. 요청 제한 또는 응답 제한을 모두 지정할 수 있습니다. 기본값인 0 은 무제한 크기를 나타냅니다.

또는 다음과 같이 정책 체인 구성 파일을 업데이트하여 이 정책을 추가할 수 있습니다.

{
  "name": "apicast.policy.limits",
  "configuration":
  {
    "request": 100,
    "response": 100
  }
}

3.1.28. Retry

재시도 정책에서는 업스트림 API에 대한 재시도 요청 수를 설정합니다. 재시도 정책은 서비스별로 구성되므로 사용자는 원하는 소수 또는 많은 서비스를 재시도할 수 있을 뿐 만 아니라 다양한 서비스에 대해 다른 재시도 값을 구성할 수 있습니다.

중요

3scale 2.14에서는 정책에서 재시도할 사례를 구성할 수 없습니다. 이는 모든 서비스에 재시도 요청을 적용하는 환경 변수 APICAST_UPSTREAM_RETRY_CASES 를 사용하여 제어됩니다. 이에 대한 자세한 내용은 APICAST_UPSTREAM_RETRY_CASES 를 확인하십시오.

재시도 정책 JSON 의 예는 다음과 같습니다.

{
  "$schema": "http://apicast.io/policy-v1/schema#manifest#",
  "name": "Retry",
  "summary": "Allows retry requests to the upstream",
  "description": "Allows retry requests to the upstream",
  "version": "builtin",
  "configuration": {
    "type": "object",
    "properties": {
      "retries": {
        "description": "Number of retries",
        "type": "integer",
        "minimum": 1,
        "maximum": 10
      }
    }
  }
}

3.1.29. rh-SSO/Keycloak 역할 검사

참고

RH-SSO/Keycloak Role Check 정책을 APIcast 정책 체인에 추가하면 APIcast 및 라우팅 정책 앞에 배치합니다.

이 정책은 OpenID Connect 인증 옵션과 함께 사용할 때 역할 검사를 추가합니다. 이 정책은 Red Hat Single Sign-On(RH-SSO)에서 발행한 액세스 토큰에서 영역 역할 및 클라이언트 역할을 확인합니다. 3scale의 모든 클라이언트 리소스에 역할 검사를 추가하려는 경우 realm 역할이 지정됩니다.

역할 유형에는 정책 구성에 type 속성이 지정되는지 확인하는 두 가지 유형이 있습니다.

  • whitelist

    이는 기본값입니다. 허용 목록을 사용하면 APIcast에서 지정된 범위가 JWT 토큰에 있는지 확인하고 JWT에 범위가 없는 경우 호출을 거부합니다.

  • blacklist

    blacklist 을 사용하면 JWT 토큰에 블랙리스트 범위가 포함된 경우 APIcast에서 호출을 거부합니다.

동일한 정책에서 블랙리스트허용 목록 모두를 구성할 수는 없지만 RH-SSO/Keycloak 역할 검사 정책의 두 개 이상의 인스턴스를 APIcast 정책 체인에 추가할 수 있습니다.

정책 구성의 scopes 속성을 통해 범위 목록을 구성할 수 있습니다.

scope 오브젝트에는 다음과 같은 속성이 있습니다.

  • resource

    역할에 의해 제어되는 리소스 끝점입니다. 이는 매핑 규칙과 동일합니다. 패턴은 문자열의 시작 부분에서 일치하고 정확히 일치하려면 끝에 $ 를 추가해야 합니다.

  • resource_type

    이는 리소스 값이 평가되는 방법을 정의합니다.

    • 일반 텍스트(일반): 리소스 값을 일반 텍스트로 표시합니다. 예: /api/v1/ECDHE$
    • Liquid 텍스트(성): 리소스 값에 Liquid를 사용할 수 있습니다. 예: /resource_{{ jwt.aud }} 는 클라이언트 ID가 포함된 리소스에 대한 액세스를 관리합니다.
  • methods: 이 매개변수를 사용하여 RH-SSO의 사용자 역할에 따라 APIcast에서 허용된 HTTP 메서드를 나열합니다. 예를 들어 다음을 포함하는 메서드를 허용할 수 있습니다.

    • /resource1 에 액세스할 수 있는 role1 영역 역할입니다. 이 영역 역할이 없는 메서드의 경우 블랙리스트 를 지정해야 합니다.
    • /resource1 에 액세스하는 role1 이라는 client1 역할입니다.
    • /resource1 에 액세스하는 role1role2 영역 역할입니다. realm_roles 에서 역할을 지정합니다. 각 역할의 범위를 표시할 수도 있습니다.
    • /resource1 에 액세스하기 위한 액세스 토큰의 수신자인 애플리케이션 클라이언트의 role1 이라는 클라이언트 역할입니다. 유동 클라이언트 유형을 사용하여 클라이언트에 JSON 웹 토큰(JWT) 정보를 지정합니다.
    • 애플리케이션 클라이언트의 클라이언트 ID, 액세스 토큰 수신자를 포함하여 /resource1 에 액세스할 클라이언트 역할. 번성 된 클라이언트 유형을 사용하여 클라이언트 역할의 이름에 JWT 정보를 지정합니다.
    • 애플리케이션 클라이언트 ID를 포함하여 리소스에 액세스하는 role1 이라는 클라이언트 역할입니다. 유해한 클라이언트 유형을 사용하여 리소스에 JWT 정보를 지정합니다.
  • realm_roles

    이를 사용하여 realm 역할을 확인합니다. Red Hat Single Sign-On 설명서의 Cryostat 역할을 참조하십시오.

    realm 역할은 Red Hat Single Sign-On에서 발행한 JWT에 있습니다.

      "realm_access": {
        "roles": [
          "<realm_role_A>", "<realm_role_B>"
        ]
      }

    정책에 실제 역할을 지정해야 합니다.

    "realm_roles": [
      { "name": "<realm_role_A>" }, { "name": "<realm_role_B>" }
    ]

    다음은 realm_roles 배열에 있는 각 오브젝트의 사용 가능한 속성입니다.

    • name

      역할의 이름을 지정합니다.

    • name_type

      이름을 평가하는 방법을 정의합니다. 값은 일반 또는 유동일 수 있습니다. 이 명령은 resource_type 과 동일한 방식으로 작동합니다.

  • client_roles

    client_roles 를 사용하여 클라이언트 네임스페이스에서 특정 액세스 역할을 확인합니다. Red Hat Single Sign-On 설명서의 클라이언트 역할을 참조하십시오.

    클라이언트 역할은 resource_access 클레임 아래의 JWT에 있습니다.

      "resource_access": {
        "<client_A>": {
          "roles": [
            "<client_role_A>", "<client_role_B>"
          ]
        },
        "<client_B>": {
          "roles": [
            "<client_role_A>", "<client_role_B>"
          ]
        }
      }

    정책에 클라이언트 역할을 지정합니다.

    "client_roles": [
      { "name": "<client_role_A>", "client": "<client_A>" },
      { "name": "<client_role_B>", "client": "<client_A>" },
      { "name": "<client_role_A>", "client": "<client_B>" },
      { "name": "<client_role_B>", "client": "<client_B>" }
    ]

    다음은 client_roles 배열에 있는 각 오브젝트의 사용 가능한 속성입니다.

    • name

      역할의 이름을 지정합니다.

    • name_type

      name 값을 평가하는 방법을 정의합니다. 값은 일반 또는 유동일 수 있습니다. resource_type 과 동일한 방식으로 작동합니다.

    • 클라이언트

      역할의 클라이언트를 지정합니다. 정의되지 않은 경우 이 정책은 aud 클레임을 클라이언트로 사용합니다.

    • client_type

      클라이언트 값을 평가하는 방법을 정의합니다. 값은 일반 또는 유동일 수 있습니다. resource_type 과 동일한 방식으로 작동합니다.

3.1.30. 라우팅

참고

라우팅 정책이 요청을 처리하는 경우에도 요청에 대한 해당 매핑 규칙이 있어야 합니다.

라우팅 정책을 사용하면 요청을 다른 대상 끝점으로 라우팅할 수 있습니다. 대상 끝점을 정의한 다음 정규식을 사용하여 UI에서 들어오는 요청을 라우팅할 수 있습니다.You can define target endpoints and then you will be able to route incoming requests from the UI to those using regular expressions.

중요

정책 체인에 라우팅 정책을 추가할 때 라우팅 정책은 항상 표준 3scale APIcast 정책 바로 앞에 있어야 합니다. 즉, 라우팅 정책과 3scale APIcast 정책 간에 정책이 있을 수 없습니다. 이렇게 하면 APIcast가 업스트림 API로 전송하는 요청의 올바른 APIcast 출력이 보장됩니다. 다음은 올바른 정책 체인의 두 가지 예입니다.

Liquid Context Debug
JWT Claim Check
Routing
3scale APIcast
Liquid Context Debug
Routing
3scale APIcast
JWT Claim Check

라우팅 규칙

  • 여러 규칙이 있는 경우 라우팅 정책이 첫 번째 일치 규칙을 적용합니다. 이러한 규칙을 분류할 수 있습니다.
  • 일치하는 규칙이 없는 경우 정책은 업스트림을 변경하지 않고 서비스 구성에 정의된 정의된 개인 기본 URL을 사용합니다.

요청 경로 규칙

경로가 /accounts 인 경우 http://example.com 로 라우팅되는 구성입니다.

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://example.com",
          "condition": {
            "operations": [
              {
                "match": "path",
                "op": "==",
                "value": "/accounts"
              }
            ]
          }
        }
      ]
    }
  }

헤더 규칙

Test-Header 헤더 값이 123 인 경우 http://example.com 로 라우팅되는 구성입니다.

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://example.com",
          "condition": {
            "operations": [
              {
                "match": "header",
                "header_name": "Test-Header",
                "op": "==",
                "value": "123"
              }
            ]
          }
        }
      ]
    }
  }

쿼리 인수 규칙

쿼리 인수 test_query_arg 값이 123 인 경우 로 라우팅하는 구성입니다.

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://example.com",
          "condition": {
            "operations": [
              {
                "match": "query_arg",
                "query_arg_name": "test_query_arg",
                "op": "==",
                "value": "123"
              }
            ]
          }
        }
      ]
    }
  }

JWT 클레임 규칙

JWT 클레임의 값을 기반으로 라우팅하려면 JWT를 검증하고 정책에서 공유하는 컨텍스트에 저장하는 체인에 정책이 있어야 합니다.

JWT 클레임 test_claim 값이 123 인 경우 http://example.com 로 라우팅되는 구성입니다.

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://example.com",
          "condition": {
            "operations": [
              {
                "match": "jwt_claim",
                "jwt_claim_name": "test_claim",
                "op": "==",
                "value": "123"
              }
            ]
          }
        }
      ]
    }
  }

여러 작업 규칙

규칙에는 'and' combine_op 를 사용하거나 'or' combine_op 를 사용하여 모든 작업이 true로 평가되는 경우에만 지정된 업스트림으로의 경로와 경로가 포함될 수 있습니다. combine_op 의 기본값은 'and'입니다.

요청 경로가 /accounts 이고 헤더 Test-Header 값이 123 인 경우 로 라우팅하는 구성입니다.

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://example.com",
          "condition": {
            "combine_op": "and",
            "operations": [
              {
                "match": "path",
                "op": "==",
                "value": "/accounts"
              },
              {
                "match": "header",
                "header_name": "Test-Header",
                "op": "==",
                "value": "123"
              }
            ]
          }
        }
      ]
    }
  }

요청 경로가 /accounts 일 때 또는 헤더 Test-Header 값이 123 인 경우 http://example.com 로 라우팅되는 구성입니다.

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://example.com",
          "condition": {
            "combine_op": "or",
            "operations": [
              {
                "match": "path",
                "op": "==",
                "value": "/accounts"
              },
              {
                "match": "header",
                "header_name": "Test-Header",
                "op": "==",
                "value": "123"
              }
            ]
          }
        }
      ]
    }
  }

규칙 결합

규칙을 결합할 수 있습니다. 여러 규칙이 있는 경우 선택한 업스트림이 true로 평가되는 첫 번째 규칙 중 하나입니다.

이는 몇 가지 규칙이 있는 구성입니다.

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://some_upstream.com",
          "condition": {
            "operations": [
              {
                "match": "path",
                "op": "==",
                "value": "/accounts"
              }
            ]
          }
        },
        {
          "url": "http://another_upstream.com",
          "condition": {
            "operations": [
              {
                "match": "path",
                "op": "==",
                "value": "/users"
              }
            ]
          }
        }
      ]
    }
  }

catch-all 규칙

작업이 없는 규칙은 항상 일치합니다. 이는 catch-all 규칙을 정의하는 데 유용할 수 있습니다.

이 설정은 경로가 /abc 인 경우 http://some_upstream.com 로 요청을 라우팅하고, 경로가 /def 인 경우 요청을 http://another_upstream.com 로 라우팅하고, 마지막으로 이전 규칙 중 하나를 true로 평가하지 않으면 요청을 http://default_upstream.com 로 라우팅합니다.

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://some_upstream.com",
          "condition": {
            "operations": [
              {
                "match": "path",
                "op": "==",
                "value": "/abc"
              }
            ]
          }
        },
        {
          "url": "http://another_upstream.com",
          "condition": {
            "operations": [
              {
                "match": "path",
                "op": "==",
                "value": "/def"
              }
            ]
          }
        },
        {
          "url": "http://default_upstream.com",
          "condition": {
            "operations": []
          }
        }
      ]
    }
  }

지원되는 작업

지원되는 작업은 ==, !=, 일치 항목 입니다. 후자의 문자열은 정규식이 있는 문자열과 일치하며 ngx.re.match를 사용하여 구현됩니다.

이는 != 를 사용하는 구성입니다. 경로가 /accounts 가 아닌 경우 http://example.com 로 라우팅합니다.

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://example.com",
          "condition": {
            "operations": [
              {
                "match": "path",
                "op": "!=",
                "value": "/accounts"
              }
            ]
          }
        }
      ]
    }
  }

유동성 템플릿

구성 값에 대해 일시 정지된 템플릿을 사용할 수 있습니다. 이를 통해 체인의 정책이 컨텍스트에 my_var 키를 저장하는 경우 동적 값으로 규칙을 정의할 수 있습니다.

이 구성은 해당 값을 사용하여 요청을 라우팅하는 구성입니다.

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://example.com",
          "condition": {
            "operations": [
              {
                "match": "header",
                "header_name": "Test-Header",
                "op": "==",
                "value": "{{ my_var }}",
                "value_type": "liquid"
              }
            ]
          }
        }
      ]
    }
  }

host_header에 사용된 호스트 설정

기본적으로 요청이 라우팅될 때 정책은 일치하는 규칙의 URL의 호스트를 사용하여 Host 헤더를 설정합니다. host_header 특성을 사용하여 다른 호스트를 지정할 수 있습니다.

some_host.com 을 Host 헤더의 호스트로 지정하는 구성입니다.

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://example.com",
          "host_header": "some_host.com",
          "condition": {
            "operations": [
              {
                "match": "path",
                "op": "==",
                "value": "/"
              }
            ]
          }
        }
      ]
    }
  }

3.1.31. SOAP

ECDHE 정책은 정책에 지정된 매핑 규칙을 사용하여 HTTP 요청의ECDHE Action 또는 Content-Type 헤더에 제공된ECDHE 작업 URI와 일치합니다.

구성 속성

속성description필수 여부

패턴

pattern 속성을 사용하면 APIcast가ECDHEAction URI에서 일치하는 문자열을 지정할 수 있습니다.

데이터 유형: 문자열

제공됨

metric_system_name

metric_system_name 속성을 사용하면 일치하는 패턴이 히트를 등록할 3scale 백엔드 지표를 지정할 수 있습니다.

data type: string은 유효한 메트릭이어야 합니다.

제공됨

정책 오브젝트 예

{
  "name": "soap",
  "version": "builtin",
  "configuration": {
    "mapping_rules": [
      {
        "pattern": "http://example.com/soap#request",
        "metric_system_name": "soap",
        "delta": 1
      }
    ]
  }
}

정책을 구성하는 방법에 대한 자세한 내용은 문서의 3scale API Management 섹션에서 정책 체인 생성 을 참조하십시오.

3.1.32. TLS 클라이언트 인증서 검증

TLS 클라이언트 인증서 유효성 검사 정책을 사용하여 APIcast는 TLS 핸드셰이크를 구현하고 허용 목록에 대해 클라이언트 인증서의 유효성을 검사합니다. 허용 목록에는 CA(인증 기관) 또는 일반 클라이언트 인증서만 서명한 인증서가 포함되어 있습니다. 만료된 인증서 또는 유효하지 않은 인증서가 있는 경우 요청이 거부되고 다른 정책은 처리되지 않습니다.

클라이언트는 APIcast에 연결하여 요청을 보내고 클라이언트 인증서를 제공합니다. APIcast는 정책 구성에 따라 들어오는 요청에서 제공된 인증서의 신뢰성을 확인합니다. APIcast는 업스트림에 연결할 때 사용할 고유한 클라이언트 인증서를 사용하도록 구성할 수도 있습니다.

TLS 클라이언트 인증서 검증에서 작동하도록 APIcast 설정

APIcast는 TLS를 종료하도록 구성해야 합니다. 다음 단계에 따라 클라이언트 인증서 유효성 검사 정책을 사용하여 APIcast에서 사용자가 제공하는 클라이언트 인증서의 유효성 검사를 구성합니다.

3scale 설치에 액세스할 수 있어야 합니다. 모든 배포가 완료될 때까지 기다려야 합니다.

정책에서 작동하도록 APIcast 설정

APIcast를 설정하고 TLS를 종료하도록 구성하려면 다음 단계를 따르십시오.

  1. OpenShift 템플릿을 사용하여 Deploying APIcast에 표시된 대로 액세스 토큰을 가져오고 APIcast 자체 관리를 배포해야 합니다.

    참고

    전체 게이트웨이에 일부 인증서를 사용하도록 APIcast 인스턴스를 재구성해야 하므로 APIcast 자체 관리형 배포가 필요합니다.

  2. 테스트 목적으로만 캐시 및 스테이징 환경 및 --param 플래그 없이 지연 로더를 사용하여 쉽게 테스트할 수 있습니다.

    $ oc new-app -f https://raw.githubusercontent.com/3scale/3scale-amp-openshift-templates/master/apicast-gateway/apicast.yml --param CONFIGURATION_LOADER=lazy --param DEPLOYMENT_ENVIRONMENT=staging --param CONFIGURATION_CACHE=0
  3. 테스트를 위해 인증서를 생성합니다. 또는 프로덕션 배포의 경우 인증 기관에서 제공한 인증서를 사용할 수 있습니다.
  4. TLS 인증서로 보안 생성

    $ oc create secret tls apicast-tls --cert=ca/certs/server.crt --key=ca/keys/server.key
  5. APIcast 배포 내부에 시크릿 마운트

    $ oc set volume dc/apicast --add --name=certificates --mount-path=/var/run/secrets/apicast --secret-name=apicast-tls
  6. HTTPS용 포트 8443에서 수신을 시작하도록 APIcast 구성

    $ oc set env dc/apicast APICAST_HTTPS_PORT=8443 APICAST_HTTPS_CERTIFICATE=/var/run/secrets/apicast/tls.crt APICAST_HTTPS_CERTIFICATE_KEY=/var/run/secrets/apicast/tls.key
  7. 서비스에 8443 노출

    $ oc patch service apicast -p '{"spec":{"ports":[{"name":"httpsproxy","port":8443,"protocol":"TCP"}]}}'
  8. 기본 경로 삭제

    $ oc delete route api-apicast-staging
  9. apicast 서비스를 경로로 노출

    $ oc create route passthrough --service=apicast --port=https --hostname=api-3scale-apicast-staging.$WILDCARD_DOMAIN
    참고

    이 단계는 사용할 모든 API에 대해 필요하며 모든 API의 도메인 변경에 필요합니다.

  10. 자리 표시자에 [ECDHE_user_key]를 지정하여 이전에 배포된 게이트웨이가 작동하고 구성이 저장되었는지 확인합니다.

    curl https://api-3scale-apicast-staging.$WILDCARD_DOMAIN?user_key=[Your_user_key] -v --cacert ca/certs/ca.crt

정책 체인에서 TLS 클라이언트 인증서 검증 구성

정책 체인에서 TLS 클라이언트 인증서 유효성 검사를 구성하려면 3scale 로그인 자격 증명이 필요합니다. 또한 TLS 클라이언트 인증서 유효성 검사 정책을 사용하여 APIcast를 구성해야 합니다.

  1. API에 TLS 클라이언트 인증서 유효성 검사 정책을 추가하려면 3scale API Management 관리 포털에서 정책 활성화에 설명된 단계를 수행하고 TLS 클라이언트 인증서 유효성 검사를 선택합니다.
  2. TLS 클라이언트 인증서 유효성 검사 링크를 클릭합니다.
  3. 정책을 활성화하려면 Enabled 확인란을 선택합니다.
  4. 허용 목록에 인증서를 추가하려면 더하기 + 아이콘을 클릭합니다.
  5. -----BEGINECDHERTIFICATE---- 및 -------을 포함한 인증서를 지정합니다.
  6. TLS 클라이언트 인증서 유효성 검사를 사용하여 API 설정을 완료하면 정책 업데이트를 클릭합니다.

추가 사항:

  • 더하기 + 아이콘을 클릭하여 더 많은 인증서를 추가할 수 있습니다.
  • 위쪽 및 아래쪽 화살표를 클릭하여 인증서를 재구성할 수도 있습니다.

변경 사항을 저장하려면 업데이트 정책 체인 ( Update Policy Chain )을 클릭합니다.

TLS 클라이언트 인증서 유효성 검사 정책의 기능 확인

TLS 클라이언트 인증서 유효성 검사 정책의 기능을 확인하려면 3scale 로그인 자격 증명이 필요합니다. 또한 TLS 클라이언트 인증서 유효성 검사 정책을 사용하여 APIcast를 구성해야 합니다.

자리 표시자에서 [ECDHE_user_key] 를 지정하여 적용된 정책을 확인할 수 있습니다.

curl https://api-3scale-apicast-staging.$WILDCARD_DOMAIN\?user_key\=[Your_user_key] -v --cacert ca/certs/ca.crt --cert ca/certs/client.crt --key ca/keys/client.key

curl https://api-3scale-apicast-staging.$WILDCARD_DOMAIN\?user_key\=[Your_user_key] -v --cacert ca/certs/ca.crt --cert ca/certs/server.crt --key ca/keys/server.key

curl https://api-3scale-apicast-staging.$WILDCARD_DOMAIN\?user_key\=[Your_user_key] -v --cacert ca/certs/ca.crt

허용 목록에서 인증서 제거

허용 목록에서 인증서를 제거하려면 3scale 로그인 자격 증명이 필요합니다. TLS 클라이언트 인증서 유효성 검사 정책을 사용하여 APIcast를 설정해야 합니다. 정책 체인에서 TLS 클라이언트 인증서 유효성 검사를 구성하여 허용 목록에 인증서를 추가해야 합니다.

  1. TLS 클라이언트 인증서 유효성 검사 링크를 클릭합니다.
  2. 허용 목록에서 인증서를 제거하려면 x 아이콘을 클릭합니다.
  3. 인증서 제거를 완료되면 정책 업데이트를 클릭합니다.

변경 사항을 저장하려면 업데이트 정책 체인 ( Update Policy Chain )을 클릭합니다.

인증서 사용에 대한 자세한 내용은 Red Hat Certificate System 을 참조하십시오.

3.1.33. TLS 종료

이 섹션에서는 정책에서 개념, 구성, 확인 및 파일 삭제와 같은 TLS(Transport Layer Security) 종료 정책에 대한 정보를 제공합니다.

TLS 종료 정책을 사용하면 모든 API에 단일 인증서를 사용하지 않고 각 API에 대한 TLS 요청을 완료하도록 APIcast를 구성할 수 있습니다. APIcast는 클라이언트에 대한 연결을 설정하기 전에 구성 설정을 가져옵니다. 이러한 방식으로 APIcast는 정책의 인증서를 사용하여 TLS를 종료합니다. 이 정책은 다음 소스와 함께 작동합니다.

  • 정책 구성에 저장됩니다.
  • 파일 시스템에 저장됩니다.

기본적으로 이 정책은 정책 체인에서 활성화되어 있지 않습니다.

정책 체인에서 TLS 종료 구성

이 섹션에서는 PEM(개인 정보 기능 개선) 형식의 인증서와 함께 정책 체인에서 TLS 종료를 구성하는 사전 요구 사항 및 단계에 대해 설명합니다. 사전 요구 사항은 다음과 같습니다.

  • 사용자가 발급한 인증서입니다.
  • PEM 형식의 서버 인증서입니다.
  • PEM 형식의 인증서 개인 키입니다.

다음 절차를 따르십시오.

  1. API에 TLS 종료 정책을 추가하려면 표준 정책 활성화 및 TLS 종료를 선택합니다.
  2. TLS 종료 링크를 클릭합니다.
  3. 정책을 활성화하려면 Enabled 확인란을 선택합니다.
  4. 정책에 TLS 인증서를 추가하려면 더하기 + 아이콘을 클릭합니다.
  5. 인증서 소스를 선택합니다.

    • 포함된 인증서 는 기본적으로 선택됩니다. 다음 인증서를 업로드합니다.

      • PEM 형식 인증서 개인 키: 찾아보기 를 클릭하여 선택하고 업로드합니다.
      • PEM 형식 인증서: 찾아보기 를 클릭하여 선택하고 업로드합니다.
    • 파일 시스템의 인증서 - 다음 인증서 경로를 선택하고 지정합니다.

      • 인증서 경로
      • 인증서 개인 키 경로
  6. TLS 종료로 API 설정을 완료하면 업데이트 정책 을 클릭합니다.

추가 사항:

  • 더하기 + 아이콘을 클릭하여 더 많은 인증서를 추가할 수 있습니다.
  • 위쪽 및 아래쪽 화살표를 클릭하여 인증서를 재구성할 수도 있습니다.

변경 사항을 저장하려면 업데이트 정책 체인 ( Update Policy Chain )을 클릭합니다.

TLS 종료 정책의 기능 확인

3scale 로그인 자격 증명이 있어야 합니다. TLS 종료 정책을 사용하여 APIcast를 구성해야 합니다.

정책이 다음 명령으로 작동하는 경우 명령줄에서 테스트할 수 있습니다.

curl “${public_URL}:${port}/?user_key=${user_key}" --cacert ${path_to_certificate}/ca.pem -v

다음과 같습니다.

  • public_URL

    스테이징 공용 기본 URL입니다.

  • port

    포트 번호입니다.

  • user_key

    인증할 사용자 키입니다.

  • path_to_certificate

    로컬 파일 시스템의 CA 인증서 경로입니다.

TLS 종료에서 파일 제거

이 섹션에서는 TLS 종료 정책에서 인증서 및 키 파일을 제거하는 단계를 설명합니다.

인증서를 제거하려면 다음을 수행합니다.

  1. TLS 종료 링크를 클릭합니다.
  2. 인증서와 키를 제거하려면 x 아이콘을 클릭합니다.
  3. 인증서 제거를 완료되면 정책 업데이트를 클릭합니다.

변경 사항을 저장하려면 업데이트 정책 체인 ( Update Policy Chain )을 클릭합니다.

3.1.34. 업스트림

업스트림 정책을 사용하면 정규식을 사용하여 Host 요청 헤더를 구문 분석하고 Private Base URL에 정의된 업스트림 URL을 다른 URL로 교체할 수 있습니다.

예를 들면 다음과 같습니다.

regex /foo 가 있는 정책 및 URL 필드 newexample.com 은 URL https://www.example.com/foo/123/newexample.com으로 바꿉니다.

정책 체인 참조:

속성description필수 여부

regex

regex 속성을 사용하면 요청 경로와 일치하는 항목을 검색할 때 Upstream 정책에서 사용할 정규식을 지정할 수 있습니다.

data type: string, 유효한 정규식 구문

제공됨

url

url 속성을 사용하여 일치 시 대체 URL을 지정할 수 있습니다. Upstream 정책은 이 URL이 유효한지 확인하지 않습니다.

data type: string, 이 URL이 유효한 URL인지 확인하십시오.

제공됨

정책 오브젝트 예

{
  "name": "upstream",
  "version": "builtin",
  "configuration": {
    "rules": [
      {
        "regex": "^/v1/.*",
        "url": "https://api-v1.example.com",

      }
    ]
  }
}

정책을 구성하는 방법에 대한 자세한 내용은 문서의 3scale API Management 섹션에서 정책 체인 생성 을 참조하십시오.

3.1.35. 업스트림 연결

업스트림 연결 정책을 사용하면 3scale 설치에서 API 백엔드 서버를 구성한 방법에 따라 각 API에 대해 다음 지시문의 기본값을 변경할 수 있습니다.

  • proxy_connect_timeout
  • proxy_send_timeout
  • proxy_read_timeout

업스트림 연결 정책을 구성하려면 다음을 수행합니다.

  • 3scale 설치에 액세스할 수 있어야 합니다.
  • 모든 배포가 완료될 때까지 기다려야 합니다.

다음 절차를 따르십시오.

  1. API에 Upstream 연결 정책을 추가하려면 3scale API Management 관리 포털에서 정책 활성화에 설명된 단계를 수행하고 Upstream Connection 을 선택합니다.
  2. 업스트림 연결 링크를 클릭합니다.
  3. 정책을 활성화하려면 Enabled 확인란을 선택합니다.
  4. 업스트림 연결에 대한 옵션을 구성합니다.

    • send_timeout
    • connect_timeout
    • read_timeout
  5. 업스트림 연결을 사용하여 API 설정을 완료하면 업데이트 정책 을 클릭합니다.

변경 사항을 저장하려면 업데이트 정책 체인 ( Update Policy Chain )을 클릭합니다.

3.1.36. 업스트림 상호 TLS

업스트림 상호 TLS 정책을 사용하면 구성에 설정된 인증서를 기반으로 APIcast와 업스트림 API 간에 상호 TLS 연결을 설정하고 검증할 수 있습니다.

verify 필드가 활성화되면 정책은 업스트림 API에서 서버 인증서도 확인합니다. ca_certificates 에는 APIcast가 서버의 유효성을 확인하는 데 사용하는 ------ BEGINECDHERTIFICATE----- 및 -----END ECDHERTIFICATE-------를 포함하여 개인 정보 보안 강화된 SASL(PEM) 형식의 인증서가 포함되어 있습니다.

참고

검증 필드를 활성화해야 하며 업스트림 API의 인증서를 확인하기 위해 ca_certificates 가 채워야 합니다. verify 필드가 활성화되지 않으면 업스트림 API의 APIcast 인증서 확인만 발생합니다.

정책 체인에서 업스트림 TLS를 구성하려면 3scale 설치에 액세스할 수 있어야 합니다.

  1. Upstream 상호 TLS 정책을 API에 추가하려면 3scale API Management 관리 포털에서 정책 활성화에 설명된 단계를 수행하고 Upstream Mutual TLS 를 선택합니다.
  2. 업스트림 상호 TLS 링크를 클릭합니다.
  3. 정책을 활성화하려면 Enabled 확인란을 선택합니다.
  4. 인증서 유형 선택:

    • path

      OpenShift에서 생성한 인증서와 같은 인증서 경로를 지정하려면 다음을 수행합니다.

    • 포함됨

      타사 생성된 인증서를 파일 시스템에서 업로드하여 사용하려는 경우.

  5. 인증서 에서 클라이언트 인증서를 지정합니다.
  6. 인증서 키의 키를 나타냅니다.
  7. 업스트림 상호 TLS를 사용하여 API 설정을 완료하면 정책 체인 업데이트 를 클릭합니다.

변경 사항을 승격하려면 다음을 수행합니다.

  1. [=<_product] 페이지 > 통합 > 설정으로 이동합니다.
  2. APIcast 구성에서 v #을 클릭하여 APIcast를 스테이징합니다.

V # 은 승격할 구성의 버전 번호를 나타냅니다.

경로 구성

다음과 같이 OpenShift 및 Kubernetes 시크릿의 인증서 경로를 사용합니다.

{
  "name": "apicast.policy.upstream_mtls",
  "configuration": {
      "certificate": "/secrets/client.cer",
      "certificate_type": "path",
      "certificate_key": "/secrets/client.key",
      "certificate_key_type": "path"
  }
}

임베디드 구성

http 양식 및 파일 업로드에 다음 구성을 사용합니다.

{
  "name": "apicast.policy.upstream_mtls",
  "configuration": {
    "certificate_type": "embedded",
    "certificate_key_type": "embedded",
    "certificate": "data:application/pkix-cert;name=client.cer;base64,XXXXXXXXXXX",
    "certificate_key": "data:application/x-iwork-keynote-sffkey;name=client.key;base64,XXXXXXXX"
  }
}

추가 필드인 ca_certificates 에 대한 자세한 내용을 확인하고 Upstream Mutual TLS, 정책 구성 스키마를 확인합니다.

추가 고려 사항

업스트림 상호 TLS 정책은 APICAST_PROXY_PROXY_CERTIFICATE_KEYAPICAST_PROXY_HTTPS_CERTIFICATE 환경 변수 값을 덮어씁니다. 정책에 의해 설정된 인증서를 사용하므로 해당 환경 변수가 적용되지 않습니다.

3.1.37. URL 재작성

URL 재작성 정책을 사용하면 요청 및 쿼리 문자열의 경로를 수정할 수 있습니다.

3scale APIcast 정책과 결합하면 정책 체인의 APIcast 정책 앞에 URL Rewriting 정책이 배치되면 APIcast 매핑 규칙이 수정된 경로에 적용됩니다. 정책 체인에서 APIcast 이후에 URL 재작성 정책이 배치되면 매핑 규칙이 원래 경로에 적용됩니다.

정책은 다음 두 가지 작업 세트를 지원합니다.

  • 명령

    요청 경로를 다시 작성하는 데 적용할 명령 목록입니다.

  • query_args_commands

    요청의 쿼리 문자열을 다시 작성하는 데 적용할 명령 목록입니다.

경로 재작성 명령

다음은 명령 목록의 각 명령이 구성된 구성 매개변수입니다.

  • op

    적용할 작업입니다. 사용 가능한 옵션은 subgsub 입니다. 하위 작업은 첫 번째 일치 항목만 지정된 정규식으로 대체합니다. gsub 작업은 일치하는 모든 항목이 지정된 정규식으로 교체됩니다. 하위 및 g sub 작업에 대한 설명서를 참조하십시오.

  • regex

    일치시킬 Perl 호환 정규식입니다.

  • replace

    일치하는 경우 사용되는 대체 문자열입니다.

  • options

    이는 선택 사항입니다. regex 일치를 수행하는 방법을 정의하는 옵션입니다. 사용 가능한 옵션에 대한 자세한 내용은 OpenResty Lua 모듈 프로젝트 설명서의 ngx.re.match 섹션을 참조하십시오.

  • break

    이는 선택 사항입니다. 확인란이 활성화된 상태에서 true로 설정하면 명령이 마지막 URL이 적용되고 목록의 모든 후행 명령이 삭제됩니다.

쿼리 문자열 재작성하기 위한 명령

다음은 query_args_commands 목록의 각 명령이 구성된 구성 매개변수입니다.

  • op

    쿼리 인수에 적용할 작업입니다. 다음 옵션을 사용할 수 있습니다.

    • add

      기존 인수에 값을 추가합니다.

    • set

      설정되지 않은 경우 arg를 생성하고 설정 시 값을 바꿉니다.

    • push

      설정되지 않은 경우 arg를 생성하고 설정 시 값을 추가합니다.

    • 삭제

      arg를 삭제합니다.

  • ARG

    작업이 적용되는 쿼리 인수 이름입니다.

  • value

    쿼리 인수에 사용되는 값을 지정합니다. 값 유형 "liquid"의 경우 값은 {{ variable_from_context }} 형식이어야 합니다. 삭제 작업의 경우 값이 고려되지 않습니다.

  • value_type

    이는 선택 사항입니다. 쿼리 인수 값이 평가되는 방법을 정의하고 일반 텍스트의 경우 일반 텍스트 또는 리쿼드 템플릿으로 평가를 위한 유동성 일 수 있습니다. 자세한 내용은 4.1절. “정책에서 변수 및 필터 사용”의 내용을 참조하십시오. 지정하지 않으면 기본적으로 "plain" 유형이 사용됩니다.

예제

URL 재작성 정책은 다음과 같이 구성됩니다.

{
  "name": "url_rewriting",
  "version": "builtin",
  "configuration": {
    "query_args_commands": [
      {
        "op": "add",
        "arg": "addarg",
        "value_type": "plain",
        "value": "addvalue"
      },
      {
        "op": "delete",
        "arg": "user_key",
        "value_type": "plain",
        "value": "any"
      },
      {
        "op": "push",
        "arg": "pusharg",
        "value_type": "plain",
        "value": "pushvalue"
      },
      {
        "op": "set",
        "arg": "setarg",
        "value_type": "plain",
        "value": "setvalue"
      }
    ],
    "commands": [
      {
        "op": "sub",
        "regex": "^/api/v\\d+/",
        "replace": "/internal/",
        "options": "i"
      }
    ]
  }

APIcast로 전송되는 원래 요청 URI입니다.

https://api.example.com/api/v1/products/123/details?user_key=abc123secret&pusharg=first&setarg=original

URL 재작성을 적용한 후 API 백엔드에 API 캐스트가 전송하는 URI입니다.

https://api-backend.example.com/internal/products/123/details?pusharg=first&pusharg=pushvalue&setarg=setvalue

다음과 같은 변환이 적용됩니다.

  1. 하위 문자열 /api/v1/ 은 유일한 경로 재작성 명령과 일치하며 /internal/ 로 교체됩니다.
  2. user_key 쿼리 인수가 삭제됩니다.
  3. value pushvaluepusharg 쿼리 인수에 추가 값으로 추가됩니다.
  4. 쿼리 인수 setarg 의 값은 구성된 값 setvalue 로 교체됩니다.
  5. 쿼리 인수 add arg 가 원래 URL에 존재하지 않기 때문에 명령 추가가 적용되지 않았습니다.

정책을 구성하는 방법에 대한 자세한 내용은 문서의 3scale API Management 섹션에서 정책 체인 생성 을 참조하십시오.

3.1.38. 캡처를 사용하여 URL 다시 쓰기

캡처를 사용하여 URL 재작성 정책은 URL 재작성 정책의 대안이며 API 백엔드에 전달하기 전에 API 요청의 URL을 다시 작성할 수 있습니다.

Captures로 URL Rewritings 정책은 URL에서 인수를 검색하고 다시 작성된 URL에서 해당 값을 사용합니다.

정책은 변환 구성 매개변수를 지원합니다. 요청 URL에 적용되는 변환을 설명하는 오브젝트 목록입니다. 각 트랜션 오브젝트는 다음 두 가지 속성으로 구성됩니다.

  • match_rule

    이 규칙은 들어오는 요청 URL과 일치합니다. {nameOfArgument} 형식으로 이름이 지정된 인수를 포함할 수 있습니다. 이러한 인수는 다시 작성된 URL에서 사용할 수 있습니다. URL은 match_rule 과 정규식으로 비교됩니다. 이름이 지정된 인수와 일치하는 값은 다음 문자(PCRE regex 표기법)만 포함해야 합니다. [\w-.~%!$&'()*,;=@:]. 다른 regex 토큰은 문자열 시작 부분에 ^, 문자열 끝에 $ 와 같은 match_rule 표현식에 사용할 수 있습니다.

  • 템플릿

    원래 URL을 사용하여 다시 작성하는 URL 템플릿입니다. match_rule 에서 이름이 지정된 인수를 사용할 수 있습니다.

원래 URL의 쿼리 매개변수는 템플릿에 지정된 쿼리 매개변수와 병합됩니다.

예제

Captures로 URL Rewritings 정책은 다음과 같이 구성됩니다.

{
  "name": "rewrite_url_captures",
  "version": "builtin",
  "configuration": {
    "transformations": [
      {
        "match_rule": "/api/v1/products/{productId}/details",
        "template": "/internal/products/details?id={productId}&extraparam=anyvalue"
      }
    ]
  }
}

APIcast로 전송되는 원래 요청 URI입니다.

https://api.example.com/api/v1/products/123/details?user_key=abc123secret

URL 재작성을 적용한 후 API 백엔드에 API 캐스트가 전송하는 URI입니다.

https://api-backend.example.com/internal/products/details?user_key=abc123secret&extraparam=anyvalue&id=123

3.1.39. WebSocket

WebSocket 정책은 업스트림 API에 WebSocket 프로토콜 연결을 활성화합니다. WebSocket 프로토콜을 활성화하려면 다음을 고려하십시오.

  • WebSocket 프로토콜은 추가 헤더를 허용하지 않습니다.

    • 인증 정보 위치에 대한 쿼리 매개 변수를 사용하여 WebSocket 정책을 구성합니다.
    • WebSocket 정책은 OIDC(OpenID Connect) 인증 방법을 지원하지 않습니다.
  • WebSocket 프로토콜은 HTTP/2 표준의 일부가 아닙니다.

WebSocket 연결을 활성화하는 지정된 업스트림 API의 경우 해당 백엔드를 http[s] 또는 ws[s] 로 정의할 수 있습니다.

정책 체인에 WebSocket 정책을 추가하는 경우 3scale API Management APIcast 정책 이전이어야 합니다.

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.