Implementar funciones Node.js de Lambda con archivos de archivo.zip - AWS Lambda

Implementar funciones Node.js de Lambda con archivos de archivo.zip

El código de la función de AWS Lambda incluye un archivo .js o .mjs que contiene el código del controlador de la función, junto con los paquetes y módulos adicionales de los que depende el código. Para implementar este código de función en Lambda, se utiliza un paquete de despliegue. Este paquete puede ser un archivo de archivos .zip o una imagen de contenedor. Para obtener más información sobre el uso de imágenes de contenedores con Node.js, consulte Implementar funciones de Lambda Node.js con imágenes de contenedores.

Para crear un paquete de despliegue como un archivo de archivos .zip, puede emplear utilidad de archivado de archivos .zip incorporada de la herramienta de línea de comandos, o cualquier otra utilidad de archivos .zip, como 7zip. En los ejemplos que se muestran en las siguientes secciones se supone que está utilizando una herramienta zip de línea de comandos en un entorno Linux o macOS. Para utilizar los mismos comandos en Windows, puede instalar el Subsistema de Windows para Linux a fin de obtener una versión de Ubuntu y Bash integrada con Windows.

Tenga en cuenta que Lambda utiliza permisos de archivo de POSIX, por lo que puede necesitar establecer permisos para la carpeta del paquete de despliegue antes de crear el archivo de archivos .zip.

Dependencias de tiempo de ejecución en Node.js

Para las funciones de Lambda que utilizan el tiempo de ejecución de Node.js, una dependencia puede ser cualquier módulo Node.js. El tiempo de ejecución de Node.js incluye varias bibliotecas comunes, así como una versión de AWS SDK for JavaScript. El tiempo de ejecución nodejs16.x de Lambda incluye la versión 2.x del SDK. Las versiones de tiempo de ejecución nodejs18.x y las versiones posteriores incluyen la versión 3 del SDK. Para usar la versión 2 del SDK con las versiones en tiempo de ejecución nodejs18.x y posteriores, agregue el SDK a su paquete de implementación de archivos .zip. Si el tiempo de ejecución elegido incluye la versión del SDK que utiliza, no necesita incluir la biblioteca del SDK en el archivo .zip. Para saber qué versión del SDK se incluye en el tiempo de ejecución que está utilizando, consulte Versiones del SDK incluidas en el tiempo de ejecución.

Lambda actualiza de manera periódica las bibliotecas del SDK en el tiempo de ejecución de Node.js para incluir las características y actualizaciones de seguridad más recientes. Lambda también aplica parches y actualizaciones de seguridad a las demás bibliotecas incluidas en el tiempo de ejecución. Para tener el control total de las dependencias de un paquete, puede agregar la versión preferida de cualquier dependencia con tiempo de ejecución incluido al paquete de despliegue. Por ejemplo, si quiere utilizar una versión concreta del SDK para JavaScript, puede incluirla en el archivo .zip como una dependencia. Para obtener más información sobre cómo agregar dependencias con tiempo de ejecución incluido en el archivo .zip, consulte Ruta de búsqueda de dependencias y bibliotecas incluidas en tiempo de ejecución.

Según el modelo de responsabilidad compartida de AWS, usted es responsable de la administración de cualquier dependencia en los paquetes de despliegue de sus funciones. Esto incluye la aplicación de actualizaciones y parches de seguridad. Para actualizar las dependencias del paquete de despliegue de la función, primero cree un nuevo archivo .zip y, a continuación, cárguelo en Lambda. Para obtener más información, consulte Creación de un paquete de despliegue .zip con dependencias y Creación y actualización de funciones de Lambda Node.js mediante archivos .zip.

Creación de un paquete de despliegue .zip sin dependencias

Si el código de la función no tiene dependencias, excepto las bibliotecas incluidas en el tiempo de ejecución de Lambda, el archivo .zip solo contiene el archivo index.js o index.mjs con el código del controlador de la función. Utilice la utilidad de compresión que prefiera para crear un archivo .zip con el archivo index.js o index.mjs en la raíz. Si el archivo que contiene el código del controlador no está en la raíz del archivo .zip, Lambda no podrá ejecutar el código.

Para obtener información sobre cómo implementar un archivo .zip para crear una nueva función de Lambda o actualizar una existente, consulte Creación y actualización de funciones de Lambda Node.js mediante archivos .zip.

Creación de un paquete de despliegue .zip con dependencias

