Anti-Muster: Management API-Aufrufe von einem API-Proxy aus aufrufen

Sie sehen die Dokumentation zu Apigee Edge.
Zur Apigee X-Dokumentation
weitere Informationen

Edge verfügt über ein leistungsstarkes Dienstprogramm namens „Management APIs“, das Dienste wie die folgenden bietet:

  • API-Proxys bereitstellen oder Bereitstellung aufheben
  • Virtuelle Hosts, Schlüsselspeicher und Truststores konfigurieren
  • Erstellen, Löschen und/oder Aktualisieren von Entitäten wie KeyValueMaps, API-Produkten, Entwickler-Apps, Entwicklern, Consumer-Keys usw.
  • Informationen zu diesen Entitäten abrufen

Auf diese Dienste kann auf der Apigee Edge-Plattform über eine Komponente namens Management Server zugegriffen werden. Diese Dienste lassen sich mithilfe von einfachen API-Aufrufen für die Verwaltung einfach aufrufen.

Manchmal müssen wir einen oder mehrere dieser Dienste von API-Proxys zur Laufzeit verwenden. Dies liegt daran, dass Entitäten wie KeyValueMaps, OAuth-Zugriffstokens, API-Produkte, Entwickler-Apps, Entwickler, Consumer Keys usw. nützliche Informationen in Form von Schlüssel/Wert-Paaren, benutzerdefinierten Attributen oder als Teil ihres Profils enthalten.

Sie können beispielsweise die folgenden Informationen in KeyValueMap speichern, um sie zur Laufzeit sicherer und zugänglicher zu machen:

  • Back-End-Ziel-URLs
  • Umgebungsattribute
  • Sicherheitsanmeldedaten von Back-End- oder Drittanbietersystemen

Ebenso können Sie die Liste der API-Produkte oder die E-Mail-Adresse des Entwicklers zur Laufzeit abrufen. Diese Informationen werden im Rahmen des Developer Apps-Profils verfügbar sein.

Alle diese Informationen können zur Laufzeit effektiv genutzt werden, um dynamisches Verhalten in Richtlinien oder benutzerdefiniertem Code in Apigee Edge zu ermöglichen.

Anti-Pattern

Die Management APIs werden bevorzugt und für Verwaltungsaufgaben verwendet. Sie sollten nicht zum Ausführen einer Laufzeitlogik im API-Proxy-Ablauf verwendet werden. Das hat folgende Gründe:

  • Die Verwendung von Management-APIs für den Zugriff auf Informationen über Entitäten wie KeyValueMaps, OAuth-Zugriffstokens oder für andere Zwecke von API-Proxys führt zu einer Abhängigkeit von Verwaltungsservern.
  • Verwaltungsserver sind kein Teil der Edge-Laufzeitkomponente und daher möglicherweise nicht hochverfügbar.
  • Verwaltungsserver können auch nicht innerhalb desselben Netzwerks oder Rechenzentrums bereitgestellt werden und können daher zur Laufzeit zu Netzwerklatenzen führen.
  • Die Einträge auf den Verwaltungsservern werden für einen längeren Zeitraum im Cache gespeichert. Daher können wir die neuesten Daten möglicherweise nicht sofort in den API-Proxies anzeigen, wenn wir innerhalb kurzer Zeit Schreibvorgänge und Lesevorgänge ausführen.
  • Erhöhen der Netzwerk-Hops zur Laufzeit

Im folgenden Codebeispiel wird der Verwaltungs-API-Aufruf über den benutzerdefinierten JavaScript-Code ausgeführt, um die Informationen aus der KeyValueMap abzurufen:

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

Wenn der Verwaltungsserver nicht verfügbar ist, schlägt der JavaScript-Code fehl, mit dem der Verwaltungs-API-Aufruf aufgerufen wird. Dadurch schlägt die API-Anfrage fehl.

Auswirkungen

  • Führt während der Laufzeit zu einer zusätzlichen Abhängigkeit von Verwaltungsservern. Jeder Fehler auf den Verwaltungsservern wirkt sich auf die API-Aufrufe aus.
  • Nutzeranmeldedaten für Management-APIs müssen entweder lokal oder in einem sicheren Speicher wie einer verschlüsselten KVM gespeichert werden.
  • Leistungseinbußen durch den Aufruf des Verwaltungsdienstes über das Netzwerk
  • Die aktualisierten Werte werden aufgrund einer längeren Cache-Ablaufzeit auf Verwaltungsservern möglicherweise nicht sofort angezeigt.

Best Practice

Es gibt effektivere Möglichkeiten, Informationen aus Entitäten wie KeyValueMaps, API-Produkten, DeveloperApps, Developers, Consumer Keys usw. zur Laufzeit abzurufen. Hier einige Beispiele:

  • Verwenden Sie eine KeyValueMapOperations-Richtlinie, um auf Informationen aus KeyValueMaps zuzugreifen. Der folgende Beispielcode zeigt, wie Informationen aus der KeyValueMap abgerufen werden:
    <!-- /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>
    
  • Wenn Sie im API-Proxy auf Informationen zu API-Produkten, Entwickler-Apps, Entwickler-Apps, Consumer-Keys usw. zugreifen möchten, haben Sie folgende Möglichkeiten:
    • Wenn Ihr API-Proxy-Flow eine VerifyAPIKey-Richtlinie hat, können Sie mit den Flow-Variablen, die als Teil dieser Richtlinie ausgefüllt werden, auf die Informationen zugreifen. Der folgende Beispielcode zeigt, wie der Name und „create_by“ einer Entwickler-App mithilfe von JavaScript abgerufen wird:
      <!-- /antipatterns/examples/2-7.xml -->
      print("Application Name ", context.getVariable(""verifyapikey. VerifyAPIKey.app.name"));
      print("Created by:", context.getVariable("verifyapikey. VerifyAPIKey.app.created_by"));
      
    • Wenn Ihr API-Proxy-Ablauf keine ConfirmAPIKey-Richtlinie hat, können Sie mithilfe der Richtlinien „Zugriffsentität“ und „Variablen extrahieren“ auf die Profile von API-Produkten, Entwickler-Apps usw. zugreifen:
      1. Rufen Sie das Profil der DeveloperApp mit der AccessEntity-Richtlinie ab:
        <!-- /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. Extrahieren Sie appId mit der ExtractVariables-Richtlinie aus der DeveloperApp:
        <!-- /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>
        

Weitere Informationen