AWS Lambda 的 Blank 函数示例应用程序 - AWS Lambda
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

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


      Blank 函数示例应用程序架构。

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

变体

本主题中的示例突出介绍 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 队列,请参阅 将 AWS Lambda 与 Amazon SQS 结合使用

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

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


        Blank 应用程序堆栈和支持资源。

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

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

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: nodejs12.x CodeUri: function/. Description: Call the AWS Lambda API Timeout: 10 # Function's execution role Policies: - AWSLambdaBasicExecutionRole - AWSLambdaReadOnlyAccess - 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: - nodejs12.x

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

例 已处理的模板

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

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

清理脚本 (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 的示例函数,用于获取有关当前区域中存储和并发使用情况的详细信息。


        具有 X-Ray 开发工具包的函数的服务地图。

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


        具有 X-Ray 开发工具包的函数的跟踪。

您可以在函数的部署包中包含 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: nodejs12.x CodeUri: function/. Description: Call the AWS Lambda API Timeout: 10 # Function's execution role Policies: - AWSLambdaBasicExecutionRole - AWSLambdaReadOnlyAccess - 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: - nodejs12.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 文件夹的内容发生更改时,才会上传层存档。