Implementar funciones de Lambda en Go con archivos .zip - AWS Lambda

Implementar funciones de Lambda en Go con archivos .zip

El código de la función AWS Lambda se compone de scripts o programas compilados y sus dependencias. Utiliza un paquete de implementación para implementar su código de función en Lambda. Lambda admite dos tipos de paquetes de implementación: imágenes de contenedor y archivos .zip.

En esta página se describe cómo crear un archivo .zip como paquete de despliegue para el tiempo de ejecución de Go y, a continuación, utilizar el archivo .zip para implementar el código de función con AWS Lambda mediante la AWS Management Console, la AWS Command Line Interface (AWS CLI) y AWS Serverless Application Model (AWS SAM).

Lambda usa permisos de archivo de POSIX, por lo que puede necesitar establecer permisos para la carpeta del paquete de despliegue antes de crear el archivo .zip.

Creación de un archivo.zip en macOS y Linux

En los siguientes pasos, se muestra cómo compilar el archivo ejecutable mediante el comando go build y crear un paquete de implementación de archivos .zip para Lambda. Antes de compilar el código, asegúrese de haber instalado el paquete lambda de GitHub. Este módulo proporciona una implementación de la interfaz del tiempo de ejecución que administra la interacción entre Lambda y el código de la función. Para descargarla, ejecute el siguiente comando.

go get github.com/aws/aws-lambda-go/lambda

Si su función usa AWS SDK for Go, descargue el conjunto estándar de módulos del SDK, junto con los clientes de API de servicio de AWS que requiera su aplicación. Para obtener información sobre cómo instalar el SDK para Go, consulte Getting Started with the AWS SDK for Go V2.

Uso de la familia de tiempo de ejecución proporcionada

Go se implementa de manera distinta a otros tiempos de ejecución administrados. Como Go se compila de forma nativa en un archivo binario ejecutable, no requiere un tiempo de ejecución de lenguaje dedicado. Utilice un tiempo de ejecución exclusivo para el sistema operativo (la familia de tiempos de ejecución provided) para implementar las funciones de Go en Lambda.

Para crear un paquete de paquete de implementación .zip (macOS o Linux)
  1. En el directorio del proyecto que contiene el archivo main.go de la aplicación, compile el ejecutable. Tenga en cuenta lo siguiente:

    • El ejecutable debe denominarse bootstrap. Para obtener más información, consulte Denominación.

    • Establezca su arquitectura del conjunto de instrucciones de destino. El tiempo de ejecución de OS solo admite arm64 y x86_64.

    • Puede utilizar la etiqueta opcional lambda.norpc para excluir el componente de llamada a procedimiento remoto (RPC) de la biblioteca lambda. El componente de RPC solo es necesario si utiliza el tiempo de ejecución obsoleto Go 1.x. La exclusión del RPC reduce el tamaño del paquete de implementación.

    Para la arquitectura arm64:

    GOOS=linux GOARCH=arm64 go build -tags lambda.norpc -o bootstrap main.go

    Para la arquitectura x86_64:

    GOOS=linux GOARCH=amd64 go build -tags lambda.norpc -o bootstrap main.go
  2. (Opcional) Es posible que necesite compilar paquetes con CGO_ENABLED=0 establecido en Linux:

    GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -o bootstrap -tags lambda.norpc main.go

    Este comando crea un paquete binario estable para las versiones estándar de la biblioteca de C (libc), que puede ser diferente en Lambda y en otros dispositivos.

  3. Empaquete el ejecutable en un archivo.zip para crear un paquete de implementación.

    zip myFunction.zip bootstrap
    nota

    El archivo bootstrap debe estar en la raíz del archivo.zip.

  4. Cree la función. Tenga en cuenta lo siguiente:

    • El binario debe tener un nombre bootstrap, pero el nombre del controlador puede ser cualquier cosa. Para obtener más información, consulte Denominación.

    • La opción --architectures es obligatoria si utiliza arm64. El valor predeterminado es x86_64.

    • Para --role, especifique el Nombre de recurso de Amazon (ARN) del rol de ejecución.

    aws lambda create-function --function-name myFunction \ --runtime provided.al2023 --handler bootstrap \ --architectures arm64 \ --role arn:aws:iam::111122223333:role/lambda-ex \ --zip-file fileb://myFunction.zip

Crear un archivo.zip en Windows

En los siguientes pasos, se muestra cómo descargar la herramienta build-lambda-zip para Windows desde GitHub, compilar el archivo ejecutable y crear un paquete de despliegue .zip.

nota

Si aún no lo ha hecho, debe instalar git y luego agregar el git ejecutable a su variable de %PATH% entorno de Windows.

Antes de compilar el código, asegúrese de haber instalado la biblioteca lambda desde GitHub. Para descargarla, ejecute el siguiente comando.

go get github.com/aws/aws-lambda-go/lambda

Si su función usa AWS SDK for Go, descargue el conjunto estándar de módulos del SDK, junto con los clientes de API de servicio de AWS que requiera su aplicación. Para obtener información sobre cómo instalar el SDK para Go, consulte Getting Started with the AWS SDK for Go V2.

Uso de la familia de tiempo de ejecución proporcionada

Go se implementa de manera distinta a otros tiempos de ejecución administrados. Como Go se compila de forma nativa en un archivo binario ejecutable, no requiere un tiempo de ejecución de lenguaje dedicado. Utilice un tiempo de ejecución exclusivo para el sistema operativo (la familia de tiempos de ejecución provided) para implementar las funciones de Go en Lambda.

