Amazon Lambda 的 Blank 函数示例应用程序
Blank 函数示例应用程序是一个初学者应用程序,它会演示 Lambda 中如何使用一个调用 Lambda API 的函数的常见执行操作。它显示日志记录、环境变量、Amazon X-Ray 跟踪、层、单元测试和 Amazon 开发工具包的使用情况。探索此应用程序,以了解如何使用您的编程语言构建 Lambda 函数,或将其用作您自己的项目的起点。
此示例应用程序的变体可用于以下语言:
Variants
-
Node.js – blank-nodejs
。 -
Python – blank-python
。 -
Ruby – blank-ruby
。 -
Java – blank-java
。 -
Go – blank-go
。 -
C# – blank-csharp
。 -
PowerShell – blank-powershell
。
本主题中的示例突出介绍 Node.js 版本中的代码,但详细信息普遍适用于所有变体。
使用 Amazon CLI 和 Amazon CloudFormation 可在数分钟内部署本示例。请按照 README
架构和处理程序代码
示例应用程序由函数代码、Amazon CloudFormation 模板和支持资源组成。部署示例时,您可以使用以下 Amazon 服务:
-
Amazon Lambda – 运行函数代码,将日志发送到 CloudWatch Logs,并将跟踪数据发送到 X-Ray。此函数还会调用 Lambda API,获取有关账户在当前区域中的配额和使用情况的详细信息。
-
Amazon X-Ray
– 收集跟踪数据,对跟踪建立索引以方便搜索,并生成服务地图。 -
Amazon CloudWatch
– 存储日志和指标。 -
Amazon Simple Storage Service (Amazon S3)
– 在部署期间存储函数的部署程序包。 -
Amazon CloudFormation
– 创建应用程序资源并部署函数代码。
标准费用适用于每项服务。有关更多信息,请参阅 Amazon定价
函数代码显示用于处理事件的基本工作流程。处理程序将一个 Amazon Simple Queue Service (Amazon SQS) 事件作为输入,并遍历它包含的记录,同时记录每条消息的内容。它记录事件的内容、上下文对象和环境变量。然后,它使用Amazon开发工具包进行调用,并将响应传回给 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,并将响应返回给调用方。如果函数代码或 Amazon 开发工具包客户端返回了错误,则运行时将错误格式化为 JSON 文档并返回该文档。
示例应用程序不包括发送事件的 Amazon SQS 队列,但使用来自 Amazon SQS (event.json
使用 Amazon CloudFormation 和 Amazon CLI 自动执行部署
示例应用程序的资源在 Amazon CloudFormation 模板中定义,并使用 Amazon CLI 进行部署。该项目包括简单的 Shell 脚本,这些脚本用于自动执行设置、部署、调用和分解应用程序的过程。
应用程序模板使用 Amazon Serverless Application Model (Amazon SAM) 资源类型来定义模型。Amazon SAM 通过自动定义执行角色、API 和其他资源来简化无服务器应用程序的模板创作。
此模板定义了应用程序堆栈中的资源。资源包括函数、其执行角色,以及提供函数库依赖项的 Lambda 层。堆栈不包括部署期间 Amazon CLI 使用的存储桶或 CloudWatch Logs 日志组。
例 blank-nodejs/template.yml
AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: An Amazon 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 Amazon 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: - nodejs12.x
当您部署应用程序时,Amazon CloudFormation 将 Amazon SAM 转换应用于模板,以生成具有标准类型(如 Amazon CloudFormation 和 AWS::Lambda::Function
)的 AWS::IAM::Role
模板。
例 已处理的模板
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "An Amazon 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 Amazon Lambda API", "Tags": [ { "Value": "SAM", "Key": "lambda:createdBy" } ],
在此示例中,Code
属性指定 Amazon S3 存储桶中的对象。这对应于项目模板中 CodeUri
属性中的本地路径:
CodeUri: function/.
要将项目文件上载到 Amazon S3,部署脚本要使用 Amazon CLI 中的命令。cloudformation package
命令预处理模板、上载构件,并将本地路径替换为 Amazon S3 对象位置。cloudformation deploy
命令使用 Amazon 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
第一次运行此脚本时,它会创建一个名为 Amazon CloudFormation 的 blank-nodejs
堆栈。如果对函数代码或模板进行更改,可以再次运行此脚本来更新堆栈。
清理脚本 (blank-nodejs/5-cleanup.sh
使用 Amazon X-Ray 进行检测
示例函数配置为使用 Amazon X-Ray
第一个服务节点 (AWS::Lambda
) 表示 Lambda 服务,它验证调用请求并将其发送到函数。第二个节点 AWS::Lambda::Function
表示函数本身。
要记录其他详细信息,示例函数使用 X-Ray 开发工具包。对函数代码进行最少更改后,X-Ray 开发工具包会记录有关使用Amazon开发工具包对Amazon服务进行调用的详细信息。
例 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()
对 Amazon 开发工具包客户端进行检测,将向服务地图添加一个额外节点,并在跟踪中添加更多详细信息。在此示例中,服务地图会显示调用 Lambda API 的示例函数,用于获取有关当前区域中存储和并发使用情况的详细信息。
跟踪显示调用的计时详细信息,包括用于函数初始化、调用和开销的子段。调用子段具有用于对 Amazon API 操作进行 GetAccountSettings
开发工具包调用的子段。
您可以在函数的部署包中包含 X-Ray 开发工具包和其他库,也可以在 Lambda 层中单独部署它们。对于 Node.js、Ruby 和 Python,Lambda 运行时在执行环境中包含Amazon开发工具包。
具有层的依赖项管理
您可以在本地安装库,并将它们放在您上载到 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 Amazon 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: - 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/
首次部署示例应用程序时,Amazon CLI 将此层与函数代码分开打包并部署两者。对于后续部署,仅当 lib
文件夹的内容发生更改时,才会上传层存档。