Blog de Amazon Web Services (AWS)

Trabaje con Amazon API Gateway y los alias de AWS Lambda

Por Raphael Lima, Arquitecto de Soluciones, sector comercial e
Leonardo Piedade, Arquitecto de Soluciones, DNB/ISV

 

Siempre que hablamos del desarrollo de Aplicaciones Modernas , es importante destacar algunas características que ayudan a aumentar la velocidad de entrega de software y también traer nuevas posibilidades a los desarrolladores. La característica principal de este tipo de aplicaciones es el desacoplamiento, al desacoplar las capas de nuestra aplicación podemos tener más control en cada uno de los componentes involucrados. En este post hablaremos de cómo podemos evolucionar el código de nuestras aplicaciones Lambda sin tener que cambiar los endpoints que están siendo consumidos por nuestros clientes API. Esta técnica es útil en otros casos de uso como usar canary como estrategia de publicación e incluso implementar pruebas A/B en sus API.

Para implementar esta técnica, utilizaremos algunas características de Amazon API Gateway y AWS Lambda.

API Gateway le permite crear varias etapas, donde puede definir cada etapa como un entorno diferente, por ejemplo, DEV, HOM y PRD. Esta funcionalidad le permite publicar sus API gradualmente, lo que aporta un mayor control en el proceso de entrega del software desde el momento en que se desarrolla hasta el momento en que está disponible para su uso en producción.

De forma predeterminada, API Gateway utiliza la última versión de Lambda para poder realizar solicitudes, esta versión se conoce como LATEST. Si el desarrollador realiza un cambio en Lambda que está en el entorno de producción, este cambio se refleja inmediatamente en el entorno y si el código no cumple con los requisitos del negocio o tiene cualquier otro BUG (error de código), el cliente puede verse afectado. Para resolver este problema utilizamos el control de versiones de las funciones de Lambda. Junto con los alias de AWS Lambda, puede equilibrar diferentes versiones de su código, lo que hace que el proceso de entrega de software sea más seguro y fiable. Por ejemplo, puede publicar una nueva versión de la aplicación y enviarle solo el 10% de las solicitudes y evaluar el resultado; y como los resultados son satisfactorios, puede aumentar esta tasa al 100% y tener todas las solicitudes satisfechas por la nueva versión de la aplicación.

En este post, se le presentará:

  • Parte I: Creación de una función Lambda y su Alias;
  • Parte II: Creación de una nueva versión de la función Lambda;
  • Parte III: Publicar en API Gateway;
  • Parte IV: Configuración de etapas y variables de etapa en API Gateway;
  • Parte V: Pruebas de Múltiples Etapas y Versiones Lambda.

 

Parte I: Creación de una función Lambda y su Alias

  1. Vaya a AWS Lambda Service Console: https://console.aws.amazon.com/lambda/
  2. Haga clic en «Crear función»;
  3. Mantenga seleccionada la opción «Autor desde cero»;
  4. Introduzca un nombre para su función en el campo «nombre de la función»;
  5. Cambie el «Runtime» a Python 3.8;
  6. Haga clic de nuevo en «Crear función».

 

  1. Una vez creada la función Lambda, haga clic en «Acciones» y «Crear alias»

 

  1. Crear alias con el nombre «dev» apuntando a la versión $LATEST

 

  1. Crear un segundo alias con el nombre «prod» apuntando a la versión $LATEST

 

Con esto tendrás dos alias creados, que dirigen a la ejecución de la última versión de tu función Lambda $LATEST

 

Parte II: Creación de una nueva versión de la función Lambda

Ahora vamos a simular un flujo de desarrollo para nuestra función Lambda y gateway API. En este momento nuestro alias deprod y dev apuntan a «$LATEST».

  1. Ahora tenemos que crear una versión para nuestra Lambda, y asignarla al alias “prod”. Seleccione la opción «Acciones» y luego la opción «Publicar nueva versión».

 

2. En la siguiente pantalla, introduzca una descripción que identifique su versión y haga clic en «Publicar»

3. Ahora se le dirigirá a la pantalla de la función en la versión creada.
Nota: Para cada versión creada, el ID de versión se incrementa en 1.

Necesitamos diferenciar la versión de la función utilizada por cada Alias que fueron creados.

4. Haga clic en la opción «Versión», seleccione la pestaña «alias» y luego haga clic en «prod».

 

5. Ahora en el alias de prod, vaya a «configuración de alias» y haga clic en «editar».

 

6. En la siguiente pantalla, seleccione la versión creada y haga clic en «Guardar»

 

