AWS SAM. Haciendo serverless como un campeón

Gerardo Lopez Falcón
6 min readJun 8, 2020

Las tecnologías serverless como AWS Lambda y API Gateway son el siguiente paso lógico en la evolución de la nube. La utilización completa y el mantenimiento simplificado hacen que valga la pena considerar las tecnologías sin servidor para su próxima aplicación.

Pero hay un problema: en AWS, la infraestructura es código (código CloudFormation (CFN), para ser precisos) y esto puede salirse un poco de control cuando utiliza servicios como Lambda y API Gateway. Estos deben estar vinculados entre sí y también necesitan permisos granulares a través de IAM. Esta fue la razón de la creación de SAM, una extensión para CFN que elimina gran parte del boilerplate necesario para configurar una aplicación sin servidor. También viene con una herramienta de interfaz de línea de comandos (CLI) que ayuda con la depuración y la implementación local.

La última versión de SAM incluye dominios personalizados para API Gateway utilizando una cola SQS existente para eventos SNS y propagación de etiquetas de funciones Lambda generadas a sus correspondientes funciones de IAM.

Introducción a la AWS SAM CLI en Linux

AWS SAM CLI es una herramienta de línea de comandos de código abierto escrita en Python y su código fuente se puede encontrar en GitHub. Utiliza contenedores Docker en segundo plano para simular el entorno de tiempo de ejecución AWS Lambda localmente para acelerar la depuración y las pruebas. En Linux y macOS puede instalarlo con el administrador de paquetes Homebrew.

Para instalar el CLI de SAM, necesitaremos lo siguiente:

  • Cuenta de AWS
  • Usuario administrador de IAM
  • Docker
  • Homebrew

El CLI se instala a través de Homebrew con los siguientes comandos:

$ brew tap aws/tap
$ brew install aws-sam-cli

Después de la instalación, la CLI debería estar disponible a través del comando sam.

Crear una aplicación SAM de ejemplo

Puedes probar la CLI instalada inicializando un nuevo proyecto con el siguiente comando:

sam init

Elija el 1 para las “Plantillas de inicio rápido” y el 1 nuevamente para el “Tiempo de ejecución de Node.js” y use el nombre predeterminado.

Esto inicializará una aplicación SAM de ejemplo, cuya parte principal es el archivo sam-app / template.yaml. En este archivo, podemos ver que solo se define un recurso CFN, una función Lambda. La definición se parece a esto:

HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello-world/
Handler: app.lambdaHandler
Runtime: nodejs12.x
Events:
HelloWorld:
Type: Api
Properties:
Path: /hello
Method: get

Estas líneas le indican que tu función Lambda utiliza el runtime “Node.js versión 12.x” y que esta función se activa mediante un evento de tipo Api, lo que esencialmente significa que API Gateway activa su función Lambda cuando recibe una solicitud HTTP. La función también podría ser activada por un tipo diferente de evento, como una carga S3 o un temporizador CloudWatch.

CodeUri y Handler le dicen que el código de función se encuentra dentro del archivo hello-world /app.js, que debe tener una exportación con nombre llamada lambdaHandler. Esta es la parte de la plantilla que vincula la definición de recursos SAM con el código JavaScript real.

Dentro del directorio sam-app, ahora podemos ejecutar los comandos de compilación e implementación para llevar nuestra aplicación a la nube de AWS.

sam build
sam deploy --guided

Debes responder “sí” a todas las preguntas para que el comando de implementación pueda crear roles de IAM en su cuenta. Es recomendable utilizar una región cercana a usted.

SAM CLI creará más recursos CFN que solo la función Lambda. Esta función se configuró para ser activada por un evento API Gateway, por lo que también crea un recurso API Gateway y el recurso API Gateway Stage correspondiente. Además, creará permisos de Lambda y recursos de roles de IAM para que API Gateway pueda llamar a su función Lambda correctamente.

La plantilla de aplicación SAM de ejemplo también salió de la caja con algunas salidas. Una de ellas es la URL del endpoint de API Gateway, que se muestra después de que finaliza la implementación.

Dado que la función Lambda se activa mediante una solicitud HTTP GET a esa URL, puede probar la implementación de inmediato con una solicitud cURL:

