Implementar funciones de Lambda de Ruby con archivos .zip - AWS Lambda

Implementar funciones de Lambda de Ruby con archivos .zip

El código de la función de AWS Lambda incluye un archivo .rb que contiene el código del controlador de la función, junto con las dependencias adicionales (gemas) de las que dependa 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 Ruby, consulte Implementar funciones de Lambda Ruby 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.

En los comandos de ejemplo de las siguientes secciones, se utiliza la utilidad Agrupador para agregar dependencias al paquete de despliegue. Ejecute el siguiente comando para instalar el agrupador.

gem install bundler

Dependencias en Ruby

Para las funciones de Lambda que utilizan el tiempo de ejecución de Ruby, una dependencia puede ser cualquier gema de Ruby. Cuando implemente la función mediante un archivo .zip, podrá agregar estas dependencias a su archivo .zip con el código de la función o utilizar una capa de Lambda. Una capa es un archivo .zip independiente que puede contener código adicional y otro contenido. Para obtener más información sobre el uso de las capas de Lambda, consulte Administración de las dependencias de Lambda con capas.

En el tiempo de ejecución de Ruby se incluye el AWS SDK for Ruby. Si la función utiliza el SDK, no necesita agruparlo con el código. Sin embargo, para mantener el control total de las dependencias o para utilizar una versión específica del SDK, puede agregarla al paquete de despliegue de la función. Puede incluir el SDK en el archivo .zip o agregarlo mediante una capa de Lambda. Las dependencias del archivo .zip o de las capas de Lambda tienen prioridad sobre las versiones incluidas en el tiempo de ejecución. Para saber qué versión del SDK para Ruby está incluida en la versión del tiempo de ejecución, consulte Versiones del SDK incluidas en el 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 Ruby mediante archivos .zip.

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

Si el código de la función no tiene dependencias, el archivo .zip solo contiene el archivo .rb 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 .rb en la raíz. Si el archivo .rb 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 Ruby mediante archivos .zip.

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

Si el código de la función depende de gemas de Ruby adicionales, 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 Ruby para las dependencias.

Supongamos que el código de la función se guarda en un archivo llamado lambda_function.rb del directorio del proyecto. Los siguientes comandos de la CLI crean un archivo .zip llamado my_deployment_package.zip que contiene el código de la función de y sus dependencias.

Creación del paquete de implementación
  1. En el directorio del proyecto, cree un Gemfile para especificar las dependencias.

    bundle init
  2. Con el editor de texto que prefiera, edite el Gemfile para especificar las dependencias de la función. Por ejemplo, para utilizar la gema TZInfo, edite el Gemfile para que tenga una apariencia similar a la siguiente.

    source "https://rubygems.org" gem "tzinfo"
  3. Ejecute el siguiente comando para instalar las gemas especificadas en el Gemfile del directorio del proyecto. Este comando configura vendor/bundle como la ruta predeterminada para las instalaciones de gemas.

    bundle config set --local path 'vendor/bundle' && bundle install

    Debería ver un resultado similar a este.

    Fetching gem metadata from https://rubygems.org/........... Resolving dependencies... Using bundler 2.4.13 Fetching tzinfo 2.0.6 Installing tzinfo 2.0.6 ...
    nota

    Para volver a instalar gemas a nivel global más adelante, ejecute el siguiente comando.

    bundle config set --local system 'true'
  4. Cree un archivo .zip que contenga el archivo lambda_function.rb con el código del controlador de la función y las dependencias que instaló en el paso anterior.

    zip -r my_deployment_package.zip lambda_function.rb vendor

    Debería ver un resultado similar a este.

    adding: lambda_function.rb (deflated 37%) adding: vendor/ (stored 0%) adding: vendor/bundle/ (stored 0%) adding: vendor/bundle/ruby/ (stored 0%) adding: vendor/bundle/ruby/3.2.0/ (stored 0%) adding: vendor/bundle/ruby/3.2.0/build_info/ (stored 0%) adding: vendor/bundle/ruby/3.2.0/cache/ (stored 0%) adding: vendor/bundle/ruby/3.2.0/cache/aws-eventstream-1.0.1.gem (deflated 36%) ...

