CI/CD、AWS 和无服务器:我从惨痛经历中学到的 5 个技巧

2025-06-07

CI/CD、AWS 和无服务器:我从惨痛经历中学到的 5 个技巧

那么您想在 AWS 上构建无服务器应用程序吗?

太棒了!有很多很棒的帖子教你如何入门。

但是,如何将应用程序从笔记本电脑转移到云端呢?你可以压缩代码,然后在每次更改内容时手动将其上传到 AWS 控制台,但这很快就会过时。

您可能需要的是某种 CI/CD(持续集成/持续交付)系统,当您将更改推送到源代码控制存储库时,代码会自动测试并发布到您的环境中。

CI/CD 管道示例
CI/CD 管道示例

多年来,我一直在 AWS 上为无服务器架构构建 CI/CD 流水线,并在此过程中积累了一些经验。以下五个技巧,我希望在我刚开始的时候就有人告诉我。

在本地测试代码并在云端测试服务

有几种方法可以在本地开发人员机器上运行 Lambda 函数 - 例如,无服务器框架的无服务器离线插件或AWS SAM CLI

这对于快速测试代码更改非常有效。但无服务器应用远不止代码:在将服务粘合在一起构建真正的云原生应用的过程中,权限、服务配置和其他方面都可能出错。

所以,本地测试是不够的。集成的外部服务越多,需要模拟的服务就越多,测试就越不真实。你测试的是一个根本不存在的系统。

希望和梦想

相反,我的经验法则是在本地测试代码,在云端测试服务。这可能涉及以下步骤:

  1. 在 AWS 中进行初始部署,其中包含代码所依赖的服务的定义(例如,部署底层 IAM 角色或 DynamoDB 表)。
  2. 在开发和测试代码时在本地运行您的 Lambda 函数,并与云服务联系以获取依赖项。

这样,您可以快速迭代代码,但如果云端出现问题,您也会立即知道!当您的 Lambda 函数在本地按预期运行时,您也可以将其推送到云端,在那里您应该……

优先进行端到端功能测试,而不是单元测试

一般来说,我们希望在无服务器世界中编写更少的代码。在 AWS 中,使用大部分配置就能编写出一个有用的服务。例如,你可以仅使用 API 网关和 DynamoDB构建一个 CRUD API ,无需中间使用 Lambda 函数。

您获得的“无服务器”越多,可用于单元测试的代码就越少,并且您越需要依赖已部署基础设施的测试。

最近我一直在使用Cypress对无服务器 API 进行端到端测试。它是一个 JavaScript 测试框架,可以与 Jest 和 Chai 等断言库配合使用。您可以直接查询 API,无需了解代码内部知识。这是以用户体验的方式测试您的服务,因此您可以确保您的期望与现实相符。

如果您想直接测试 AWS 资源,一个很酷的项目是 Erez Rokah 的AWS 测试库,它可以让您直接针对已部署的资源(如 DynamoDB 表或 SQS 队列)编写测试。

当然,如果你正在编写测试,你需要一些地方来运行它们。AWS 提供了一个名为 CodeBuild 的托管构建服务,你应该关注一下,因为……

AWS CodeBuild 被严重低估

您是否曾经需要照看一个构建服务器,它经常因为一个恶意作业耗尽所有磁盘空间而崩溃?这显然不是什么“无服务器”的做法。

哎呀!

幸运的是,AWS CodeBuild 会为每次构建作业调用启动一个完全独立的基于 Docker 的构建环境。这完全是临时计算,只需按实际使用量付费,而且价格相当便宜——每月 500 分钟的构建时间只需 2 美元。容器初始化可能需要几秒钟,但这比管理一个随时可能崩溃的构建运行器池要好得多。

一旦您拥有了 CodeBuild,您就应该看看另一个面向开发人员的 AWS 工具,因为……

AWS CodePipeline 是管理 CloudFormation 发布的最佳方式

CloudFormation 是 AWS 的基础设施即配置服务:您可以创建一个模板来定义您的 Lambda 函数、IAM 角色等。(无服务器应用程序模型,即 SAM,可以更轻松地在 AWS 上定义无服务器应用程序,它只是 CloudFormation 加上一点特殊功能。)

另一件让我经常烦心的 CI/CD 事情是编写脚本来轮询 AWS CloudFormation 以获取更新。CodePipeline 非常擅长帮我做这件事。因此,我可以放心地使用它来管理我的无服务器基础设施部署,从开发环境到预发布环境,再到生产环境。

当然,这些服务都存在一些问题。我现在要提醒大家的最重要的一点是:

CodePipeline 仅支持每个管道一个分支(至少目前如此)

毫无疑问,这种情况终有一天会改变,但目前你只能从一个源(例如存储库分支)触发 CodePipeline。如果你有基于分支的工作流,这很快就会让人感到沮丧。

一种解决方法是使用 Lambda 函数为每个分支动态创建一个新的 CodePipeline,这种方法在 Trek10 中效果很好——以至于我们最近将这个想法开源为 AWS Quickstart。该 Quickstart 包含启动动态 CodePipeline 所需的 CloudFormation 模板,其中包括 CodeBuild 作业、Lambda 测试等等——所以你还在等什么?赶紧尝试一下吧,如果有其他问题,请在评论区留言。

文章来源:https://dev.to/trek10inc/ci-cd-aws-and-serverless-5-tips-i-learned-the-hard-way-223p
PREV
动态规划 vs. 分治法,或者更进一步的分治法
NEXT
介绍 AWS Amplify 的无服务器功能 关于无服务器工具的小故事 添加 API