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.

Prerequisites

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 10, puede instalar Windows Subsystem para Linux para obtener una versión de Ubuntu y Bash integrada con Windows.

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.

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 dando el principal permiso de lambda.amazonaws.com del servicio para llamar a la acción AWS Security Token Service AssumeRole.

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 AWSLambdaVPCAccessExecutionRole 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

  1. Copie el código de muestra en un archivo con el nombre index.js.

  2. Crear 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 nodejs12.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": "nodejs12.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" }

Listado de las funciones de Lambda de su cuenta

Ejecute el siguiente comando AWS CLI de la list-functions 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": "nodejs12.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": "nodejs12.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": "nodejs12.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.