AWS Lambda 的 Blank 函数示例应用程序 - AWS Lambda

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

AWS Lambda 的 Blank 函数示例应用程序

Blank 函数示例应用程序是一个初学者应用程序,它会演示 Lambda 中如何使用一个调用 Lambda API 的函数的常见执行操作。它显示日志记录、环境变量、AWS X-Ray 跟踪、层、单元测试和 AWS 开发工具包的使用情况。探索此应用程序,以了解如何使用您的编程语言构建 Lambda 函数,或将其用作您自己的项目的起点。

此示例应用程序的变体可用于以下语言:

变体

本主题中的示例突出介绍 Node.js 版本中的代码,但详细信息普遍适用于所有变体。

使用 AWS CLI 和 AWS CloudFormation 可在数分钟内部署本示例。请按照 README 中的说明在您的账户中下载、配置和部署此示例。

架构和处理程序代码

示例应用程序由函数代码、AWS CloudFormation 模板和支持资源组成。部署示例时,您可以使用以下 AWS 服务:

标准费用适用于每项服务。有关更多信息,请参阅 AWS定价

函数代码显示用于处理事件的基本工作流程。处理程序将一个 Amazon Simple Queue Service (Amazon SQS) 事件作为输入,并遍历它包含的记录,同时记录每条消息的内容。它记录事件的内容、上下文对象和环境变量。然后,它使用AWS开发工具包进行调用,并将响应传回给 Lambda 运行时。

blank-nodejs/function/index.js – 处理程序代码
// Handler exports.handler = async function(event, context) { event.Records.forEach(record => { console.log(record.body) }) console.log('## ENVIRONMENT VARIABLES: ' + serialize(process.env)) console.log('## CONTEXT: ' + serialize(context)) console.log('## EVENT: ' + serialize(event)) return getAccountSettings() } // Use SDK client var getAccountSettings = function(){ return lambda.getAccountSettings().promise() } var serialize = function(object) { return JSON.stringify(object, null, 2) }

处理程序的输入/输出类型以及对异步编程的支持因运行时而异。在此示例中,处理程序方法是 async,因此,在 Node.js 中,这意味着它必须向运行时返回一个 Promise。Lambda 运行时等待解析 Promise,并将响应返回给调用方。如果函数代码或 AWS 开发工具包客户端返回了错误,则运行时将错误格式化为 JSON 文档并返回该文档。

示例应用程序不包括发送事件的 Amazon SQS 队列,但使用来自 Amazon SQS (event.json) 的事件来说明如何处理事件。要向应用程序添加 Amazon SQS 队列,请参阅 将 Lambda 与 Amazon SQS 结合使用

使用 AWS CloudFormation 和 AWS CLI 自动执行部署

示例应用程序的资源在 AWS CloudFormation 模板中定义,并使用 AWS CLI 进行部署。该项目包括简单的 Shell 脚本,这些脚本用于自动执行设置、部署、调用和分解应用程序的过程。

应用程序模板使用 AWS Serverless Application Model (AWS SAM) 资源类型来定义模型。AWS SAM 通过自动定义执行角色、API 和其他资源来简化无服务器应用程序的模板创作。

此模板定义了应用程序堆栈中的资源。资源包括函数、其执行角色,以及提供函数库依赖项的 Lambda 层。堆栈不包括部署期间AWS CLI使用的存储桶或 CloudWatch 日志组。

blank-nodejs/template.yml – 无服务器资源
AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: An AWS Lambda application that calls the Lambda API. Resources: function: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs16.x CodeUri: function/. Description: Call the AWS Lambda API Timeout: 10 # Function's execution role Policies: - AWSLambdaBasicExecutionRole - AWSLambda_ReadOnlyAccess - AWSXrayWriteOnlyAccess Tracing: Active Layers: - !Ref libs libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-nodejs-lib Description: Dependencies for the blank sample app. ContentUri: lib/. CompatibleRuntimes: - nodejs16.x

当您部署应用程序时,AWS CloudFormation 将 AWS SAM 转换应用于模板,以生成具有标准类型(如 AWS CloudFormation 和 AWS::Lambda::Function)的 AWS::IAM::Role 模板。

