Creación de una aplicación con entrega continua en la consola de Lambda - AWS Lambda

Creación de una aplicación con entrega continua en la consola de Lambda

Puede utilizar la consola de Lambda para crear una aplicación con una canalización de entrega continua integrada. Con la entrega continua, cada cambio que se envía al repositorio de control de código fuente desencadena una canalización que genera e implementa la aplicación automáticamente. La consola de Lambda proporciona proyectos de inicio para tipos de aplicaciones comunes con código de ejemplo Node.js y plantillas que crean recursos de soporte.

En este tutorial, se crean los recursos siguientes.

  • Aplicación: una función de Node.js de Lambda, especificación de compilación y plantilla de Modelo de aplicación sin servidor de AWS (AWS SAM).

  • Canalización: una canalización de AWS CodePipeline que conecta los demás recursos para habilitar la entrega continua.

  • Repository (Repositorio): repositorio de Git en AWS CodeCommit. Cuando se envía un cambio, la canalización copia el código fuente en un bucket de Amazon S3 y se lo pasa al proyecto de compilación.

  • Disparador: –una regla de Amazon CloudWatch Events que vigila la rama principal del repositorio y activa la canalización.

  • Proyecto de compilación: compilación de AWS CodeBuild que obtiene el código fuente de la canalización y empaqueta la aplicación. El código fuente incluye una especificación de compilación con comandos que instalan las dependencias y preparan una plantilla de la aplicación para la implementación.

  • Configuración de implementación: la etapa de implementación de la canalización define un conjunto de acciones que toman la plantilla procesada de AWS SAM de la salida de compilación e implementan la nueva versión con AWS CloudFormation.

  • Bucket: un bucket de Amazon Simple Storage Service (Amazon S3) para el almacenamiento de artefactos de implementación.

  • Roles: las etapas de origen, compilación e implementación de la canalización tienen roles de IAM que les permiten administrar recursos de AWS. La función de la aplicación tiene un rol de ejecución que le permite cargar registros y se puede ampliar para acceder a otros servicios.

Los recursos de la aplicación y la canalización se definen en plantillas de AWS CloudFormation que se pueden personalizar y ampliar. El repositorio de aplicaciones incluye una plantilla que puede modificar para agregar tablas de Amazon DynamoDB, una API de Amazon API Gateway y otros recursos de aplicación. La canalización de entrega continua se define en una plantilla separada fuera del control de origen y tiene su propia pila.

La canalización asigna una única ramificación de un repositorio a una única pila de aplicación. Puede crear canalizaciones adicionales para agregar entornos para otras ramificaciones del mismo repositorio. También puede añadir etapas a la canalización para pruebas, ensayo y las aprobaciones manuales. Para obtener más información sobre AWS CodePipeline, consulte ¿Qué es AWS CodePipeline?.

Requisitos previos

En este tutorial, se le presuponen algunos conocimientos sobre las operaciones básicas de Lambda y la consola de Lambda. Si aún no lo ha hecho, siga las instrucciones que se indican en Introducción a Lambda para crear la primera función Lambda.

Para completar los siguientes pasos, necesita un terminal de línea de comandos o shell para ejecutar comandos. Los comandos y la salida esperada se muestran en bloques separados:

aws --version

Debería ver los siguientes datos de salida:

aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64

Para los comandos largos, se utiliza un carácter de escape (\) para dividir un comando en varias líneas.

En Linux y macOS, use su administrador de shell y paquetes preferido. En Windows 10, puede instalar Windows Subsystem para Linux para obtener una versión de Ubuntu y Bash integrada con Windows.

Este tutorial utiliza CodeCommit para el control de código fuente. Para configurar el equipo local para acceder y actualizar el código de la aplicación, consulte Configuración en la Guía del usuario de AWS CodeCommit.

Cree una aplicación

Cree una aplicación en la consola de Lambda. En Lambda, una aplicación es una pila de AWS CloudFormation con una función Lambda y cualquier cantidad de recursos de soporte. En este tutorial, creará una aplicación que tenga una función y su rol de ejecución.

Para crear una aplicación

  1. Abra la página Applications (Aplicaciones) de la consola de Lambda.

  2. Elija Create application.

  3. Elija Author from scratch.

  4. Configure los ajustes de la aplicación.

    • Nombre de la aplicación: my-app.

    • Tiempo de ejecución: Node.js 10.x.

    • Servicio de control de origen: CodeCommit.

    • Nombre del repositorio: my-app-repo.

    • Permisos: Crear roles y límite de permisos.

  5. Seleccione Create.

