本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
AWS Lambda 的 Blank 函数示例应用程序
Blank 函数示例应用程序是一个初学者应用程序,它会演示 Lambda 中如何使用一个调用 Lambda API 的函数的常见执行操作。它显示日志记录、环境变量、AWS X-Ray 跟踪、层、单元测试和 AWS 开发工具包的使用情况。探索此应用程序,以了解如何使用您的编程语言构建 Lambda 函数,或将其用作您自己的项目的起点。
此示例应用程序的变体可用于以下语言:
变体
-
Node.js – blank-nodejs
。 -
Python – blank-python
。 -
Ruby – blank-ruby
。 -
Java – blank-java
。 -
Go – blank-go
。 -
C# – blank-csharp
。 -
PowerShell — 空白 p
owershell。
本主题中的示例突出介绍 Node.js 版本中的代码,但详细信息普遍适用于所有变体。
使用 AWS CLI 和 AWS CloudFormation 可在数分钟内部署本示例。请按照 README
架构和处理程序代码
示例应用程序由函数代码、AWS CloudFormation 模板和支持资源组成。部署示例时,您可以使用以下 AWS 服务:
-
AWS Lambda— 运行函数代码,将日志发送到日 CloudWatch 志,并将跟踪数据发送到 X-Ray。此函数还会调用 Lambda API,获取有关账户在当前区域中的配额和使用情况的详细信息。
-
AWS X-Ray
– 收集跟踪数据,对跟踪建立索引以方便搜索,并生成服务地图。 -
亚马逊 CloudWatch
-存储日志和指标。 -
Amazon Simple Storage Service (Amazon S3)
– 在部署期间存储函数的部署程序包。 -
AWS CloudFormation
– 创建应用程序资源并部署函数代码。
标准费用适用于每项服务。有关更多信息,请参阅 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
使用 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.ymlaws 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
第一个服务节点 (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
文件夹的内容发生更改时,才会上传层存档。