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

Apigee Edge 문서입니다.
Apigee X 문서.
정보

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

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

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

경우에 따라 런타임 시 API 프록시에서 이러한 서비스 중 하나 이상을 사용해야 할 수도 있습니다. 이것은 왜냐하면 KeyValueMaps, OAuth 액세스 토큰, API 제품, 개발자 앱, 개발자, 고객 키 등에는 키-값 쌍, 맞춤 키-값 쌍, 속성 또는 프로필의 일부로 설정할 수 있습니다.

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

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

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

이 모든 정보는 런타임 시 효과적으로 사용하여 정책에서 동적인 동작을 수행할 수 있습니다. 커스텀 코드를 작성할 수 있습니다

안티패턴

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

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

아래의 코드 샘플에서는 맞춤 JavaScript 코드를 통해 관리 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의 정보에 액세스합니다. 샘플 코드 도 있습니다.
    <!-- /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 정책이 있으면 이 정책의 일부로 채워진 흐름 변수를 사용하여 정보에 액세스할 수 있습니다. 여기 표시된 샘플 코드는 JavaScript를 사용하여 개발자 앱의 이름 및 created_by 정보를 검색하는 방법:
      <!-- /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 정책이 없으면 Access Entity 및 Extract Variables 정책을 사용하여 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>
        

추가 자료