Lambda crea la canalización y los recursos relacionados y confirma el código de la aplicación de muestra en el repositorio de Git. A medida que se crean los recursos, aparecen en la página de información general.


        Recursos de aplicaciones de inicio durante la implementación.

La pila Infraestructura contiene el repositorio, el proyecto de compilación y otros recursos que se combinan para formar una canalización de entrega continua. Cuando esta pila termina de implementarse, a su vez implementa la pila de aplicación que contiene la función y el rol de ejecución. Estos son los recursos de la aplicación que aparecen en Recursos.

Describe cómo invocar la función.

Cuando finalice el proceso de implementación, invoque la función desde la consola de Lambda.

Invocación de la función de la aplicación

  1. Abra la página Applications (Aplicaciones) de la consola de Lambda.

  2. Seleccione my-app.

  3. En Resources (Recursos), elija helloFromLambdaFunction.

  4. Elija Test.

  5. Configure un evento de prueba.

    • Nombre del evento: event

    • Body (Cuerpo): {}

  6. Seleccione Create.

  7. Elija Test.

La consola de Lambda ejecuta la función y muestra el resultado. Expanda la sección Details (Detalles) debajo del resultado para ver los detalles de salida y ejecución.


        Salida de una invocación de prueba.

Agregar un recurso de AWS

En el paso anterior, la consola de Lambda creó un repositorio de Git que contiene código de función, una plantilla y una especificación de compilación. Puede añadir recursos a la aplicación modificando la plantilla y enviando los cambios al repositorio. Para obtener una copia de la aplicación en su equipo local, clone el repositorio.

Para clonar el repositorio del proyecto

  1. Abra la página Applications (Aplicaciones) de la consola de Lambda.

  2. Seleccione my-app.

  3. Seleccione Code (Código).

  4. En Repository details (Detalles del repositorio), copie el URI del repositorio HTTP o SSH, en función del modo de autenticación que haya configurado durante la configuración.

  5. Para clonar el repositorio, utilice el comando git clone.

    git clone ssh://git-codecommit.us-east-2.amazonaws.com/v1/repos/my-app-repo

Para agregar una tabla de DynamoDB a la aplicación, defina un recurso de AWS::Serverless::SimpleTable en la plantilla.

Para agregar una tabla de DynamoDB

  1. Abra template.yml en un editor de texto.

  2. Agregue un recurso de tabla, una variable de entorno que transmita el nombre de la tabla a la función y una política de permisos que permita administrarla a la función.

    ejemplo template.yml - Recursos

    ... Resources: ddbTable: Type: AWS::Serverless::SimpleTable Properties: PrimaryKey: Name: id Type: String ProvisionedThroughput: ReadCapacityUnits: 1 WriteCapacityUnits: 1 helloFromLambdaFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./ Handler: src/handlers/hello-from-lambda.helloFromLambdaHandler Runtime: nodejs10.x MemorySize: 128 Timeout: 60 Description: A Lambda function that returns a static string. Environment: Variables: DDB_TABLE: !Ref ddbTable Policies: - DynamoDBCrudPolicy: TableName: !Ref ddbTable - AWSLambdaBasicExecutionRole
  3. Confirmar y enviar el cambio.

    git commit -am "Add DynamoDB table" git push

Cuando se envía un cambio, se activa la canalización de la aplicación. Utilice la pestaña Deployments (Implementaciones) de la pantalla de la aplicación para realizar un seguimiento del cambio a medida que se transmite a través de la canalización. Una vez finalizada la implementación, continúe en el siguiente paso.


        Supervisión de una implementación de aplicaciones en la consola Lambda.

Actualizar el límite de permisos

La aplicación de ejemplo aplica un límite de permisos al rol de ejecución de su función. El límite de permisos limita los permisos que puede agregar al rol de la función. Sin el límite, los usuarios con acceso de escritura al repositorio del proyecto podrían modificar la plantilla del proyecto para dar permiso a la función para acceder a recursos y servicios fuera del ámbito de la aplicación de muestra.

