안티패턴: API 프록시에서 관리 API 호출 호출

현재 Apigee Edge 문서가 표시되고 있습니다.
Apigee X 문서로 이동
정보

Edge에는 다음과 같은 서비스를 제공하는 '관리 API'라는 강력한 유틸리티가 있습니다.

  • API 프록시 배포 또는 배포 취소
  • 가상 호스트, 키 저장소, 트러스트 저장소 등 구성
  • KeyValueMaps, API 제품, 개발자 앱, 개발자, 고객 키 등의 항목을 생성, 삭제 또는 업데이트합니다.
  • 이러한 항목의 정보 검색

이러한 서비스는 Apigee Edge 플랫폼에서 관리 서버라는 구성요소를 통해 액세스할 수 있습니다. 이러한 서비스는 간단한 관리 API 호출을 사용하여 쉽게 호출할 수 있습니다.

경우에 따라 런타임 시 API 프록시에서 이러한 서비스 중 하나 이상을 사용해야 할 수도 있습니다. 이는 KeyValueMaps, OAuth 액세스 토큰, API 제품, 개발자 앱, 개발자, 고객 키 등의 항목이 키-값 쌍, 커스텀 속성 또는 프로필의 일부로 유용한 정보를 포함하기 때문입니다.

예를 들어 KeyValueMap에 다음 정보를 저장하여 런타임에 더욱 안전하게 사용하고 액세스할 수 있습니다.

  • 백엔드 대상 URL
  • 환경 속성
  • 백엔드 또는 타사 시스템의 보안 사용자 인증 정보

마찬가지로 런타임에 API 제품 목록 또는 개발자의 이메일 주소를 가져오려고 할 수 있습니다. 이 정보는 개발자 앱 프로필의 일부로 제공됩니다.

이 모든 정보를 런타임에 효과적으로 사용하여 Apigee Edge 내의 정책 또는 커스텀 코드에서 동적 동작을 구현할 수 있습니다.

안티패턴

관리 API는 관리 작업에 선호되고 유용하며 API 프록시 흐름에서 런타임 로직을 실행하는 데 사용해서는 안 됩니다. 이유는 다음과 같습니다.

  • 관리 API를 사용하여 KeyValueMaps, OAuth 액세스 토큰과 같은 항목 관련 정보에 액세스하거나 API 프록시에서 다른 목적으로 액세스하면 관리 서버에 종속됩니다.
  • 관리 서버는 Edge 런타임 구성요소에 포함되지 않으므로 가용성이 높지 않을 수 있습니다.
  • 또한 관리 서버는 동일한 네트워크 또는 데이터 센터 내에 프로비저닝되지 않으므로 런타임에 네트워크 지연 시간이 발생할 수 있습니다.
  • 관리 서버의 항목은 장기간 동안 캐시되므로 짧은 시간 동안 쓰기 및 읽기를 수행하면 API 프록시에서 최신 데이터가 바로 표시되지 않을 수 있습니다.
  • 런타임에 네트워크 홉을 증가시킵니다.

아래 코드 샘플에서는 맞춤 자바스크립트 코드를 통해 관리 API를 호출하여 KeyValueMap에서 정보를 가져옵니다.

var response = httpClient.send('https://api.enterprise.apigee.com/v1/o/org_name/e/env_name/keyvaluemaps/kvm_name')

관리 서버를 사용할 수 없는 경우, 관리 API 호출을 호출하는 JavaScript 코드가 실패합니다. 그러면 이후에 API 요청이 실패합니다.

영향

  • 런타임 시 관리 서버에 대한 추가 종속성이 도입됩니다. 관리 서버에 장애가 발생하면 API 호출에 영향을 미칩니다.
  • 관리 API의 사용자 인증 정보는 로컬 또는 암호화된 KVM과 같은 일부 보안 저장소에 저장해야 합니다.
  • 네트워크를 통한 관리 서비스 호출이 성능에 영향을 줍니다.
  • 관리 서버의 캐시 만료가 더 길기 때문에 업데이트된 값이 즉시 표시되지 않을 수 있습니다.

권장사항

런타임 시 KeyValueMaps, API 제품, DeveloperApps, 개발자, 고객 키 등의 항목에서 정보를 가져오는 더 효과적인 방법이 있습니다. 예를 들면 다음과 같습니다.

  • KeyValueMapOperations 정책을 사용하여 KeyValueMaps의 정보에 액세스합니다. 다음은 KeyValueMap에서 정보를 검색하는 방법을 보여주는 샘플 코드입니다.
    <!-- /antipatterns/examples/2-6.xml -->
    <KeyValueMapOperations mapIdentifier="urlMap" async="false"
        continueOnError="false" enabled="true" name="GetURLKVM">
      <DisplayName>GetURLKVM</DisplayName>
      <ExpiryTimeInSecs>86400</ExpiryTimeInSecs>
      <Scope>environment</Scope>
      <Get assignTo="urlHosti" index="2">
        <Key>
          <Parameter>urlHost_1</Parameter>
        </Key>
      </Get>
    </KeyValueMapOperations>
    
  • API 프록시에서 API 제품, 개발자 앱, 개발자, 고객 키 등의 정보에 액세스하려면 다음 중 하나를 실행하세요.
    • API 프록시 흐름에 VerifyAPIKey 정책이 있으면 이 정책의 일부로 채워진 흐름 변수를 사용하여 정보에 액세스할 수 있습니다. 다음은 자바스크립트를 사용하여 개발자 앱의 이름과 생성 기준 정보를 가져오는 방법을 보여주는 샘플 코드입니다.
      <!-- /antipatterns/examples/2-7.xml -->
      print("Application Name ", context.getVariable(""verifyapikey. VerifyAPIKey.app.name"));
      print("Created by:", context.getVariable("verifyapikey. VerifyAPIKey.app.created_by"));
      
    • API 프록시 흐름에 VerifyAPIKey 정책이 없는 경우 항목 액세스 및 변수 추출 정책을 사용하여 API 제품, 개발자 앱 등의 프로필에 액세스할 수 있습니다.
      1. AccessEntity 정책에 따라 DeveloperApp 프로필을 검색합니다.
        <!-- /antipatterns/examples/2-8.xml -->
        <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <AccessEntity async="false" continueOnError="false" enabled="true" name="GetDeveloperApp">
          <DisplayName>GetDeveloperApp</DisplayName>
          <EntityType value="app"></EntityType>
          <EntityIdentifier ref="developer.app.name" type="appname"/>
          <SecondaryIdentifier ref="developer.id" type="developerid"/>
        </AccessEntity>
        
      2. ExtractVariables 정책을 사용하여 DeveloperApp에서 appId을 추출합니다.
        <!-- /antipatterns/examples/2-9.xml -->
        <ExtractVariables name="Extract-Developer App-Info">
          <!--
            The source element points to the variable populated by AccessEntity policy.
            The format is <policy-type>.<policy-name>
            In this case, the variable contains the whole developer profile.
          -->
          <Source>AccessEntity.GetDeveloperApp"</Source>
          <VariablePrefix>developerapp</VariablePrefix>
          <XMLPayload>
            <Variable name="appld" type="string">
              <!-- You parse elements from the developer profile using XPath. -->
              <XPath>/App/AppId</XPath>
            </Variable>
          </XMLPayload>
        </ExtractVariables>
        

추가 자료