CI/CD、AWS 和无服务器:我从惨痛经历中学到的 5 个技巧
那么您想在 AWS 上构建无服务器应用程序吗?
太棒了!有很多很棒的帖子教你如何入门。
但是,如何将应用程序从笔记本电脑转移到云端呢?你可以压缩代码,然后在每次更改内容时手动将其上传到 AWS 控制台,但这很快就会过时。
您可能需要的是某种 CI/CD(持续集成/持续交付)系统,当您将更改推送到源代码控制存储库时,代码会自动测试并发布到您的环境中。
多年来,我一直在 AWS 上为无服务器架构构建 CI/CD 流水线,并在此过程中积累了一些经验。以下五个技巧,我希望在我刚开始的时候就有人告诉我。
在本地测试代码并在云端测试服务
有几种方法可以在本地开发人员机器上运行 Lambda 函数 - 例如,无服务器框架的无服务器离线插件或AWS SAM CLI。
这对于快速测试代码更改非常有效。但无服务器应用远不止代码:在将服务粘合在一起构建真正的云原生应用的过程中,权限、服务配置和其他方面都可能出错。
所以,本地测试是不够的。集成的外部服务越多,需要模拟的服务就越多,测试就越不真实。你测试的是一个根本不存在的系统。
相反,我的经验法则是在本地测试代码,在云端测试服务。这可能涉及以下步骤:
- 在 AWS 中进行初始部署,其中包含代码所依赖的服务的定义(例如,部署底层 IAM 角色或 DynamoDB 表)。
- 在开发和测试代码时在本地运行您的 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