Uso de Lambda con AWS CLI - AWS Lambda

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 siguientes pasos, necesita la versión 2 de la AWS Command Line Interface (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. Los comandos de la CLI de ejemplo de esta guía utilizan el formato Linux. Los comandos que incluyen documentos JSON en línea deben reformatearse si utiliza la CLI de Windows.

Creación del 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 AWSLambdaBasicExecutionRolepolítica tiene los permisos que la función necesita para escribir registros en 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
  1. Copie el código de muestra en un archivo con el nombre index.js.

  2. Cree un paquete de implementación.

    zip function.zip index.js
  3. 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 nodejs20.x \ --role arn:aws:iam::123456789012:role/lambda-ex

    Debería ver los siguientes datos de salida:

    { "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs20.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 Windows. Para el sistema operativo MacOS, el comando es base64 -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.

Use el update-function-configurationcomando para configurar las funciones. En el siguiente ejemplo, se establece la memoria de funciones en 256 MB.

ejemplo update-function-configuration comando
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": "nodejs20.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": "nodejs20.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": "nodejs20.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.

Limpieza

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.