Uso de Lambda con AWS CLI
Puede usar el AWS Command Line Interface para administrar funciones y otros recursos de AWS Lambda. El AWS CLI utiliza el AWS SDK for Python (Boto) para interactuar con el API de Lambda. Puede usarlo para aprender sobre el API y aplicar ese conocimiento a la construcción de aplicaciones que usen Lambda con el SDK de AWS.
En este tutorial, administrará e invocará funciones de Lambda con el AWS CLI. Para obtener más información, consulte ¿Qué es AWS CLI? en la Guía del usuario de AWS Command Line Interface.
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 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
Este tutorial utiliza la AWS Command Line Interface (AWS CLI) para llamar a las operaciones de la API de servicio. Para instalar la AWS CLI, consulte Instalación de la AWS CLI en la Guía del usuario de AWS Command Line Interface.
Crear el rol de ejecución
Cree el rol de ejecución que concederá a su función permiso para obtener acceso a los recursos de AWS. Para crear un rol de ejecución con AWS CLI, utilice el comando create-role
.
En el ejemplo siguiente, especifica la política de confianza insertada. Los requisitos para escapar de las comillas en la cadena JSON varían dependiendo de su shell.
aws iam create-role --role-name lambda-ex --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'
También puede definir la política de confianza para el rol con un archivo JSON. En el siguiente ejemplo, trust-policy.json
es un archivo que se encuentra en el directorio actual. Esta política de confianza permite a Lambda utilizar los permisos del rol al dar permiso a la entidad principal del servicio lambda.amazonaws.com
para llamar a la acción AssumeRole
de AWS Security Token Service (AWS STS).
ejemplo trust-policy.json
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
aws iam create-role --role-name lambda-ex --assume-role-policy-document file://trust-policy.json
Debería ver los siguientes datos de salida:
{ "Role": { "Path": "/", "RoleName": "lambda-ex", "RoleId": "AROAQFOXMPL6TZ6ITKWND", "Arn": "arn:aws:iam::123456789012:role/lambda-ex", "CreateDate": "2020-01-17T23:19:12Z", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } } }
Para agregar permisos al rol, use el comando attach-policy-to-role. Comience agregando la política administrada de AWSLambdaBasicExecutionRole
.
aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
La política AWSLambdaBasicExecutionRole tiene permisos que la función necesita para escribir registros a CloudWatch Logs.
Creación de la función
En el siguiente ejemplo, se registran los valores de las variables de entorno y el objeto de evento.
ejemplo index.js
exports.handler = async function(event, context) { console.log("ENVIRONMENT VARIABLES\n" + JSON.stringify(process.env, null, 2)) console.log("EVENT\n" + JSON.stringify(event, null, 2)) return context.logStreamName }
Para crear la función
-
Copie el código de muestra en un archivo con el nombre
index.js
. -
Cree un paquete de implementación.
zip function.zip index.js
-
Cree una función de Lambda con el comando
create-function
. Reemplace el texto resaltado en el ARN de rol por su ID de cuenta.aws lambda create-function --function-name my-function \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs18.x \ --role arn:aws:iam::
123456789012
:role/lambda-exDebería ver los siguientes datos de salida:
{ "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs18.x", "Role": "arn:aws:iam::123456789012:role/lambda-ex", "Handler": "index.handler", "CodeSha256": "FpFMvUhayLkOoVBpNuNiIVML/tuGv2iJQ7t0yWVTU8c=", "Version": "$LATEST", "TracingConfig": { "Mode": "PassThrough" }, "RevisionId": "88ebe1e1-bfdf-4dc3-84de-3017268fa1ff", ... }
Para obtener registros para una invocación desde la línea de comandos, utilice la opción --log-type
. La respuesta incluye un campo LogResult
que contiene hasta 4 KB de registros con codificación base64 a partir de la invocación.
aws lambda invoke --function-name my-function out --log-type Tail
Debería ver los siguientes datos de salida:
{ "StatusCode": 200, "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...", "ExecutedVersion": "$LATEST" }
Puede utilizar la utilidad base64
para descodificar los registros.
aws lambda invoke --function-name my-function out --log-type Tail \ --query 'LogResult' --output text | base64 -d
Debería ver los siguientes datos de salida:
START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST "AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib", END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Duration: 79.67 ms Billed Duration: 80 ms Memory Size: 128 MB Max Memory Used: 73 MB
La utilidad base64
está disponible en Linux, MacOS y Ubuntu en Windowsbase64 -D
.
Para obtener eventos de registro completos desde la línea de comandos, puede incluir el nombre del flujo de registros en la salida de la función, como se muestra en el ejemplo anterior. El siguiente script de ejemplo invoca una función denominada my-function
y descarga los últimos cinco eventos de registro.
ejemplo Script get-logs.sh
Este ejemplo requiere que my-function
devuelva un ID de flujo de registros.
#!/bin/bash aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{"key": "value"}' out sed -i'' -e 's/"//g' out sleep 15 aws logs get-log-events --log-group-name /aws/lambda/my-function --log-stream-name $(cat out) --limit 5
El script utiliza sed
para eliminar las comillas del archivo de salida y permanece inactivo durante 15 segundos para dar tiempo a que los registros estén disponibles. La salida incluye la respuesta de Lambda y la salida del comando get-log-events
.
./get-logs.sh
Debería ver los siguientes datos de salida:
{ "StatusCode": 200, "ExecutedVersion": "$LATEST" } { "events": [ { "timestamp": 1559763003171, "message": "START RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf Version: $LATEST\n", "ingestionTime": 1559763003309 }, { "timestamp": 1559763003173, "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tENVIRONMENT VARIABLES\r{\r \"AWS_LAMBDA_FUNCTION_VERSION\": \"$LATEST\",\r ...", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003173, "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tEVENT\r{\r \"key\": \"value\"\r}\n", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003218, "message": "END RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\n", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003218, "message": "REPORT RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\tDuration: 26.73 ms\tBilled Duration: 27 ms \tMemory Size: 128 MB\tMax Memory Used: 75 MB\t\n", "ingestionTime": 1559763018353 } ], "nextForwardToken": "f/34783877304859518393868359594929986069206639495374241795", "nextBackwardToken": "b/34783877303811383369537420289090800615709599058929582080" }
Actualización de la función
Después de crear una función, puede configurar capacidades adicionales para ella, como desencadenadores, acceso a la red y acceso al sistema de archivos. También puede ajustar los recursos asociados a la función, como la memoria y la simultaneidad. Estas configuraciones se aplican a funciones definidas como archivos .zip y a funciones definidas como imágenes de contenedor.
Utilice el comando update-function-configuration
ejemplo comando update-function-configuration
aws lambda update-function-configuration \ --function-name my-function \ --memory-size 256
Listado de las funciones de Lambda de su cuenta
Ejecute el siguiente comando list-functions
de la AWS CLI para obtener una lista de las funciones que ha creado.
aws lambda list-functions --max-items 10
Debería ver los siguientes datos de salida:
{ "Functions": [ { "FunctionName": "cli", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs18.x", "Role": "arn:aws:iam::123456789012:role/lambda-ex", "Handler": "index.handler", ... }, { "FunctionName": "random-error", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:random-error", "Runtime": "nodejs18.x", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "index.handler", ... }, ... ], "NextToken": "eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAxMH0=" }
Como respuesta, Lambda devuelve una lista de hasta 10 funciones. Si hay más funciones, NextToken
proporciona un marcador que puede utilizar en la siguiente solicitud list-functions
. El siguiente comando list-functions
de la AWS CLI es un ejemplo de uso del parámetro --starting-token
.
aws lambda list-functions --max-items 10 --starting-token
eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAxMH0=
Recuperar una función Lambda
El comando get-function
de la CLI de Lambda devuelve a los metadatos de la función de Lambda y una URL prefirmada que puede usar para descargar el paquete de implementación de la función.
aws lambda get-function --function-name my-function
Debería ver los siguientes datos de salida:
{ "Configuration": { "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs18.x", "Role": "arn:aws:iam::123456789012:role/lambda-ex", "CodeSha256": "FpFMvUhayLkOoVBpNuNiIVML/tuGv2iJQ7t0yWVTU8c=", "Version": "$LATEST", "TracingConfig": { "Mode": "PassThrough" }, "RevisionId": "88ebe1e1-bfdf-4dc3-84de-3017268fa1ff", ... }, "Code": { "RepositoryType": "S3", "Location": "https://awslambda-us-east-2-tasks.s3.us-east-2.amazonaws.com/snapshots/123456789012/my-function-4203078a-b7c9-4f35-..." } }
Para obtener más información, consulte GetFunction.
Eliminar recursos
Ejecute el siguiente comando delete-function
para eliminar la función my-function
.
aws lambda delete-function --function-name my-function
En la consola de IAM elimine el rol de IAM que creó. Para obtener información acerca de cómo eliminar un rol, consulte Eliminación de roles o perfiles de instancia en la Guía del usuario de IAM.