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.