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

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

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

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

  • 应用程序 – Node.js Lambda 函数、构建规范和 AWS 无服务器应用程序模型 (AWS SAM) 模板。

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

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

  • 触发器 – 一个 Amazon CloudWatch Events 规则,该规则监视存储库的主分支并触发管道。

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

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

  • 存储桶 – 用于部署构件存储的 Amazon Simple Storage Service (Amazon S3) 存储桶。

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

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

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

先决条件

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

为了遵循本指南中的步骤,您需要命令行终端或外壳,以便运行命令。命令显示在列表中,以提示符 ($) 和当前目录名称(如果有)开头:

~/lambda-project$ this is a command this is output

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

在 Linux 和 macOS 中,可使用您首选的外壳程序和程序包管理器。在 Windows 10 中,您可以 安装 Windows Subsystem for Linux,获取 Ubuntu 和 Bash 与 Windows 集成的版本。

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

创建应用程序

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

创建应用程序

  1. 打开 Lambda 控制台的“应用程序”页面

  2. 选择 Create application

  3. 选择 Author from scratch

  4. 配置应用程序设置。

    • Application name (应用程序名称)my-app

    • Application description (应用程序描述)my application

    • Runtime (运行时)Node.js 10.x

    • 源代码控制服务CodeCommit

    • 存储库名称my-app-repo

    • Permissions (权限)Create roles and permissions boundary (创建角色和权限边界)

  5. 选择 Create

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


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

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

调用函数

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

调用应用程序的函数

  1. 打开 Lambda 控制台的“应用程序”页面

  2. 选择 my-app

  3. Resources (资源) 下,选择 helloFromLambdaFunction

  4. 选择 Test

  5. 配置测试事件。

    • Event name (事件名称)event

    • Body (正文){}

  6. 选择 Create

  7. 选择 Test

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


        测试调用的输出。

添加 AWS 资源

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

克隆项目存储库

  1. 打开 Lambda 控制台的“应用程序”页面

  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: nodejs10.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. 提交并推送更改。

    ~/my-app-repo$ git commit -am "Add DynamoDB table" ~/my-app-repo$ git push

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


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

更新权限边界

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

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

更新应用程序的权限边界

  1. 打开 Lambda 控制台的“应用程序”页面

  2. 选择您的应用程序。

  3. Resources (资源) 下,选择 Edit permissions boundary (编辑权限边界)

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

有关权限边界的更多信息,请参阅使用 AWS 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: nodejs10.x
  3. 提交并推送更改。

    ~/my-app-repo$ git add . && git commit -m "Use DynamoDB table" ~/my-app-repo$ git push

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

查看 DynamoDB 表

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

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

  3. 选择 Items (项目)

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


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

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

后续步骤

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

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

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

故障排除

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

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

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

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

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

纠正应用程序错误

  1. 打开 Lambda 控制台的“应用程序”页面

  2. 选择应用程序。

  3. 选择 Deployments (部署)

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

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

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

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

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

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

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

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

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

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

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

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

清除

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

删除应用程序

  1. 打开 AWS CloudFormation 控制台

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

  3. 打开 Amazon S3 控制台

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

  5. 返回到 AWS CloudFormation 控制台并删除基础设施堆栈 – serverlessrepo-my-app-toolchain

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

删除日志组

  1. 打开 Amazon CloudWatch 控制台的 Log Groups (日志组) 页

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

  3. 选择 Actions (操作),然后选择 Delete log group (删除日志组)

  4. 选择 Yes, Delete