Antipatrón: Invoca llamadas a la API de Management desde un proxy de API

Estás viendo la documentación de Apigee Edge.
Ir a la documentación de Apigee X.
info

Edge tiene una utilidad potente llamada “APIs de administración” que ofrece servicios como los siguientes:

  • Implementa o anula la implementación de proxies de API
  • Configura hosts virtuales, almacenes de claves y almacenes de confianza, entre otros
  • Crea, borra o actualiza entidades como KeyValueMaps, productos de API, apps para desarrolladores, desarrolladores, claves de consumidor, etcétera
  • Recupera información sobre estas entidades

Se puede acceder a estos servicios mediante un componente llamado servidor de administración en la plataforma de Apigee Edge. Se pueden invocar fácilmente con la ayuda de llamadas simples a la API de administración.

A veces es posible que necesitemos usar uno o más de estos servicios de proxy de API en el entorno de ejecución. Esto se debe a que las entidades, como los KeyValueMaps, los tokens de acceso OAuth, los productos de API, las apps para desarrolladores, los desarrolladores, las claves de consumidor, etc., contienen información útil en forma de pares clave-valor, atributos personalizados o parte de su perfil.

Por ejemplo, puedes almacenar la siguiente información en KeyValueMap para que sea más segura y accesible en el entorno de ejecución:

  • URLs de destino de backend
  • Propiedades de los entornos
  • Credenciales de seguridad de backend o sistemas de terceros

Del mismo modo, es posible que quieras obtener la lista de productos de API o la dirección de correo electrónico del desarrollador en el entorno de ejecución. Esta información estará disponible como parte del perfil de apps de desarrollador.

Toda esta información se puede usar de manera eficaz en el entorno de ejecución para habilitar el comportamiento dinámico en las políticas o el código personalizado dentro de Apigee Edge.

Antipatrón

Se prefieren las APIs de administración y son útiles para las tareas administrativas y no deben usarse con el fin de realizar lógicas de entorno de ejecución en el flujo de proxies de API. Esto se debe a los siguientes motivos:

  • El uso de las APIs de administración para acceder a información sobre las entidades, como KeyValueMaps, tokens de acceso de OAuth o para cualquier otro propósito desde proxies de API, genera dependencia de los servidores de administración.
  • Los servidores de administración no forman parte del componente del entorno de ejecución de Edge y, por lo tanto, es posible que no tengan alta disponibilidad.
  • Es posible que los servidores de administración no se aprovisionen dentro de la misma red o centro de datos y, por lo tanto, pueden ingresar latencias de red en el entorno de ejecución.
  • Las entradas en los servidores de administración se almacenan en caché por un período más largo, por lo que es posible que no puedas ver los datos más recientes de inmediato en los proxies de API si realizas operaciones de escritura y lectura en un período corto.
  • Aumenta los saltos de red en el entorno de ejecución.

En la siguiente muestra de código, la llamada a la API de administración se realiza a través del código JavaScript personalizado para recuperar la información de KeyValueMap:

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

Si el servidor de administración no está disponible, el código JavaScript que invoca la llamada a la API de administración falla. Esto provoca que la solicitud a la API falle.

Impacto

  • Genera dependencia adicional de los servidores de administración durante el tiempo de ejecución. Cualquier falla en los servidores de administración afectará las llamadas a la API.
  • Las credenciales de usuario para las APIs de administración deben almacenarse de forma local o en algún almacenamiento seguro como un KVM encriptado.
  • Consecuencias para el rendimiento debido a la invocación del servicio de administración por medio de la red
  • Es posible que no veas los valores actualizados de inmediato debido al vencimiento más largo de la caché en los servidores de administración.

Práctica recomendada

Existen formas más eficaces de recuperar información de entidades como KeyValueMaps, productos de API, aplicaciones de desarrolladores, desarrolladores, claves de consumidor, etc. en el entorno de ejecución. Estos son algunos ejemplos:

  • Usa una política KeyValueMapOperations para acceder a la información de los KeyValueMaps. A continuación, se muestra un código de muestra que indica cómo recuperar información de 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>
  • Para acceder a la información sobre productos de API, apps para desarrolladores, desarrolladores, claves de consumidor, etc. en el proxy de API, puedes realizar una de las siguientes acciones:
    • Si tu flujo de proxy de API tiene una política VerifyAPIKey, puedes acceder a la información mediante las variables de flujo propagadas como parte de esta política. A continuación, se muestra un código de muestra que indica cómo recuperar la información de nombre y created_by de una app de desarrolladores mediante JavaScript:
      <!-- /antipatterns/examples/2-7.xml -->
      print("Application Name ", context.getVariable(""verifyapikey. VerifyAPIKey.app.name"));
      print("Created by:", context.getVariable("verifyapikey. VerifyAPIKey.app.created_by"));
    • Si tu flujo de proxy de API no tiene una política VerifyAPIKey, puedes acceder a los perfiles de productos de API, apps de desarrollador, etc. con las políticas Entidad de acceso y Extraer variables políticas:
      1. Recupera el perfil de DeveloperApp con la política 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. Extrae el appId de DeveloperApp con la política ExtractVariables:
        <!-- /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>

Lecturas adicionales