Si el código de la función depende de paquetes o módulos que no se encuentran incluidos en el tiempo de ejecución de Node.js de Lambda, puede agregar estas dependencias al archivo .zip con el código de la función o utilizar una capa de Lambda. En las instrucciones de esta sección, se muestra cómo incluir las dependencias en el paquete de despliegue .zip. Para obtener instrucciones sobre cómo incluir las dependencias en una capa, consulte Creación de una capa de Node.js para las dependencias.

Los siguientes comandos de la CLI crean un archivo .zip llamado my_deployment_package.zip, que contiene el archivo index.js o index.mjs con el código del controlador de la función y sus dependencias. En el ejemplo, las dependencias se instalan mediante el administrador de paquetes npm.

Creación del paquete de implementación
  1. Desplácese hasta el directorio del proyecto que contiene el archivo de código fuente index.js o index.mjs. En este ejemplo, el directorio se llama my_function.

    cd my_function
  2. Instale las bibliotecas necesarias de la función en el directorio node_modules mediante el comando npm install. En este ejemplo, instalará AWS X-Ray SDK para Node.js.

    npm install aws-xray-sdk

    De este modo, se crea una estructura de carpetas similar a la siguiente:

    ~/my_function ├── index.mjs └── node_modules ├── async ├── async-listener ├── atomic-batcher ├── aws-sdk ├── aws-xray-sdk ├── aws-xray-sdk-core

    También puede agregar módulos personalizados que cree usted mismo al paquete de despliegue. Cree un directorio en node_modules con el nombre del módulo y guarde los paquetes personalizados allí.

  3. Cree un archivo .zip con el contenido de la carpeta del proyecto en la raíz. Utilice la opción r (recursiva) para asegurarse de que el zip contiene las subcarpetas.

    zip -r my_deployment_package.zip .

Creación de una capa de Node.js para las dependencias

En las instrucciones de esta sección, se muestra cómo incluir las dependencias en una capa. Para obtener instrucciones sobre cómo incluir las dependencias en el paquete de implementación, consulte Creación de un paquete de despliegue .zip con dependencias.

Cuando agrega una capa a una función, Lambda carga el contenido de la capa en el directorio /opt de ese entorno de ejecución. Para cada tiempo de ejecución de Lambda, la variable PATH ya incluye rutas de carpeta específicas en el directorio /opt. Para garantizar que la variable PATH recoja el contenido de la capa, el archivo .zip de la capa, debe tener sus dependencias en las siguientes rutas de carpeta:

  • nodejs/node_modules

  • nodejs/node16/node_modules (NODE_PATH)

  • nodejs/node18/node_modules (NODE_PATH)

  • nodejs/node20/node_modules (NODE_PATH)

Por ejemplo, la estructura del archivo .zip de la capa podría tener el siguiente aspecto:

xray-sdk.zip └ nodejs/node_modules/aws-xray-sdk

Además, Lambda detecta de forma automática cualquier biblioteca en el directorio /opt/lib y todos los archivos binarios en el directorio /opt/bin. Para asegurarse de que Lambda encuentre el contenido de la capa de forma correcta, también puede crear una capa con la siguiente estructura:

custom-layer.zip └ lib | lib_1 | lib_2 └ bin | bin_1 | bin_2

Después de empaquetar la capa, consulte Creación y eliminación de capas en Lambda y Adición de capas a las funciones para completar la configuración de la capa.

Ruta de búsqueda de dependencias y bibliotecas incluidas en tiempo de ejecución

El tiempo de ejecución de Node.js incluye varias bibliotecas comunes, así como una versión de AWS SDK for JavaScript. Si quiere utilizar una versión diferente de una biblioteca con tiempo de ejecución incluido, puede agruparla con la función o agregarla como una dependencia en el paquete de despliegue. Por ejemplo, puede utilizar una versión diferente del SDK al agregarla al paquete de despliegue .zip. También puede incluirla en una capa de Lambda para la función.

Cuando utilice una instrucción import o require en el código, el tiempo de ejecución de Node.js buscará en los directorios, en la ruta NODE_PATH, hasta que encuentre el módulo. De forma predeterminada, la primera ubicación que busca el tiempo de ejecución es el directorio en el que se descomprime y monta el paquete de despliegue .zip (/var/task). Si incluye una versión de una biblioteca incluida en el tiempo de ejecución de su paquete de despliegue, esta versión tendrá prioridad sobre la versión incluida en el tiempo de ejecución. Las dependencias del paquete de despliegue también tienen prioridad sobre las dependencias de las capas.