Para crear un paquete de implementación .zip (Windows)
  1. Descargue la herramienta build-lambda-zip de GitHub.

    go install github.com/aws/aws-lambda-go/cmd/build-lambda-zip@latest
  2. Utilice la herramienta desde GOPATH para crear un archivo .zip. Si tiene una instalación predeterminada de Go, la herramienta suele estar en %USERPROFILE%\Go\bin. De lo contrario, vaya hasta la ubicación donde instaló el tiempo de ejecución de Go y haga una de las siguientes acciones:

    cmd.exe

    En cmd.exe, ejecute una de las siguientes opciones, según su arquitectura del conjunto de instrucciones de destino. El tiempo de ejecución de OS solo admite arm64 y x86_64.

    Puede utilizar la etiqueta opcional lambda.norpc para excluir el componente de llamada a procedimiento remoto (RPC) de la biblioteca lambda. El componente de RPC solo es necesario si utiliza el tiempo de ejecución obsoleto Go 1.x. La exclusión del RPC reduce el tamaño del paquete de implementación.

    ejemplo — Para la arquitectura x86_64
    set GOOS=linux set GOARCH=amd64 set CGO_ENABLED=0 go build -tags lambda.norpc -o bootstrap main.go %USERPROFILE%\Go\bin\build-lambda-zip.exe -o myFunction.zip bootstrap
    ejemplo — Para la arquitectura arm64
    set GOOS=linux set GOARCH=arm64 set CGO_ENABLED=0 go build -tags lambda.norpc -o bootstrap main.go %USERPROFILE%\Go\bin\build-lambda-zip.exe -o myFunction.zip bootstrap
    PowerShell

    En PowerShell, ejecute una de las siguientes opciones, según su arquitectura del conjunto de instrucciones de destino. El tiempo de ejecución de SO solo admite arm64 y x86_64.

    Puede utilizar la etiqueta opcional lambda.norpc para excluir el componente de llamada a procedimiento remoto (RPC) de la biblioteca lambda. El componente de RPC solo es necesario si utiliza el tiempo de ejecución obsoleto Go 1.x. La exclusión del RPC reduce el tamaño del paquete de implementación.

    Para la arquitectura x86_64:

    $env:GOOS = "linux" $env:GOARCH = "amd64" $env:CGO_ENABLED = "0" go build -tags lambda.norpc -o bootstrap main.go ~\Go\Bin\build-lambda-zip.exe -o myFunction.zip bootstrap

    Para la arquitectura arm64:

    $env:GOOS = "linux" $env:GOARCH = "arm64" $env:CGO_ENABLED = "0" go build -tags lambda.norpc -o bootstrap main.go ~\Go\Bin\build-lambda-zip.exe -o myFunction.zip bootstrap
  3. Cree la función. Tenga en cuenta lo siguiente:

    • El binario debe tener un nombre bootstrap, pero el nombre del controlador puede ser cualquier cosa. Para obtener más información, consulte Denominación.

    • La opción --architectures es obligatoria si utiliza arm64. El valor predeterminado es x86_64.

    • Para --role, especifique el Nombre de recurso de Amazon (ARN) del rol de ejecución.

    aws lambda create-function --function-name myFunction \ --runtime provided.al2023 --handler bootstrap \ --architectures arm64 \ --role arn:aws:iam::111122223333:role/lambda-ex \ --zip-file fileb://myFunction.zip

Creación y actualización de funciones de Lambda en Go mediante archivos .zip

Una vez que haya creado su paquete de despliegue .zip, puede usarlo 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 se puede convertir una función de imagen de contenedor existente 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 función, escriba el nombre de la función.

    2. En Runtime (Tiempo de ejecución), elija provided.al2023.

  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.

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 provided.al2023 --handler bootstrap \ --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 provided.al2023 --handler bootstrap \ --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \ --code S3Bucket=DOC-EXAMPLE-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 DOC-EXAMPLE-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.

Ejemplo: uso de AWS SAM para crear una función de Go con provided.al2023
  1. Cree una plantilla de AWS SAM con las propiedades siguientes:

    • BuildMethod: especifica el compilador de la aplicación. Utilice go1.x.

    • Tiempo de ejecución: use provided.al2023.

    • CodeUri: ingrese la ruta de su código.

    • Arquitecturas: use [arm64] para la arquitectura arm64. Use [amd64] o elimine la propiedad Architectures para la arquitectura del conjunto de instrucciones x86_64.

    ejemplo template.yaml
    AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Resources: HelloWorldFunction: Type: AWS::Serverless::Function Metadata: BuildMethod: go1.x Properties: CodeUri: hello-world/ # folder where your main program resides Handler: bootstrap Runtime: provided.al2023 Architectures: [arm64]
  2. Utilice el comando sam build para compilar el ejecutable.

    sam build
  3. Utilice el comando sam deploy para implementar la función en Lambda.

    sam deploy --guided

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.

Creación de una capa de Go para las dependencias

nota

El uso de capas con funciones en un lenguaje compilado, como Go, puede no ofrecer las mismas ventajas que con un lenguaje interpretado, como Python. Como Go es un lenguaje compilado, las funciones aún tienen que cargar de forma manual los ensamblajes compartidos en la memoria durante la fase de inicio, lo que puede aumentar los tiempos de arranque en frío. En su lugar, se recomienda incluir cualquier código compartido en el momento de la compilación para aprovechar las optimizaciones del compilador integradas.

En las instrucciones de esta sección, se muestra cómo incluir las dependencias en una capa.

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, cree 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.