将 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.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64
对于长命令,使用转义字符 (\
) 将命令拆分为多行。
在 Linux 和 macOS 中,可使用您首选的 shell 和程序包管理器。
注意
在 Windows 中,操作系统的内置终端不支持您经常与 Lambda 一起使用的某些 Bash CLI 命令(例如 zip
)。安装 Windows Subsystem for Linux
创建执行角色
创建执行角色,向您的函数授予访问 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 Logs 所需的权限。
创建函数
以下示例记录环境变量和事件对象的值。
例 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 }
创建函数
-
将示例代码复制到名为
index.js
的文件中。 -
创建部署程序包。
zip function.zip index.js
-
使用
create-function
命令创建 Lambda 函数。将角色 ARN 中突出显示的文本替换为您的账户 ID。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-ex您应看到以下输出:
{ "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", ... }
要从命令行获取调用的日志,请使用 --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 Windowsbase64 -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
例 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": "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=" }
作为响应,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": "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-..." } }
有关更多信息,请参阅 GetFunction。
清除
运行以下 delete-function
命令以删除 my-function
函数。
aws lambda delete-function --function-name my-function
删除在 IAM 控制台中创建的 IAM 角色。有关删除角色的信息,请参阅 IAM 用户指南中的删除角色或实例配置文件。