Tutorial: publicación de 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 Lambda.
Para completar los pasos siguientes, necesitará un shell o un terminal de línea de comando para ejecutar los comandos. Los comandos y la salida esperada se enumeran 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 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, 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 Lambda. El rol necesita permiso para enviar registros a CloudWatch Logs 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 Create role.
-
Cree un rol con las propiedades siguientes.
-
Trusted entity (Entidad de confianza).–Lambda:.
-
Permissions (Permisos): AWSLambdaBasicExecutionRole.
-
Nombre de rol:
lambda-role
.
La política AWSLambdaBasicExecutionRole tiene permisos que la función necesita para escribir registros a CloudWatch Logs.
-
Crear una función de
Cree una función de Lambda con un tiempo de ejecución personalizado. En este ejemplo se incluyen dos archivos, un archivo de tiempo de ejecución bootstrap
y un controlador de la función. Ambos se implementan en Bash.
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.
ejemplo arranque
#!/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" -X GET "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 -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response" -d "$RESPONSE" done
Tras cargar el script, el tiempo de ejecución procesa los eventos en bucle. 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.
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 Creación de un tiempo de ejecución personalizado.
El script define una función de controlador que toma datos de eventos, la registra en stderr
y la devuelve.
ejemplo function.sh
function handler () { EVENT_DATA=$1 echo "$EVENT_DATA" 1>&2; RESPONSE="Echoing request: '$EVENT_DATA'" echo $RESPONSE }
Guarde ambos archivos en un directorio de proyecto llamado runtime-tutorial
.
runtime-tutorial ├ bootstrap └ function.sh
Haga los archivos ejecutables y añádalos a un archivo .zip.
runtime-tutorial$
chmod 755 function.sh bootstrap
runtime-tutorial$zip function.zip function.sh bootstrap
adding: function.sh (deflated 24%) adding: bootstrap (deflated 39%)
Cree una función llamada bash-runtime
.
runtime-tutorial$
aws lambda create-function --function-name bash-runtime \ --zip-file fileb://function.zip --handler function.handler --runtime provided \ --role arn:aws:iam::
{ "FunctionName": "bash-runtime", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:bash-runtime", "Runtime": "provided", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "function.handler", "CodeSha256": "mv/xRv84LPCxdpcbKvmwuuFzwo7sLwUO1VxcUv3wKlM=", "Version": "$LATEST", "TracingConfig": { "Mode": "PassThrough" }, "RevisionId": "2e1d51b0-6144-4763-8e5c-7d5672a01713", ... }123456789012
:role/lambda-role
Invoque la función y verifique la respuesta.
runtime-tutorial$
aws lambda invoke --function-name bash-runtime --payload '{"text":"Hello"}' response.txt --cli-binary-format raw-in-base64-out
{ "StatusCode": 200, "ExecutedVersion": "$LATEST" } runtime-tutorial$cat response.txt
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.
Cree un archivo de capa que contenga el archivo bootstrap
.
runtime-tutorial$
zip runtime.zip bootstrap
adding: bootstrap (deflated 39%)
Cree una capa con el comando publish-layer-version
.
runtime-tutorial$
aws lambda publish-layer-version --layer-name bash-runtime --zip-file fileb://runtime.zip
{ "Content": { "Location": "https://awslambda-us-west-2-layers.s3.us-west-2.amazonaws.com/snapshots/123456789012/bash-runtime-018c209b...", "CodeSha256": "bXVLhHi+D3H1QbDARUVPrDwlC7bssPxySQqt1QZqusE=", "CodeSize": 584, "UncompressedCodeSize": 0 }, "LayerArn": "arn:aws:lambda:us-west-2:123456789012:layer:bash-runtime", "LayerVersionArn": "arn:aws:lambda:us-west-2:123456789012:layer:bash-runtime:1", "Description": "", "CreatedDate": "2018-11-28T07:49:14.476+0000", "Version": 1 }
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, a continuación, elimine de ella el código de tiempo de ejecución.
Actualice la configuración de la función para incluir la capa.
runtime-tutorial$
aws lambda update-function-configuration --function-name bash-runtime \ --layers arn:aws:lambda:us-west-2:
{ "FunctionName": "bash-runtime", "Layers": [ { "Arn": "arn:aws:lambda:us-west-2:123456789012:layer:bash-runtime:1", "CodeSize": 584, "UncompressedCodeSize": 679 } ] ... }123456789012
:layer:bash-runtime:1
Esto agrega el tiempo de ejecución a la función en el directorio /opt
. Lambda utiliza este tiempo de ejecución, pero solo si se elimina del paquete de implementación de la función. Actualice el código de la función para que incluya solo el script del controlador.
runtime-tutorial$
zip function-only.zip function.sh
adding: function.sh (deflated 24%) runtime-tutorial$aws lambda update-function-code --function-name bash-runtime --zip-file fileb://function-only.zip
{ "FunctionName": "bash-runtime", "CodeSize": 270, "Layers": [ { "Arn": "arn:aws:lambda:us-west-2:123456789012:layer:bash-runtime:7", "CodeSize": 584, "UncompressedCodeSize": 679 } ] ... }
Invoque la función de para verificar que funciona con la capa de tiempo de ejecución.
runtime-tutorial$
aws lambda invoke --function-name bash-runtime --payload '{"text":"Hello"}' response.txt --cli-binary-format raw-in-base64-out
{ "StatusCode": 200, "ExecutedVersion": "$LATEST" } runtime-tutorial$cat response.txt
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 arranque
#!/bin/sh set -euo pipefail echo "## Environment variables:" env # Initialization - load function handler source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh" ...
Cree una segunda versión de la capa con el nuevo código.
runtime-tutorial$
zip runtime.zip bootstrap
updating: bootstrap (deflated 39%) runtime-tutorial$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.
runtime-tutorial$
aws lambda update-function-configuration --function-name bash-runtime \ --layers arn:aws:lambda:us-west-2:
123456789012
:layer:bash-runtime:2
Uso compartido de la capa
Añada una instrucción de permiso a la capa de tiempo de ejecución para compartirla con otras cuentas.
runtime-tutorial$
aws lambda add-layer-version-permission --layer-name bash-runtime --version-number 2 \ --principal "*" --statement-id publish --action lambda:GetLayerVersion
{ "Statement": "{\"Sid\":\"publish\",\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"lambda:GetLayerVersion\",\"Resource\":\"arn:aws:lambda:us-west-2:123456789012:layer:bash-runtime:2\"}", "RevisionId": "9d5fe08e-2a1e-4981-b783-37ab551247ff" }
Puede agregar varias instrucciones de manera que cada una conceda permiso a una única cuenta, cuentas de una organización o todas las cuentas.
Eliminar recursos
Elimine cada versión de la capa.
runtime-tutorial$
aws lambda delete-layer-version --layer-name bash-runtime --version-number 1
runtime-tutorial$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 después modifica la lista de capas en la función, deberá especificar una nueva versión u omitir la capa eliminada.
Elimine la función del tutorial con el comando delete-function
.
runtime-tutorial$
aws lambda delete-function --function-name bash-runtime