将 Lambda 与 Amazon CLI 结合使用 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将 Lambda 与 Amazon CLI 结合使用

您可以使用 Amazon Command Line Interface 管理函数及其他 Amazon Lambda 资源。Amazon CLI 使用 Amazon SDK for Python (Boto) 与 Lambda API 进行交互。您可以使用它来了解 API,并在构建将 Lambda 与Amazon开发工具包结合使用的应用程序时运用所学的知识。

在本教程中,您将使用 Amazon CLI 管理和调用 Lambda 函数。有关更多信息,请参阅 Amazon Command Line Interface 用户指南中的什么是 Amazon CLI?

先决条件

本教程假设您对 Lambda 基本操作和 Lambda 控制台有一定了解。如果您尚不了解,请按照 使用控制台创建 Lambda 函数 中的说明进行操作。

要完成以下步骤,您需要 Amazon Command Line Interface(Amazon CLI)版本 2。在单独的数据块中列出了命令和预期输出:

aws --version

您应看到以下输出:

aws-cli/2.13.27 Python/3.11.6 Linux/4.14.328-248.540.amzn2.x86_64 exe/x86_64.amzn.2

对于长命令,使用转义字符 (\) 将命令拆分为多行。

在 Linux 和 macOS 中,可使用您首选的 shell 和程序包管理器。

注意

在 Windows 中,操作系统的内置终端不支持您经常与 Lambda 一起使用的某些 Bash CLI 命令(例如 zip)。安装 Windows Subsystem for Linux,获取 Ubuntu 和 Bash 与 Windows 集成的版本。本指南中的示例 CLI 命令使用 Linux 格式。如果您使用的是 Windows CLI,则必须重新格式化包含内联 JSON 文档的命令。

创建执行角色

创建执行角色,向您的函数授予访问 Amazon 资源的权限。要使用 Amazon CLI 创建执行角色,请使用 create-role 命令。

在以下示例中,您可以指定内联信任策略。JSON 字符串中对转义引号的要求取决于您的 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"}]}'

您还可以使用 JSON 文件为角色定义信任策略。在下面的示例中,trust-policy.json 是位于当前目录中的一个文件。此信任策略允许 Lambda 通过向服务主体 lambda.amazonaws.com 授予调用 Amazon Security Token Service (Amazon STS) AssumeRole 操作的权限来使用该角色的权限。

例 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

您应看到以下输出:

{ "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" } ] } } }

要向角色添加权限,请使用 attach-policy-to-role 命令。首先添加 AWSLambdaBasicExecutionRole 托管策略。

aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

AWSLambdaBasicExecutionRole策略具有该函数将日志写入 CloudWatch 日志所需的权限。

创建函数

以下示例记录环境变量和事件对象的值。

例 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 }
创建函数
  1. 将示例代码复制到名为 index.js 的文件中。

  2. 创建部署程序包。

    zip function.zip index.js
  3. 使用 create-function 命令创建 Lambda 函数。将角色 ARN 中突出显示的文本替换为您的账户 ID。

    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

    您应看到以下输出:

    { "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", ... }

要从命令行获取调用的日志,请使用 --log-type 选项。响应包含一个 LogResult 字段,该字段包含来自调用的多达 4 KB 的 base64 编码日志。

aws lambda invoke --function-name my-function out --log-type Tail

您应看到以下输出:

{ "StatusCode": 200, "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...", "ExecutedVersion": "$LATEST" }

您可以使用 base64 实用程序来解码日志。

aws lambda invoke --function-name my-function out --log-type Tail \ --query 'LogResult' --output text | base64 -d

您应看到以下输出:

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

base64 实用程序在 Linux、macOS 和 Ubuntu on Windows 上可用。对于 macOS,命令为 base64 -D

要从命令行获取完整的日志事件,您可以在函数输出中包含日志流名称,如上例中所示。以下示例脚本调用名为 my-function 的函数并下载最后 5 个日志事件。

例 get-logs.sh 脚本

此示例要求 my-function 返回日志流 ID。

#!/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

此脚本使用 sed 从输出文件中删除引号,并休眠 15 秒以等待日志可用。输出包括来自 Lambda 的响应,以及来自 get-log-events 命令的输出。

./get-logs.sh

您应看到以下输出:

{ "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" }

更新函数

创建函数后,您可为函数配置其他功能,例如触发器、网络连接以及文件系统访问。还可以调整与函数关联的资源,例如内存和并发。这些配置适用于定义为 .zip 文件归档的函数和定义为容器镜像的函数。

使用update-function-configuration命令配置函数。以下示例将函数内存设置为 256 MB。

例 update-function-configuration 命令
aws lambda update-function-configuration \ --function-name my-function \ --memory-size 256

列出您账户中的 Lambda 函数

运行以下 Amazon CLI list-functions 命令可检索您已创建的函数的列表。

aws lambda list-functions --max-items 10

您应看到以下输出:

{ "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=" }

作为响应,Lambda 返回一个最多包含 10 个函数的列表。如果有更多功能可供您检索,NextToken 将提供一个您可以在下一个 list-functions 请求中使用的标记。以下 list-functions Amazon CLI 命令是一个演示 --starting-token 参数的示例。

aws lambda list-functions --max-items 10 --starting-token eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAxMH0=

检索 Lambda 函数

Lambda CLI get-function 命令将返回 Lambda 函数元数据以及可用来下载函数的部署程序包的预签名 URL。

aws lambda get-function --function-name my-function

您应看到以下输出:

{ "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-..." } }

有关更多信息,请参阅GetFunction

清理

运行以下 delete-function 命令以删除 my-function 函数。

aws lambda delete-function --function-name my-function

删除在 IAM 控制台中创建的 IAM 角色。有关删除角色的信息,请参阅 IAM 用户指南中的删除角色或实例配置文件