在 Lambda 控制台中创建具有持续交付功能的应用程序 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

在 Lambda 控制台中创建具有持续交付功能的应用程序

您可以使用 Lambda 控制台创建具有集成式持续交付管道的应用程序。通过持续交付,您推送到源代码控制存储库的每项更改都会触发一个自动构建和部署应用程序的管道。Lambda 控制台提供了用于带 Node.js 示例代码的通用应用程序类型的初学者项目以及用于创建支持性资源的模板。

在本教程中,您将创建以下资源。

  • 应用程序 – Node.js Lambda 函数、构建规范以及 Amazon Serverless Application Model (Amazon SAM) 模板。

  • 管道 – 一个 Amazon CodePipeline 管道,该管道连接其他资源以实现持续交付。

  • 存储库 – Amazon CodeCommit 中的 Git 存储库。当您推送更改时,管道将源代码复制到 Amazon S3 存储桶并将其传递给构建项目。

  • 触发器 — 一条 Amazon EventBridge (CloudWatch 事件)规则,用于监视存储库的主分支并触发管道。

  • 构建项目 – 从管道获取源代码并打包应用程序的 Amazon CodeBuild 构建。源包括构建规范,其中包含用于安装依赖项和为部署准备应用程序模板的命令。

  • 部署配置 – 管道的部署阶段定义了一组操作,这些操作从构建输出中获取经过处理的 Amazon SAM 模板,并使用 Amazon CloudFormation 部署新版本。

  • 存储桶 – Amazon Simple Storage Service (Amazon S3) 存储桶,用于部署 Artifact 存储。

  • 角色 – 管道的源、构建和部署阶段具有的 IAM 角色可让其管理 Amazon 资源。应用程序的函数具有一个执行角色,此角色可让其上传日志并扩展以访问其他服务。

您的应用程序和管道资源是在可自定义和扩展的 Amazon CloudFormation 模板中定义的。您的应用程序存储库包含一个模板,可以修改该模板来添加 Amazon DynamoDB 表、Amazon API Gateway API 和其他应用程序资源。持续交付管道是在源代码控制之外的单独模板中定义的,并具有自己的堆栈。

管道将存储库中的单个分支映射到单个应用程序堆栈。您可以创建其他管道来为同一存储库中的其他分支添加环境。此外,您还可以向管道添加阶段,以进行测试、暂存和手动审批。有关 Amazon CodePipeline 的更多信息,请参阅什么是 Amazon CodePipeline

先决条件

本教程假设您对 Lambda 基本操作和 Lambda 控制台有一定了解。如果您还没有了解,请按照 使用控制台创建 Lambda 函数 中的说明创建您的第一个 Lambda 函数。

要完成以下步骤,您需要 Amazon Command Line Interface(Amazon CLI)版本 2。在单独的数据块中列出了命令和预期输出:

aws --version

您应看到以下输出:

aws-cli/2.13.27 Python/3.11.6 Linux/4.14.328-248.540.amzn2.x86_64 exe/x86_64.amzn.2

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

在 Linux 和 macOS 中,可使用您首选的 shell 和程序包管理器。

注意

在 Windows 中,操作系统的内置终端不支持您经常与 Lambda 一起使用的某些 Bash CLI 命令(例如 zip)。安装 Windows Subsystem for Linux,获取 Ubuntu 和 Bash 与 Windows 集成的版本。本指南中的示例 CLI 命令使用 Linux 格式。如果您使用的是 Windows CLI,则必须重新格式化包含内联 JSON 文档的命令。

本教程 CodeCommit 用于源代码控制。要设置本地计算机以访问和更新应用程序代码,请参阅《Amazon CodeCommit 用户指南》中的设置

创建应用程序

在 Lambda 控制台中创建应用程序。在 Lambda 中,应用程序是一个具有 Amazon CloudFormation 函数和任意数量的支持资源的 Lambda 堆栈。在本教程中,您将创建一个具有函数及其执行角色的应用程序。

创建应用程序
  1. 打开 Lambda 控制台的应用程序页面

  2. 选择创建应用程序

  3. 选择从头开始编写

  4. 配置应用程序设置。

    • 名称my-app

    • 运行时Node.js 18.x

    • 模板格式Amazon SAM(YAML)

    • 源代码控制服务CodeCommit.

    • 存储库名称my-app-repo

    • 权限创建角色和权限边界

  5. 选择创建

Lambda 创建管道和相关资源,并将示例应用程序代码提交到 Git 存储库。在创建资源时,它们将显示在概览页面上。


        在部署期间启动应用程序资源。

基础设施堆栈包含存储库、构建项目和其他资源,这些资源组合起来形成持续交付管道。当此堆栈完成部署时,它会转而部署包含函数和执行角色的应用程序堆栈。这些是显示在资源下的应用程序资源。

调用函数

部署过程完成后,从 Lambda 控制台调用函数。

