Tutorial: cómo crear un tiempo de ejecución personalizado
En este tutorial creará una función de Lambda con un tiempo de ejecución personalizado. Para empezar incluirá el tiempo de ejecución en el paquete de implementación de la función. A continuación, lo migrará a una capa que gestiona independientemente de la función. Por último, compartirá la capa de tiempo de ejecución globalmente actualizando su política de permisos basados en recursos.
Requisitos previos
En este tutorial, se presupone que tiene algunos conocimientos sobre las operaciones básicas de Lambda y la consola de Lambda. Si aún no lo ha hecho, siga las instrucciones de Cree una función de Lambda con la consola. para crear su primera función de Lambda.
Para completar los siguientes pasos, necesita la versión 2 de la AWS CLI. Los comandos y la salida esperada se enumeran en bloques separados:
aws --version
Debería ver los siguientes datos de salida:
aws-cli/2.13.27 Python/3.11.6 Linux/4.14.328-248.540.amzn2.x86_64 exe/x86_64.amzn.2
Para 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 intérprete de comandos y paquetes preferido.
nota
En Windows, algunos comandos de la CLI de Bash que se utilizan habitualmente con Lambda (por ejemplo, zip
) no son compatibles con los terminales integrados del sistema operativo. Para obtener una versión de Ubuntu y Bash integrada con Windows, instale el subsistema de Windows para Linux
Necesita un rol de IAM para crear una función de Lambda. El rol necesita permiso para enviar registros a los Registros de CloudWatch y acceder al servicio de AWS que utiliza su función. Si no tiene un rol de para el desarrollo de funciones, cree uno.
Para crear un rol de ejecución
-
Abra la página Roles
en la consola de IAM. -
Elija Crear rol.
-
Cree un rol con las propiedades siguientes.
-
Trusted entity (Entidad de confianza).–Lambda:.
-
Permisos: AWSLambdaBasicExecutionRole.
-
Nombre de rol:
lambda-role
.
La política AWSLambdaBasicExecutionRole tiene permisos que la función necesita para escribir registros a Registros de CloudWatch.
-
Crear una función
Cree una función de Lambda con un tiempo de ejecución personalizado. En este ejemplo se incluyen dos archivos: un archivo bootstrap
de tiempo de ejecución y un controlador de la función. Ambos se implementan en Bash.
-
Cree un directorio para el proyecto y, a continuación, cambie a ese directorio.
mkdir runtime-tutorial cd runtime-tutorial
-
Cree un nuevo archivo denominado
bootstrap
. Este es el tiempo de ejecución personalizado.ejemplo bootstrap
#!/bin/sh set -euo pipefail # Initialization - load function handler source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh" # Processing while true do HEADERS="$(mktemp)" # Get an event. The HTTP request will block until one is received EVENT_DATA=$(curl -sS -LD "$HEADERS" "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next") # Extract request ID by scraping response headers received above REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2) # Run the handler function from the script RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA") # Send the response curl "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response" -d "$RESPONSE" done
El tiempo de ejecución carga un script de función desde el paquete de implementación. Utiliza dos variables para localizar el script.
LAMBDA_TASK_ROOT
le indica dónde se extrajo el paquete y_HANDLER
incluye el nombre del script.Luego de que el tiempo de ejecución carga el script de la función, utiliza la API de tiempo de ejecución para recuperar un evento de invocación de Lambda, pasa el evento al controlador y publica la respuesta de vuelta en Lambda. Para obtener el ID de la solicitud, el tiempo de ejecución guarda los encabezados de la respuesta de la API en un archivo temporal y lee el encabezado
Lambda-Runtime-Aws-Request-Id
del archivo.nota
Los tiempos de ejecución se encargan de algunas cosas más, como gestionar errores y proporcionar información de contexto al controlador. Para obtener más información, consulte Requisitos.
-
Cree un script para la función. El script del ejemplo a continuación, define una función de controlador que toma datos de eventos, los registra en
stderr
y los devuelve.ejemplo function.sh
function handler () { EVENT_DATA=$1 echo "$EVENT_DATA" 1>&2; RESPONSE="Echoing request: '$EVENT_DATA'" echo $RESPONSE }
El directorio
runtime-tutorial
debe tener ahora el siguiente aspecto:runtime-tutorial ├ bootstrap └ function.sh
-
Haga los archivos ejecutables y añádalos a un archivo .zip. Este es el paquete de implementación.
chmod 755 function.sh bootstrap zip function.zip function.sh bootstrap
-
Cree una función llamada
bash-runtime
. Para--role
, introduzca el ARN de su rol de ejecución de Lambda.aws lambda create-function --function-name bash-runtime \ --zip-file fileb://function.zip --handler function.handler --runtime provided.al2023 \ --role
arn:aws:iam::123456789012:role/lambda-role
-
Invoque la función.
aws lambda invoke --function-name bash-runtime --payload '{"text":"Hello"}' response.txt --cli-binary-format raw-in-base64-out
La opción cli-binary-format es obligatoria si va a utilizar la versión 2 de la AWS CLI. Para que esta sea la configuración predeterminada, ejecute
aws configure set cli-binary-format raw-in-base64-out
. Para obtener más información, consulte Opciones de la línea de comandos globales compatibles con AWS CLI en la Guía del usuario de la AWS Command Line Interface versión 2.Debería ver una respuesta como la siguiente:
{ "StatusCode": 200, "ExecutedVersion": "$LATEST" }
-
Verifique la respuesta.
cat response.txt
Debería ver una respuesta como la siguiente:
Echoing request: '{"text":"Hello"}'
Crear una capa
Para separar el código de tiempo de ejecución del código de la función, cree una capa que solo contenga el tiempo de ejecución. Las capas le permiten desarrollar las dependencias de la función de forma independiente y, si utiliza la misma capa con varias funciones, podrá hacer un menor uso del almacenamiento. Para obtener más información, consulte Administración de las dependencias de Lambda con capas.
-
Cree un archivo .zip que contenga el archivo
bootstrap
.zip runtime.zip bootstrap
-
Cree una capa con el comando publish-layer-version
. aws lambda publish-layer-version --layer-name bash-runtime --zip-file fileb://runtime.zip
Esto crea la primera versión de la capa.
Actualización de la función
Para utilizar la capa de tiempo de ejecución con la función, configure la función para que use la capa, y elimine de ella el código de tiempo de ejecución.
-
Actualice la configuración de la función para incluir la capa.
aws lambda update-function-configuration --function-name bash-runtime \ --layers arn:aws:lambda:us-east-1:
123456789012
:layer:bash-runtime:1Esto agrega el tiempo de ejecución a la función en el directorio
/opt
. Para garantizar que Lambda utilice el tiempo de ejecución de la capa, debe eliminar elboostrap
del paquete de implementación de la función, como se muestra en los dos pasos a continuación. -
Cree un archivo .zip que contenga el código de la función.
zip function-only.zip function.sh
-
Actualice el código de la función para que incluya solo el script del controlador.
aws lambda update-function-code --function-name bash-runtime --zip-file fileb://function-only.zip
-
Invoque la función para confirmar que funciona con la capa de tiempo de ejecución.
aws lambda invoke --function-name bash-runtime --payload '{"text":"Hello"}' response.txt --cli-binary-format raw-in-base64-out
La opción cli-binary-format es obligatoria si va a utilizar la versión 2 de la AWS CLI. Para que esta sea la configuración predeterminada, ejecute
aws configure set cli-binary-format raw-in-base64-out
. Para obtener más información, consulte Opciones de la línea de comandos globales compatibles con AWS CLI en la Guía del usuario de la AWS Command Line Interface versión 2.Debería ver una respuesta como la siguiente:
{ "StatusCode": 200, "ExecutedVersion": "$LATEST" }
-
Verifique la respuesta.
cat response.txt
Debería ver una respuesta como la siguiente:
Echoing request: '{"text":"Hello"}'
Actualización del tiempo de ejecución
-
Para registrar información sobre el entorno de ejecución, actualice el script de tiempo de ejecución para emitir variables de entorno.
ejemplo bootstrap
#!/bin/sh set -euo pipefail # Configure runtime to output environment variables
echo "## Environment variables:" env
# Load function handler source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh" # Processing while true do HEADERS="$(mktemp)" # Get an event. The HTTP request will block until one is received EVENT_DATA=$(curl -sS -LD "$HEADERS" "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next") # Extract request ID by scraping response headers received above REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2) # Run the handler function from the script RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA") # Send the response curl "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response" -d "$RESPONSE" done -
Cree un archivo .zip que contenga la nueva versión del archivo
bootstrap
.zip runtime.zip bootstrap
-
Cree una nueva versión de la capa
bash-runtime
.aws lambda publish-layer-version --layer-name bash-runtime --zip-file fileb://runtime.zip
-
Configure la función para utilizar la nueva versión de la capa.
aws lambda update-function-configuration --function-name bash-runtime \ --layers arn:aws:lambda:us-east-1:
123456789012
:layer:bash-runtime:2
Uso compartido de la capa
Para compartir una función con otra Cuenta de AWS, agregue una declaración de permisos entre cuentas a la política basada en los recursos de la capa. Ejecute el comando add-layer-version-permissionprincipal
. En cada instrucción, puede conceder permiso a una única cuenta, a todas las cuentas o a una organización en AWS Organizations.
El siguiente ejemplo concede a la cuenta 111122223333 acceso a la versión 2 de la capa bash-runtime
.
aws lambda add-layer-version-permission \ --layer-name bash-runtime \ --version-number 2 \ --statement-id xaccount \ --action lambda:GetLayerVersion \ --principal 111122223333 \ --output text
Debería ver una salida similar a esta:
{"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-1:123456789012:layer:bash-runtime:2"}
Los permisos solo se aplican a una única versión de una capa. Repita el proceso cada vez que cree una nueva versión de la capa.
Limpieza
Elimine cada versión de la capa.
aws lambda delete-layer-version --layer-name bash-runtime --version-number 1 aws lambda delete-layer-version --layer-name bash-runtime --version-number 2
Puesto que la función contiene una referencia a la versión 2 de la capa, esta sigue existiendo en Lambda. Si bien la función sigue funcionando, ya no se pueden configurar funciones para que utilicen la versión eliminada. Si modifica la lista de capas de la función, deberá especificar una nueva versión u omitir la capa eliminada.
Elimine la función con el comando delete-function
aws lambda delete-function --function-name bash-runtime