Creación de una capa de Ruby 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:

  • ruby/gems/2.7.0 (GEM_PATH)

  • ruby/lib (RUBYLIB)

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

json.zip └ ruby/gems/2.7.0/ | build_info | cache | doc | extensions | gems | └ json-2.1.0 └ specifications └ json-2.1.0.gemspec

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.

Creación de paquetes de despliegue .zip con bibliotecas nativas

Muchas gemas de Ruby comunes, como nokogiri, nio4r y mysql, contienen extensiones nativas escritas en C. Cuando agregue bibliotecas que contienen código C al paquete de despliegue, deberá compilar el paquete correctamente para garantizar que sea compatible con el entorno de ejecución de Lambda.

Para las aplicaciones de producción, recomendamos crear e implementar el código mediante AWS Serverless Application Model (AWS SAM). En AWS SAM, utilice la opción sam build --use-container para crear la función dentro de un contenedor de Docker tipo Lambda. Para obtener más información sobre el uso de AWS SAM para implementar el código de la función, consulte Creación de aplicaciones en la Guía para desarrolladores de AWS SAM.

Para crear un paquete de despliegue .zip que contenga gemas con extensiones nativas sin utilizar AWS SAM, también puede utilizar un contenedor para agrupar las dependencias en un entorno que sea igual al entorno de tiempo de ejecución de Ruby Lambda. Para completar estos pasos, debe tener Docker instalado en su equipo de compilación. Para obtener más información sobre la instalación de Docker, consulte Instalar Docker Engine.

Para crear un paquete de despliegue .zip en un contenedor de Docker
  1. Cree una carpeta en el equipo de compilación local para guardar el contenedor. Dentro de esa carpeta, cree un archivo llamado dockerfile y pegue el siguiente código en él.

    FROM public.ecr.aws/sam/build-ruby3.2:latest-x86_64 RUN gem update bundler CMD "/bin/bash"
  2. Dentro de la carpeta en la que creó el dockerfile, ejecute el siguiente comando para crear el contenedor de Docker.

    docker build -t awsruby32 .
  3. Desplácese hasta el directorio del proyecto que contiene el archivo .rb con el código del controlador de la función y el Gemfile para especificar las dependencias de la función. Desde dentro de ese directorio, ejecute el siguiente comando para iniciar el contenedor de Ruby Lambda.

    Linux/MacOS
    docker run --rm -it -v $PWD:/var/task -w /var/task awsruby32
    nota

    En macOS, es posible que vea una advertencia que informa que la plataforma de la imagen solicitada no coincide con la plataforma host detectada. Ignore esta advertencia.

    Windows PowerShell
    docker run --rm -it -v ${pwd}:var/task -w /var/task awsruby32

    Cuando se inicie el contenedor, debería ver un mensaje de bash.

    bash-4.2#
  4. Configure la agrupación de paquetes para instalar las gemas especificadas en el Gemfile del directorio vendor/bundle local e instale las dependencias.

    bash-4.2# bundle config set --local path 'vendor/bundle' && bundle install
  5. Cree un paquete de despliegue con el código de la función y sus dependencias. En este ejemplo, el archivo que contiene el código del controlador de la función se llama lambda_function.rb.

    bash-4.2# zip -r my_deployment_package.zip lambda_function.rb vendor
  6. Salga del contenedor y regrese al directorio del proyecto local.

    bash-4.2# exit

    Ahora puede utilizar el paquete de despliegue del archivo .zip para crear o actualizar la función de Lambda. Consulte Creación y actualización de funciones de Lambda Ruby mediante archivos .zip

Creación y actualización de funciones de Lambda Ruby 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 Author from scratch (Crear desde cero).

  3. Bajo Basic information (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. Seleccione Creación de 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 Save (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. En la sección IMPLEMENTAR elija Implementar para actualizar el código de la función:

    Botón Implementar en el editor de código de la consola de Lambda

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 ruby3.2 --handler lambda_function.lambda_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 ruby3.2 --handler lambda_function.lambda_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 entorno 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.