调用应用程序的函数
  1. 打开 Lambda 控制台的 Applications(应用程序)页面。

  2. 选择 my-app

  3. 资源下,选择helloFromLambda函数

  4. 选择 Test(测试)。

  5. 配置测试事件。

    • 事件名称event

    • 主体{}

  6. 选择 Create(创建)。

  7. 选择 Test(测试)。

Lambda 控制台运行您的函数并显示结果。展开结果下的 Details (详细信息) 部分以查看输出和执行详细信息。


        测试调用的输出。

添加 Amazon 资源

在上一步中,Lambda 控制台创建了一个包含函数代码、模板和构建规范的 Git 存储库。您可以通过修改模板并将更改推送到存储库来向应用程序添加资源。要获取本地计算机上的应用程序副本,请克隆存储库。

克隆项目存储库
  1. 打开 Lambda 控制台的 Applications(应用程序)页面。

  2. 选择 my-app

  3. 选择 Code (代码)

  4. Repository details (存储库详细信息) 下,复制 HTTP 或 SSH 存储库 URI,具体取决于您在设置期间配置的身份验证模式。

  5. 要克隆存储库,请使用 git clone 命令。

    git clone ssh://git-codecommit.us-east-2.amazonaws.com/v1/repos/my-app-repo

要向应用程序添加 DynamoDB 表,请在模板中定义 AWS::Serverless::SimpleTable 资源。

添加 DynamoDB 表
  1. 在文本编辑器中打开 template.yml

  2. 添加一个表资源、一个将表名传递到函数的环境变量以及一个允许函数对其进行管理的权限策略。

    例 template.yml - 资源
    ... Resources: ddbTable: Type: AWS::Serverless::SimpleTable Properties: PrimaryKey: Name: id Type: String ProvisionedThroughput: ReadCapacityUnits: 1 WriteCapacityUnits: 1 helloFromLambdaFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./ Handler: src/handlers/hello-from-lambda.helloFromLambdaHandler Runtime: nodejs18.x MemorySize: 128 Timeout: 60 Description: A Lambda function that returns a static string. Environment: Variables: DDB_TABLE: !Ref ddbTable Policies: - DynamoDBCrudPolicy: TableName: !Ref ddbTable - AWSLambdaBasicExecutionRole
  3. 提交并推送更改。

    git commit -am "Add DynamoDB table" git push

在推送更改时,它会触发应用程序的管道。使用应用程序屏幕的 Deployments (部署) 选项卡在更改流经管道时进行跟踪。在部署完成后,继续执行下一步。


        在 Lambda 控制台中监控应用程序部署。

更新权限边界

示例应用程序将权限边界 应用于其函数的执行角色。权限边界将限制可添加到函数角色的权限。在没有边界的情况下,对项目存储库具有写访问权的用户可以修改项目模板,以向函数授予访问示例应用程序范围之外的资源和服务的权限。

要让函数使用您在上一步中添加到其执行角色的 DynamoDB 权限,您必须扩展权限边界以允许其他权限。Lambda 控制台将检测不在权限边界内的资源,并提供可用于更新资源的更新后的策略。

更新应用程序的权限边界
  1. 打开 Lambda 控制台的 Applications(应用程序)页面。

  2. 选择您的应用程序。

  3. 资源下,选择编辑权限边界

  4. 按照显示的说明操作来更新边界以允许访问新表。

有关权限边界的更多信息,请参阅使用 Amazon Lambda 应用程序的权限边界

更新函数代码

接下来,更新函数代码以使用表。以下代码使用 DynamoDB 表来追踪函数的每个实例所处理的调用次数。它使用日志流 ID 作为函数实例的唯一标识符。

更新函数代码
  1. 将名为 index.js 的新处理程序添加到包含以下内容的 src/handlers 文件夹中。

    例 src/handlers/index.js
    const dynamodb = require('aws-sdk/clients/dynamodb'); const docClient = new dynamodb.DocumentClient(); exports.handler = async (event, context) => { const message = 'Hello from Lambda!'; const tableName = process.env.DDB_TABLE; const logStreamName = context.logStreamName; var params = { TableName : tableName, Key: { id : logStreamName }, UpdateExpression: 'set invocations = if_not_exists(invocations, :start) + :inc', ExpressionAttributeValues: { ':start': 0, ':inc': 1 }, ReturnValues: 'ALL_NEW' }; await docClient.update(params).promise(); const response = { body: JSON.stringify(message) }; console.log(`body: ${response.body}`); return response; }
  2. 打开应用程序模板,然后将处理程序值更改为 src/handlers/index.handler

    例 template.yml
    ... helloFromLambdaFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./ Handler: src/handlers/index.handler Runtime: nodejs8.x
  3. 提交并推送更改。

    git add . && git commit -m "Use DynamoDB table" git push

在部署代码更改后,调用函数几次以更新 DynamoDB 表。

