How to Automate Test for your Infrastructure as Code ============================================================================== 首先我们要弄明白, 为什么要对 IAC (基础架构即代码) 进行测试, 以及我们在测什么? 1. 基础架构是为你的 App 服务的, 必须要配合 App 进行测试 ------------------------------------------------------------------------------ 一个基础架构可能包括 网络, 虚拟机, 数据存储, 数据库. 而 App 则需要使用到这些资源. 所以只有让 App 使用你的基础架构, 你才能知道你的 IAC 是否有效. 而问题恰恰出在这里. 我们需要额外配置一个 App 才能对我们的 IAC 充分测试. 配置一个 App 可不是简单的事情. 2. 基础架构的各个资源需要既能各自独立运转, 又能相互配合 ------------------------------------------------------------------------------ 我们以 Web App 为例来说明. 一个 Web App 用到的主要资源包括: 1. 虚拟机 2. 数据库 3. 负载均衡 各个模块独立来看: 1. 虚拟机 需要能够承载你的 Web App 代码, 比如你的 Web App 是 Python 写的, 那么 Python 环境需要配置好. 你可以测试该虚拟机是否能够运行 Python 命令, 安装依赖即可. 2. 数据库 需要可用, 只要能连接数据库, 并运行几个 SQL, 那么数据库模块可以算是可用了. 3. 负载均衡 需要允许从公网进行访问. 各个模块结合来看: 1. 虚拟机 的权限设置 需要能够跟数据库通信, 网络防火墙设置需要能够允许 HTTP 访问, 阻挡其他访问. 2. 数据库 需要能够被私网上的服务器访问, 且不允许公网访问. 3. 负载均衡 需要能将请求转发给 虚拟机. 3. IAC 代码要怎么写? ------------------------------------------------------------------------------ 首先你的 IAC 代码一定要支持 multi env, 也就是支持独立部署到多个互相隔离的环境中. 在 dev 和 test 环境中, 我们可以使用 conditional resource 的方案, 当 ``if ENV in ["dev", "test"]`` 时, 我们可以创建一个用于测试的虚拟机, 然后用 ssh 远程执行一些 shell command 代码, 看看能不能运行 Python, 以及能不能跟数据库进行通信. 而在 production 环境中, 我们则不需要这些资源. 简单来说, 你的 IAC 代码在测试环境中, 在部署的时候同时部署一些额外的资源用于测试. 4. IAC 的测试代码要怎么写? ------------------------------------------------------------------------------ 对于 Computation 类的资源, 你需要能够连接到环境中, 然后在这个环境中执行一些测试. 有很多方法可以实现这一点. 比如用 Python Fabric 连接 AWS EC2. 比如用 boto3 远程调用 AWS Lambda.