Para que la función utilice el permiso de DynamoDB que agregó a su rol de ejecución en el paso anterior, debe extender el límite de permisos para permitir los permisos adicionales. La consola de Lambda detecta recursos que no están en el límite de permisos y proporciona una directiva actualizada que puede usar para actualizarla.

Para actualizar el límite de permisos de la aplicación

  1. Abra la página Applications (Aplicaciones) de la consola de Lambda.

  2. Elija su aplicación.

  3. En Resources (Recursos), elija Edit permissions boundary (Editar límite de permisos).

  4. Siga las instrucciones que se muestran para actualizar el límite y permitir el acceso a la nueva tabla.

Para obtener más información sobre los límites de permisos, consulte Uso de límites de permisos para aplicaciones de AWS Lambda.

Actualizar el código de la función

A continuación, actualice el código de función para usar la tabla. El siguiente código utiliza la tabla de DynamoDB para realizar un seguimiento del número de invocaciones procesadas por cada instancia de la función. Utiliza el ID de flujo de registro como identificador único para la instancia de la función.

Para actualizar el código de la función

  1. Agregue un nuevo controlador denominado index.js a la carpeta src/handlers con el siguiente contenido.

    ejemplo src/handlers/index.js

    const dynamodb = require('aws-sdk/clients/dynamodb'); const docClient = new dynamodb.DocumentClient(); exports.handler = async (event, context) => { const message = 'Hello from Lambda!'; const tableName = process.env.DDB_TABLE; const logStreamName = context.logStreamName; var params = { TableName : tableName, Key: { id : logStreamName }, UpdateExpression: 'set invocations = if_not_exists(invocations, :start) + :inc', ExpressionAttributeValues: { ':start': 0, ':inc': 1 }, ReturnValues: 'ALL_NEW' }; await docClient.update(params).promise(); const response = { body: JSON.stringify(message) }; console.log(`body: ${response.body}`); return response; }
  2. Abra la plantilla de la aplicación y cambie el valor del controlador a src/handlers/index.handler.

    ejemplo template.yml

    ... helloFromLambdaFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./ Handler: src/handlers/index.handler Runtime: nodejs10.x
  3. Confirmar y enviar el cambio.

    git add . && git commit -m "Use DynamoDB table" git push

Después de implementar el cambio de código, invoque la función varias veces para actualizar la tabla DynamoDB.

Para ver la tabla DynamoDB

  1. Abra la página Tables (Tablas) de la consola de DynamoDB.

  2. Elija la tabla que comienza por my-app.

  3. Seleccione Items (Elementos).

  4. Haga clic en Start search (Iniciar búsqueda).


        Una tabla de DynamoDB que muestra el número de veces que una instancia de una función ha procesado un evento.

Lambda crea instancias adicionales de su función para manejar múltiples invocaciones simultáneas. Cada flujo de registro en el grupo de registros de CloudWatch Logs corresponde a una instancia de función. También se crea una nueva instancia de función cuando se cambia el código o la configuración de la función. Para obtener más información sobre el escalado, consulte Escalado de funciones de AWS Lambda.

Pasos siguientes

La plantilla de AWS CloudFormation que define los recursos de la aplicación utiliza la transformación de Modelo de aplicación sin servidor de AWS para simplificar la sintaxis de las definiciones de recursos y automatizar la carga del paquete de implementación y otros artefactos. AWS SAM también proporciona una interfaz de línea de comandos (la CLI de AWS SAM), que tiene la misma funcionalidad de empaquetado e implementación que la AWS CLI, con características adicionales específicas para las aplicaciones Lambda. Utilice la CLI de AWS SAM para probar su aplicación localmente en un contenedor Docker que emula el entorno de ejecución de Lambda.

AWS Cloud9 proporciona un entorno de desarrollo online que incluye Node.js, la CLI de AWS SAM y Docker. Con AWS Cloud9, puede comenzar a desarrollar rápidamente y acceder a su entorno de desarrollo desde cualquier equipo. Para obtener instrucciones, consulte Introducción en la Guía del usuario de AWS Cloud9.

Para el desarrollo local, los conjuntos de herramientas de AWS para entornos de desarrollo integrados (IDE) permiten probar y depurar funciones antes de llevarlas a su repositorio.

Solución de problemas

