안티패턴: API 프록시에서 Apigee API 호출을 호출

Apigee X 문서를 보고 있습니다.
Apigee Edge 문서 보기

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

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

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

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

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

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

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

이 모든 정보는 런타임에 효과적으로 사용되어 Apigee 내의 정책이나 커스텀 코드에서 동적 동작을 사용 설정할 수 있습니다.

안티패턴

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

  • API 프록시에서 KVM, OAuth 액세스 토큰과 같은 항목에 대한 정보에 액세스하는 용도로 Apigee API를 사용할 수 있으며 다른 용도로 사용할 경우 관리 서버에 대한 종속성이 생깁니다.
  • 관리 서버는 Apigee 런타임 구성요소의 일부가 아니므로 가용성이 높지 않을 수 있습니다.
  • 또한 관리 서버는 동일한 네트워크 또는 데이터 센터 내에 프로비저닝되지 않으므로 런타임에 네트워크 지연 시간이 발생할 수 있습니다.
  • 관리 서버의 항목은 장기간 캐시되므로 단기간에 쓰기 및 읽기를 수행하면 API 프록시에서 최신 데이터를 즉시 볼 수 없습니다.
  • 런타임에 네트워크 홉을 증가시킵니다.

아래의 코드 샘플에서는 커스텀 자바스크립트 코드를 통해 Apigee API 호출을 수행하여 KVM에서 정보를 검색합니다.

var response = httpClient.send('https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/keyvaluemaps')

관리 서버를 사용할 수 없으면 Apigee API 호출을 호출하는 자바스크립트 코드가 실패합니다. 그러면 이후에 API 요청이 실패합니다.

영향

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

권장사항

런타임에 KVM, API 제품, 개발자 앱, 개발자, 소비자 키 등의 항목에서 정보를 검색하는 더 효과적인 방법이 있습니다. 예를 들면 다음과 같습니다.

  • KeyValueMapOperations 정책을 사용하여 KVM에서 정보에 액세스합니다. 다음은 KVM에서 정보를 검색하는 방법을 보여주는 샘플 코드입니다.
    <!-- /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 정책이 있으면 이 정책의 일부로 채워진 흐름 변수를 사용하여 정보에 액세스할 수 있습니다. 다음은 자바스크립트를 사용하여 개발자 앱의 이름과 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 정책이 없으면 AccessEntityExtractVariables 정책을 사용하여 API 제품, 개발자 앱 등의 프로필에 액세스할 수 있습니다.
      1. AccessEntity 정책을 사용하여 개발자 앱의 프로필을 검색합니다.
        <!-- /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 정책을 사용하여 개발자 앱에서 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>
        

추가 자료