curl \
https://<API_ID>.execute-api.<REGION>.amazonaws.com/Prod/hello/

Este comando debería generar algo como el siguiente JSON:

{"message": "hello world"}

También puedes ejecutar la función Lambda localmente con el comando de invocación local junto con un archivo JSON de evento predefinido.

sam invoke local “HelloWorldFunction” -e events / event.json

Cuando ejecuta el comando por primera vez, Docker descargará la imagen del contenedor `lambci / lambda: nodejs12.x` que AWS le proporciona.

La idea aquí es que un evento que activa una función Lambda en AWS generalmente viene con datos de eventos como JSON. Si ejecuta la función localmente, debe proporcionar esta información de evento manualmente en forma de un archivo JSON. AWS SAM creó un evento JSON cuando inicializó el proyecto, y podemos usarlo para este propósito.

El resultado se ve diferente del resultado que obtuvo al usar cURL.

Primero, obtiene información de tiempo de ejecución: cuánto tiempo se ejecutó la función y cómo se facturaría si realmente se ejecutara en la infraestructura de AWS.

Duration: 4.58 ms
Billed Duration: 100 ms

Pero también obtienes el valor de retorno real de su función de JavaScript, que se ve así:

{"statusCode":200,"body":"{\"message\":\"hello world\"}"}

API Gateway usó la propiedad statusCode para agregar el código de estado HTTP correcto a la respuesta que generó para su solicitud. El contenido de la propiedad del cuerpo es lo que vimos cuando accedimos a la API a través de cURL.

Comandos importantes de la CLI de SAM

La CLI de SAM tiene muchos comandos y subcomandos que manejan la construcción, prueba, implementación, depuración y más. Aquí están los cuatro más importantes:

sam init

El comando init es el primer comando ejecutado. Crea una nueva aplicación SAM al permitirle elegir entre diferentes plantillas base para minimizar el código repetitivo que tiene que escribir para comenzar. Las plantillas proporcionadas por AWS para los diferentes tiempos de ejecución a menudo vienen con una función Lambda de hello world que se activa mediante un evento API Gateway.

sam build

El comando de compilación reunirá todas las dependencias requeridas por el código de función Lambda. Para algunos tiempos de ejecución, también compilará los binarios finales que se cargarán a AWS Lambda.

El comando de compilación también debe ejecutarse antes de ejecutar la función Lambda localmente mediante el comando de invocación local.

sam deploy

El comando de implementación convertirá la plantilla SAM en una plantilla CFN y la cargará, junto con el otro código, a S3. Luego usará CFN para implementar todos los activos en la infraestructura de AWS.

El comando de despliegue viene con un parámetro guiado que ayuda con el primer despliegue.

invocación local de sam

El comando de invocación local se usa para ejecutar el código de función Lambda localmente dentro de un contenedor Docker.

Si bien esto es útil para los ciclos de desarrollo de alta velocidad, este comando puede ser un poco complicado porque no incluye ningún permiso cuando ejecuta su código. A menudo, los permisos pueden ser bastante problemáticos cuando se desarrollan aplicaciones sin servidor. Debería haber tan pocos como sea posible, pero cuando hay muy pocos, ya nada funciona.

Ahorro de tiempo con AWS SAM

El uso de AWS SAM para el desarrollo de aplicaciones sin servidor ahorra mucho tiempo al eliminar gran parte de la plantilla que requieren las plantillas CFN. Extiende CFN con nuevos tipos de recursos que siguen las mejores prácticas de AWS y son más cómodos de usar. La CLI de SAM también genera código basado en plantillas que están disponibles en línea.

Espero que este blog sirva para incorporase más a SAM en AWS, la verdad me gusta cuanto tiempo me ahorra al crear muchas cosas por mí, ahora es importante conocer como funciona Cloud formation antes de aventurarte a SAM, ya que SAM hará muchas cosas por tí usando cloud formation, eso podría limitarte bastante los fundamentos básicos de crear infraestructura en AWS.

Nos vemos, gracias por seguir y compartir.

--

--

Gerardo Lopez Falcón

Google Developer Expert & Sr Software Engineer & DevOps &. Soccer Fan