A medida que desarrolle su aplicación, es probable que encuentre los siguientes tipos de errores.

  • Errores de compilación: problemas que se producen durante la fase de compilación, incluidos errores de compilación, prueba y empaquetado.

  • Errores de implementación: problemas que se producen cuando AWS CloudFormation no puede actualizar la pila de aplicaciones. Estos incluyen errores de permisos, cuotas de cuenta, problemas de servicio o errores de plantilla.

  • Errores de invocación: errores devueltos por el código o tiempo de ejecución de una función.

Para errores de compilación e implementación, puede identificar la causa de un error en la consola de Lambda.

Para solucionar errores de aplicación

  1. Abra la página Applications (Aplicaciones) de la consola de Lambda.

  2. Elija una aplicación.

  3. Elija Deployments (Implementaciones).

  4. Para ver la canalización de la aplicación, elija Deployment pipeline (Canalización de implementación).

  5. Identifique la acción que encontró un error.

  6. Para ver el error en contexto, elija Details (Detalles).

Para los errores de implementación que se producen durante la acción ExecuteChangeSet, la canalización se vincula a una lista de eventos de pila en la consola de AWS CloudFormation. Busque un evento con el estado UPDATE_FAILED. Dado que AWS CloudFormation vuelve al estado anterior después de un error, el evento pertinente está debajo de otros eventos en la lista. Si AWS CloudFormation no pudo crear un conjunto de cambios, el error aparece en Change sets (Conjuntos de cambios) en lugar de en Events (Eventos).

Una causa común de errores de implementación e invocación es la falta de permisos en uno o más roles. La canalización tiene un rol para implementaciones (CloudFormationRole) equivalente a los permisos de usuario que utilizaría para actualizar una pila de AWS CloudFormation directamente. Si agrega recursos a la aplicación o habilita características de Lambda que requieren permisos de usuario, se utiliza el rol de implementación. Puede encontrar un vínculo al rol de implementación en Infrastructure (Infraestructura) en la información general de la aplicación.

Si su función accede a otros servicios o recursos de AWS, o si habilita las características que requieren que la función tenga permisos adicionales, se utilizará el rol de ejecución de la función. Todos los roles de ejecución que se crean en la plantilla de aplicación también están sujetos al límite de permisos de la aplicación. Este límite requiere que conceda explícitamente acceso a servicios y recursos adicionales en IAM después de agregar permisos al rol de ejecución en la plantilla.

Por ejemplo, para conectar una función a una nube privada virtual (VPC), necesita permisos de usuario para describir los recursos de VPC. El rol de ejecución necesita permiso para administrar interfaces de red. Esto requiere los siguientes pasos.

  1. Agregue los permisos de usuario necesarios al rol de implementación en IAM.

  2. Agregue los permisos de rol de ejecución al límite de permisos en IAM.

  3. Agregue los permisos de rol de ejecución a la función de ejecución en la plantilla de aplicación.

  4. Confirme e inserte para implementar el rol de ejecución actualizado.

Después de corregir los errores de permisos, elija Release change (Cambio de versión) en la información general de la canalización para volver a ejecutar la compilación y la implementación.

Eliminar recursos

Puede seguir modificando y utilizar la muestra para desarrollar su propia aplicación. Si ha terminado de usar la muestra, elimine la aplicación para evitar pagar por la canalización, el repositorio y el almacenamiento.

Para eliminar la aplicación

  1. Abra la consola de AWS CloudFormation.

  2. Elimine la pila de la aplicación – my-app.

  3. Abra la consola de Amazon S3.

  4. Elimine el bucket de artefacto: us-east-2-123456789012-my-app-pipe.

  5. Vuelva a la consola de AWS CloudFormation y elimine la pila de infraestructura: serverlessrepo-my-app-toolchain.

Los registros de la función no están asociados a la aplicación o la pila de infraestructura en AWS CloudFormation. Elimine el grupo de registro por separado en la consola de CloudWatch Logs.

Para eliminar el grupo de registros

  1. Abra la Log groups page (Página del grupo de registros) de la consola de Amazon CloudWatch.

  2. Elija el grupo de registros de la función (/aws/lambda/my-app-helloFromLambdaFunction-YV1VXMPLK7QK).

  3. Elija Actions (Acciones) y, a continuación, elija Delete log group (Eliminar grupo de registro).

  4. Elija Yes, Delete (Sí, eliminar).