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

将 Amazon Lambda 与 Amazon Command Line Interface 结合使用

您可以使用 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 函数 中的说明进行操作。

要完成以下步骤,您需要命令行终端或 Shell 以运行命令。命令和预期输出在单独的数据块中列出:

aws --version

您应看到以下输出:

aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64

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

在 Linux 和 macOS 中,可使用您首选的外壳程序和程序包管理器。在 Windows 10 中,您可以 安装 Windows Subsystem for Linux,获取 Ubuntu 和 Bash 与 Windows 集成的版本。

本教程使用 Amazon Command Line Interface (Amazon CLI) 调用服务 API 操作。要安装 Amazon CLI,请参阅 Amazon Command Line Interface 用户指南 中的安装 Amazon CLI

创建执行角色

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

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-cn: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" } ] } } }

trust-policy.json 文件是当前目录中的 JSON 文件,该文件定义了角色的信任策略。此信任策略通过向服务委托人授予调用 Amazon Security Token Service AssumeRole 操作所需的 lambda.amazonaws.com 权限来允许 Lambda 使用角色的权限。

例 trust-policy.json

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

您也可以内联方式指定信任策略。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"}]}'

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

aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws-cn: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 }

创建函数

  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 nodejs12.x \ --role arn:aws-cn:iam::123456789012:role/lambda-ex

    您应看到以下输出:

    { "FunctionName": "my-function", "FunctionArn": "arn:aws-cn:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs12.x", "Role": "arn:aws-cn: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 --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" }

列出您的账户中的 Lambda 函数

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

aws lambda list-functions --max-items 10

您应看到以下输出:

{ "Functions": [ { "FunctionName": "cli", "FunctionArn": "arn:aws-cn:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs12.x", "Role": "arn:aws-cn:iam::123456789012:role/lambda-ex", "Handler": "index.handler", ... }, { "FunctionName": "random-error", "FunctionArn": "arn:aws-cn:lambda:us-east-2:123456789012:function:random-error", "Runtime": "nodejs12.x", "Role": "arn:aws-cn: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-cn:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs12.x", "Role": "arn:aws-cn: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 用户指南 中的删除角色或实例配置文件