Cuando agregue una dependencia a una capa, Lambda la extraerá en /opt/nodejs/nodexx/node_modules, donde nodexx representa la versión del entorno de ejecución utilizada. En la ruta de búsqueda, este directorio tiene prioridad sobre el directorio que contiene las bibliotecas incluidas en el tiempo de ejecución (/var/lang/lib/node_modules). Las bibliotecas de las capas de funciones tienen prioridad sobre las versiones incluidas en el tiempo de ejecución.

Para ver la ruta de búsqueda completa de la función de Lambda, agregue la siguiente línea de código.

console.log(process.env.NODE_PATH)

También puede agregar dependencias en una carpeta independiente dentro del paquete .zip. Por ejemplo, puede agregar un módulo personalizado a una carpeta del paquete .zip llamada common. Cuando descomprima y monte el paquete .zip, esta carpeta se colocará dentro del directorio /var/task. Para utilizar una dependencia de una carpeta en el paquete de despliegue .zip del código, utilice una instrucción import { } from o const { } = require(), según si utiliza una resolución de módulo CJS o ESM. Por ejemplo:

import { myModule } from './common'

Si agrupa el código con esbuild, rollup o similares, las dependencias utilizadas por la función se agrupan en uno o más archivos. Recomendamos utilizar este método para vender dependencias, siempre que sea posible. En comparación con el agregado de dependencias al paquete de despliegue, la agrupación del código mejora el rendimiento debido a la reducción de las operaciones de E/S.

Creación y actualización de funciones de Lambda Node.js mediante archivos .zip

Una vez que haya creado su paquete de implementación .zip, puede utilizarlo para crear una nueva función de Lambda o actualizar una existente. Puede implementar el paquete .zip a través de la consola, la AWS Command Line Interface y la API de Lambda. También puede crear y actualizar funciones de Lambda mediante AWS Serverless Application Model (AWS SAM) y AWS CloudFormation.

El tamaño máximo de un paquete de despliegue .zip para Lambda es de 250 MB (descomprimido). Tenga en cuenta que este límite se aplica al tamaño combinado de todos los archivos que cargue, incluidas las capas de Lambda.

El tiempo de ejecución de Lambda necesita permiso para leer los archivos del paquete de implementación. En la notación octal de permisos de Linux, Lambda necesita 644 permisos para archivos no ejecutables (rw-r--r--) y 755 permisos (rwxr-xr-x) para directorios y archivos ejecutables.

En Linux y macOS, utilice el comando chmod para cambiar los permisos de los archivos y directorios del paquete de implementación. Por ejemplo, para brindarle a un archivo ejecutable los permisos correctos, ejecute el siguiente comando.

chmod 755 <filepath>

Para cambiar los permisos de los archivos en Windows, consulte Set, View, Change, or Remove Permissions on an Object en la documentación de Microsoft Windows.

Creación y actualización de funciones con archivos .zip mediante la consola

Para crear una nueva función, primero debe crearla en la consola y, a continuación, cargar el archivo .zip. Para actualizar una función existente, abra la página de la función correspondiente y, a continuación, siga el mismo procedimiento para agregar el archivo .zip actualizado.

Si el archivo .zip tiene un tamaño inferior a 50 MB, puede crear o actualizar una función al cargarlo directamente desde su equipo local. Para archivos .zip de más de 50 MB, primero debe cargar su paquete en un bucket de Amazon S3. Para obtener instrucciones sobre cómo cargar un archivo en un bucket de Amazon S3 con la AWS Management Console, consulte Introducción a Amazon S3. Para cargar archivos mediante la AWS CLI, consulte Mover objetos en la Guía del usuario de la AWS CLI.

nota

No puede cambiar el tipo de paquete de implementación (.zip o imagen de contenedor) de una función existente. Por ejemplo, no se puede convertir una función de imagen de contenedor para utilizar un archivo .zip. Debe crear una nueva función.

Para crear una nueva función (consola)
  1. Abra la página Funciones de la consola de Lambda y elija Crear función.

  2. Elija Crear desde cero.

  3. En Información básica, haga lo siguiente:

    1. En Nombre de la función, escriba el nombre de la función.

    2. En Tiempo de ejecución, seleccione el tiempo de ejecución que desea utilizar.

    3. (Opcional) Para Arquitectura, elija la arquitectura del conjunto de instrucciones para su función. La arquitectura predeterminada es x86_64. Asegúrese de que el paquete de despliegue .zip para su función sea compatible con la arquitectura del conjunto de instrucciones que seleccione.

  4. (Opcional) En Permisos, expanda Cambiar función de ejecución predeterminada. Puede crear un nuevo Rol de ejecución o utilizar uno existente.

  5. Elija Crear función. Lambda crea una función básica “Hola, mundo” mediante el tiempo de ejecución elegido.