例 已处理的模板
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "An AWS Lambda application that calls the Lambda API.", "Resources": { "function": { "Type": "AWS::Lambda::Function", "Properties": { "Layers": [ { "Ref": "libs32xmpl61b2" } ], "TracingConfig": { "Mode": "Active" }, "Code": { "S3Bucket": "lambda-artifacts-6b000xmpl1e9bf2a", "S3Key": "3d3axmpl473d249d039d2d7a37512db3" }, "Description": "Call the AWS Lambda API", "Tags": [ { "Value": "SAM", "Key": "lambda:createdBy" } ],

在此示例中,Code 属性指定 Amazon S3 存储桶中的对象。这对应于项目模板中 CodeUri 属性中的本地路径:

CodeUri: function/.

要将项目文件上载到 Amazon S3,部署脚本要使用 AWS CLI 中的命令。cloudformation package 命令预处理模板、上载构件,并将本地路径替换为 Amazon S3 对象位置。cloudformation deploy 命令使用 AWS CloudFormation 更改集部署已处理的模板。

blank-nodejs/3-deploy.sh – 软件包和部署
#!/bin/bash set -eo pipefail ARTIFACT_BUCKET=$(cat bucket-name.txt) aws cloudformation package --template-file template.yml --s3-bucket $ARTIFACT_BUCKET --output-template-file out.yml aws cloudformation deploy --template-file out.yml --stack-name blank-nodejs --capabilities CAPABILITY_NAMED_IAM

第一次运行此脚本时,它会创建一个名为 AWS CloudFormation 的 blank-nodejs 堆栈。如果对函数代码或模板进行更改,可以再次运行此脚本来更新堆栈。

清理脚本 (blank-nodejs/5-cleanup.sh) 可删除堆栈,并且可以选择删除部署存储桶和函数日志。

使用 AWS X-Ray 进行检测

示例函数配置为使用 AWS X-Ray 进行跟踪。将跟踪模式设置为活动状态时,Lambda 会记录某个调用子集的计时信息并将其发送到 X-Ray。X-Ray 会处理数据,生成服务地图,地图会显示一个客户端节点和两个服务节点。

第一个服务节点 (AWS::Lambda) 表示 Lambda 服务,它验证调用请求并将其发送到函数。第二个节点 AWS::Lambda::Function 表示函数本身。

要记录其他详细信息,示例函数使用 X-Ray 开发工具包。对函数代码进行最少更改后,X-Ray 开发工具包会记录有关使用AWS开发工具包对AWS服务进行调用的详细信息。

blank-nodejs/function/index.js – 检测
const AWSXRay = require('aws-xray-sdk-core') const AWS = AWSXRay.captureAWS(require('aws-sdk')) // Create client outside of handler to reuse const lambda = new AWS.Lambda()

对 AWS 开发工具包客户端进行检测,将向服务地图添加一个额外节点,并在跟踪中添加更多详细信息。在此示例中,服务地图会显示调用 Lambda API 的示例函数,用于获取有关当前区域中存储和并发使用情况的详细信息。

跟踪显示调用的计时详细信息,包括用于函数初始化、调用和开销的子段。调用子段具有用于对 AWS API 操作进行 GetAccountSettings 开发工具包调用的子段。

您可以在函数的部署包中包含 X-Ray 开发工具包和其他库,也可以在 Lambda 层中单独部署它们。对于 Node.js、Ruby 和 Python,Lambda 运行时在执行环境中包含AWS开发工具包。

具有层的依赖项管理

您可以在本地安装库,并将它们放在您上载到 Lambda 的部署包中,但这样做有弊端。文件大小较大会增加部署时间,并且可能会阻止您在 Lambda 控制台中测试函数代码更改。为了使部署包保持较小并避免上载尚未更改的依赖项,示例应用程序会创建一个 Lambda 层并将其与函数关联。

blank-nodejs/template.yml – 依赖项层
Resources: function: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs16.x CodeUri: function/. Description: Call the AWS Lambda API Timeout: 10 # Function's execution role Policies: - AWSLambdaBasicExecutionRole - AWSLambda_ReadOnlyAccess - AWSXrayWriteOnlyAccess Tracing: Active Layers: - !Ref libs libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-nodejs-lib Description: Dependencies for the blank sample app. ContentUri: lib/. CompatibleRuntimes: - nodejs16.x

2-build-layer.sh 脚本使用 npm 安装函数的依赖项,并将其放置在具有 Lambda 运行时所需结构的文件夹中。

2-build-layer.sh – 准备层
#!/bin/bash set -eo pipefail mkdir -p lib/nodejs rm -rf node_modules lib/nodejs/node_modules npm install --production mv node_modules lib/nodejs/

首次部署示例应用程序时,AWS CLI 将此层与函数代码分开打包并部署两者。对于后续部署,仅当 lib 文件夹的内容发生更改时,才会上传层存档。