查看 DynamoDB 表
  1. 打开 DynamoDB 控制台中“Tables (表)”页面

  2. 选择以 my-app 开头的表。

  3. 选择 Items (项目)

  4. 选择 Start search (开始搜索)


        显示函数实例已处理事件的次数的 DynamoDB 表。

Lambda 会创建函数的其他实例来处理多个并发调用。Logs 日志组中的每个 CloudWatch 日志流都对应一个函数实例。当您更改函数的代码或配置时,也会创建一个新的函数实例。有关扩展的更多信息,请参阅Lambda 函数扩展

后续步骤

定义应用程序资源的 Amazon CloudFormation 模板使用 Amazon Serverless Application Model 转换来简化资源定义的语法,并自动上传部署包和其他构件。Amazon SAM 还提供了一个命令行界面 (Amazon SAM CLI),该界面具有与 Amazon CLI 相同的打包和部署功能,并具有特定于 Lambda 应用程序的其他功能。使用 Amazon SAM CLI 可在模拟 Lambda 执行环境的 Docker 容器中本地测试您的应用程序。

Amazon Cloud9 提供了一个包含 Node.js、Amazon SAM CLI 和 Docker 的在线开发环境。利用 Amazon Cloud9,您可以快速开始开发并从任何计算机访问您的开发环境。有关说明,请参阅《Amazon Cloud9 用户指南》中的入门

对于本地开发,适用于集成开发环境 (IDE) 的 Amazon 工具包可让您在将函数推送到存储库之前对函数进行测试和调试。

故障排除

在您开发应用程序时,可能会遇到以下类型的错误。

  • 构建错误 – 在构建阶段出现的问题,包括编译、测试和打包错误。

  • 部署错误 – 在 Amazon CloudFormation 无法更新应用程序堆栈时出现的问题。其中包括权限错误、账户配额、服务问题或模板错误。

  • 调用错误 – 由函数的代码或运行时返回的错误。

对于构建和部署错误,您可以在 Lambda 控制台中确定导致错误的原因。

纠正应用程序错误
  1. 打开 Lambda 控制台的 Applications(应用程序)页面。

  2. 选择应用程序。

  3. 选择部署

  4. 要查看应用程序的管道,请选择部署管道

  5. 确定遇到了错误的操作。

  6. 要在上下文中查看错误,请选择详细信息

对于ExecuteChangeSet操作期间发生的部署错误,管道会链接到Amazon CloudFormation控制台中的堆栈事件列表。搜索状态为 UPDATE_FAILED 的事件。由于 Amazon CloudFormation 在出现错误后回滚,因此相关事件在列表中位于其他几个事件的下方。如果 Amazon CloudFormation 无法创建更改集,则错误将显示在更改集而非事件下。

导致部署和调用错误的一个常见原因是缺少一个或多个角色中的权限。管道具有用于部署的角色 (CloudFormationRole),该角色与将用于直接更新 Amazon CloudFormation 堆栈的用户权限具有相同的效用。如果向应用程序添加资源或启用需要用户权限的 Lambda 功能,则将使用部署角色。您可以在应用程序概述中的基础设施下找到指向部署角色的链接。

如果您的函数访问其他 Amazon 服务或资源,或者如果您启用要求该函数具有额外权限的功能,则将使用该函数的执行角色。在应用程序模板中创建的所有执行角色也受应用程序权限边界的约束。此边界要求您在向模板中的执行角色添加权限后,明确授予对 IAM 中的其他服务和资源的访问权限。

例如,要将函数连接到 Virtual Private Cloud (VPC),您需要用户权限才能描述 VPC 资源。执行角色需要权限才能管理网络接口。这需要执行以下步骤。

  1. 将所需的用户权限添加到 IAM 中的部署角色。

  2. 将执行角色权限添加到 IAM 中的权限边界。

  3. 将执行角色权限添加到应用程序模板中的执行角色。

  4. 提交并推送以部署更新后的执行角色。

在纠正权限错误后,请在管道概述中选择发布更改以重新运行构建和部署。

清除

您可以继续进行修改并使用示例来开发您自己的应用程序。如果已使用示例完成此操作,请删除应用程序以避免为管道、存储库和存储付费。

删除应用程序
  1. 打开 Amazon CloudFormation 控制台

  2. 删除应用程序堆栈 – my-app

  3. 打开 Amazon S3 控制台

  4. 删除工件存储桶 — us-east-2-123456789012- my-app-pipe

  5. 返回Amazon CloudFormation控制台并删除基础架构堆栈 — serverlessrepo-my-app-toolchain.

函数日志与 Amazon CloudFormation 中的应用程序或基础设施堆栈不关联。在日志控制台中单独删除 CloudWatch 日志组。

删除日志组
  1. 打开 Amazon CloudWatch 控制台的日志组页面

  2. 选择函数的日志组 (/aws/lambda/my-app-helloFromLambdaFunction-YV1VXMPLK7QK)。

  3. 选择操作,然后选择删除日志组

  4. 选择是,删除