Para cargar un archivo .zip desde su equipo local (consola)
  1. En la página Funciones de la consola de Lambda, elija la función para la que desea cargar el archivo .zip.

  2. Seleccione la pestaña Código.

  3. En el panel Código fuente, elija Cargar desde.

  4. Elija un archivo .zip.

  5. Para cargar el archivo .zip, haga lo siguiente:

    1. Seleccione Cargar y, a continuación, seleccione su archivo .zip en el selector de archivos.

    2. Elija Abrir.

    3. Seleccione Guardar.

Carga de un archivo .zip desde un bucket de Amazon S3 (consola)
  1. En la página Funciones de la consola de Lambda, elija la función para la que desea cargar un nuevo archivo .zip.

  2. Seleccione la pestaña Código.

  3. En el panel Código fuente, elija Cargar desde.

  4. Elija la ubicación de Amazon S3.

  5. Pegue la URL del enlace de Amazon S3 de su archivo .zip y seleccione Guardar.

Actualización de las funciones del archivo .zip mediante el editor de código de la consola

Para algunas funciones con paquetes de despliegue en formato .zip, puede utilizar el editor de código integrado en la consola de Lambda para actualizar el código de la función de forma directa. Para utilizar esta característica, la función debe cumplir los siguientes criterios:

  • La función debe utilizar uno de los tiempos de ejecución del lenguaje interpretado (Python, Node.js o Ruby)

  • El paquete de implementación de la función debe tener un tamaño inferior a 50 MB (sin comprimir).

El código de función de las funciones con paquetes de despliegue de imágenes de contenedores no se puede editar directamente en la consola.

Para actualizar el código de función mediante el editor de código de la consola
  1. Abra la página Funciones de la consola de Lambda y seleccione su función.

  2. Seleccione la pestaña Código.

  3. En el panel Código fuente, seleccione su archivo de código fuente y edítelo en el editor de código integrado.

  4. Cuando haya terminado de editar el código, expanda la sección IMPLEMENTAR en la barra lateral principal y elija Implementar.

Creación y actualización de funciones con archivos .zip mediante la AWS CLI

Puede utilizar la AWS CLI para crear una nueva función o actualizar una existente con un archivo .zip. Utilice los comandos create-function y update-function-code para implementar su paquete .zip. Si el archivo .zip tiene un tamaño inferior a 50 MB, puede cargarlo desde una ubicación de archivo en su equipo de compilación local. Para archivos más grandes, debe cargar su paquete .zip desde un bucket de Amazon S3. Para obtener instrucciones sobre cómo cargar un archivo en un bucket de Amazon S3 con la AWS CLI, consulte Mover objetos en la Guía del usuario de la AWS CLI.

nota

Si carga su archivo .zip desde un bucket de Amazon S3 con la AWS CLI, el bucket debe estar ubicado en la misma Región de AWS que su función.

Para crear una nueva función mediante un archivo .zip con la AWS CLI, debe especificar lo siguiente:

  • El nombre de la función (--function-name).

  • El tiempo de ejecución de la función (--runtime).

  • El nombre de recurso de Amazon (ARN) del rol de ejecución de la función (--role).

  • El nombre del método de controlador en el código de la función (--handler).

También debe especificar la ubicación del archivo .zip. Si el archivo .zip se encuentra en una carpeta de su equipo de compilación local, utilice la opción --zip-file para especificar la ruta del archivo, como se muestra en el siguiente comando de ejemplo.

aws lambda create-function --function-name myFunction \ --runtime nodejs20.x --handler index.handler \ --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \ --zip-file fileb://myFunction.zip

Para especificar la ubicación del archivo .zip en un bucket de Amazon S3, utilice la opción --code, como se muestra en el siguiente comando de ejemplo. Solo necesita utilizar el parámetro S3ObjectVersion para los objetos con versiones.

aws lambda create-function --function-name myFunction \ --runtime nodejs20.x --handler index.handler \ --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \ --code S3Bucket=amzn-s3-demo-bucket,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion

Para actualizar una función existente mediante la CLI, especifique el nombre de la función mediante el parámetro --function-name. También debe especificar la ubicación del archivo .zip que desea utilizar para actualizar el código de la función. Si el archivo .zip se encuentra en una carpeta de su equipo de compilación local, utilice la opción --zip-file para especificar la ruta del archivo, como se muestra en el siguiente comando de ejemplo.

aws lambda update-function-code --function-name myFunction \ --zip-file fileb://myFunction.zip

Para especificar la ubicación del archivo .zip en un bucket de Amazon S3, utilice las opciones --s3-bucket--s3-key tal como se muestra en el siguiente comando de ejemplo. Solo necesita utilizar el parámetro --s3-object-version para los objetos con versiones.

aws lambda update-function-code --function-name myFunction \ --s3-bucket amzn-s3-demo-bucket --s3-key myFileName.zip --s3-object-version myObject Version

Creación y actualización de funciones con archivos .zip mediante la API de Lambda

Para crear y actualizar funciones con un archivo de archivos .zip, utilice las siguientes operaciones de la API:

Creación y actualización de funciones con archivos .zip mediante AWS SAM

AWS Serverless Application Model (AWS SAM) es un conjunto de herramientas que ayuda a agilizar el proceso de creación y ejecución de aplicaciones sin servidor en AWS. Defina los recursos de su aplicación en una plantilla YAML o JSON y utilice la interfaz de la línea de comandos de AWS SAM (AWS SAM CLI) para crear, empaquetar e implementar sus aplicaciones. Al crear una función de Lambda a partir de una plantilla de AWS SAM, AWS SAM crea automáticamente un paquete de despliegue .zip o una imagen de contenedor con el código de la función y las dependencias que especifique. Para obtener más información sobre el uso de AWS SAM para crear e implementar funciones de Lambda, consulte Introducción a AWS SAM en la Guía para desarrolladores de AWS Serverless Application Model.

También puede utilizar AWS SAM para crear una función de Lambda con un archivo de archivos .zip existente. Para crear una función de Lambda mediante AWS SAM, puede guardar el archivo .zip en un bucket de Amazon S3 o en una carpeta local de su equipo de compilación. Para obtener instrucciones sobre cómo cargar un archivo en un bucket de Amazon S3 con la AWS CLI, consulte Mover objetos en la Guía del usuario de la AWS CLI.

En la plantilla de AWS SAM, el recurso AWS::Serverless::Function especifica la función de Lambda. En este recurso, establezca las siguientes propiedades para crear una función mediante un archivo de archivos .zip:

  • PackageType: se establece como Zip.

  • CodeUri: se establece como el URI de Amazon S3, la ruta a la carpeta local o el objeto FunctionCode del código de la función.

  • Runtime: se establece como el entorno de ejecución elegido

Con AWS SAM, si su archivo .zip tiene más de 50 MB, no es necesario cargarlo primero en un bucket de Amazon S3. AWS SAM puede cargar paquetes .zip hasta el tamaño máximo permitido de 250 MB (descomprimidos) desde una ubicación de su equipo de compilación local.

Para obtener más información sobre la implementación de funciones mediante un archivo .zip en AWS SAM, consulte AWS::Serverless::Function en la Guía para desarrolladores de AWS SAM.

Creación y actualización de funciones con archivos .zip mediante AWS CloudFormation

Puede utilizar AWS CloudFormation para crear una función de Lambda con un archivo de archivos .zip. Para crear una función de Lambda a partir de un archivo .zip, primero debe cargar el archivo a un bucket de Amazon S3. Para obtener instrucciones sobre cómo cargar un archivo en un bucket de Amazon S3 con la AWS CLI, consulte Mover objetos en la Guía del usuario de la AWS CLI.

En la plantilla de AWS CloudFormation, el recurso AWS::Lambda::Function especifica la función de Lambda. En este recurso, establezca las siguientes propiedades para crear una función mediante un archivo de archivos .zip:

  • PackageType: se establece como Zip.

  • Code: ingrese el nombre del bucket de Amazon S3 y el nombre del archivo .zip en los campos S3Bucket y S3Key.

  • Runtime: se establece como el tiempo de ejecución elegido.

El archivo .zip que genera AWS CloudFormation no puede superar los 4 MB. Para obtener más información sobre la implementación de funciones mediante un archivo .zip en AWS CloudFormation, consulte AWS::Lambda::Function en la Guía del usuario de AWS CloudFormation.