7. Ahora vamos a cambiar el código de la función. Seleccione la versión $LATEST de nuevo haciendo clic en la opción «Alias: prod», seleccione la pestaña «Versiones» y elija la opción «$LATEST».

 

8. Más abajo, edite el siguiente código y haga clic en «Implementar»

 

import json

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': json.dumps('Hello World!')
    }

 

El resultado son dos Alias de Lambda, cada Alias dirigiendo a una versión de la función:

 

Parte III: Publicar en API Gateway

  1. Acceso al servicio API Gateway: https://console.aws.amazon.com/apigateway/
  2. Haga clic en «Crear API»
  3. Elija «REST API» y haga clic en «Construir»

 

  1. Elija el nombre de la API y haga clic en «Crear API»

 

  1. Haga clic en «Acciones» para crear una nueva ruta en API Gateway integrándose con Lambda. Utilice $ {stageVariables.lambdaAlias} para apuntar al Alias de selección de entorno.

 

 

  1. Al hacer clic en «Guardar», aparece un mensaje para Agregar permiso en AWS Lambda para ejecutar la puerta de enlace, como se indica a continuación:

 

7. Usando awscli, simplemente ejecute el siguiente comando reemplazando los valores apropiados de tu cuenta para cada alias de tu función Lambda.

 

aws lambda add-permission --function-name "arn:aws:lambda:us-east-1:<account-number>:function:HelloWorld:dev" --source-arn "arn:aws:execute-api:us-east-1:<account-number>:<apigw-id>/*/GET/v1/hello" --principal apigateway.amazonaws.com --statement-id <statement-id> —action lambda:InvokeFunction

aws lambda add-permission --function-name "arn:aws:lambda:us-east-1:<account-number>:function:HelloWorld:prod" --source-arn "arn:aws:execute-api:us-east-1:<account-number>:<apigw-id>/*/GET/v1/hello" --principal apigateway.amazonaws.com --statement-id <statement-id> —action lambda:InvokeFunction

 

Parte IV: Configuración de variables de etapa y etapa en API Gateway

Para que el extremo (endpoint) sea accesible, debe crear una etapa y publicarla. Para esto:

  1. En API Gateway, haga clic en la opción «Acciones» en «Recursos», luego seleccione la opción «Implementar API».
  2. Elija «Nueva etapa», escriba «dev» en «Nombre del escenario» y la descripción de la etapa y la implementación y, a continuación, haga clic en «Implementar».

 

  1. Para que API funcione con el alias de la función Lambda, debe agregar la variable LambdaAlias con el valor «dev» en Variables de etapa. Vaya a «Stages» y cliente en la pestaña «Variables de escenario» como se muestra en la imagen:

 

  1. Es necesario crear la etapa de prod. Vaya a «Stages» y haga clic en «Crear», bajo «Nombre del escenario», escriba «prod».

 

  1. Realice el mismo procedimiento para agregar la variable LambdaAlias con el valor «prod» en Variables de etapa.

 

En este punto, cada etapa se dirige a un Alias de Lambda y cada uno tiene un endpoint específico publicado en API Gateway.

 

 

Parte V: Pruebas de las múltiples etapas y versiones de la función Lambda

Ahora que la API está correctamente configurada, con cada etapa apuntando a su alias respectivo en la función Lambda, puede elegir una de las etapas creadas y copiar el enlace desde la URL de su gateway.

Para probar añadimos la ruta creada, en este caso /v1/hello

Pruebe el extremo de API en API Gateway en la etapa dedesarrollo

Pruebe el punto final de API en API Gateway en la etapa de prod

 

Conclusión

El uso de Alias de AWS Lambda le permite controlar mejor el uso de cada una de las versiones de sus funciones de Lambda. El uso de varias versiones de Lambda junto con Amazon API Gateway Stages simplifica la publicación en varios entornos, lo que permite el ciclo de vida de las aplicaciones y aporta mayor madurez al proceso de ingeniero de software.

 

 


Sobre el autor

Raphael Lima es Arquitecto de Soluciones en AWS con más de 10 años trabajando con infraestructura, DevOps, arquitectura de microservicios, sin servidor y seguridad. Trabaja con clientes empresariales, ayudándoles en su viaje a la nube.

 

 

 

Leonardo Piedade es Arquitecto de Soluciones en AWS. Ha trabajado durante más de 15 años en desarrollo de software. Entusiasta de la plataforma Java y las tecnologías Blockchain. Actualmente trabaja con un enfoque en aplicaciones distribuidas y arquitecturas sin servidor.