使用 Terraform 可以定义、预览和部署云基础结构。 使用 Terraform 时,请使用 HCL 语法来创建配置文件。 HCL 语法允许你指定云提供商(如 Azure)和构成云基础结构的元素。 创建配置文件后,请创建一个执行计划,利用该计划,可在部署基础结构更改之前先预览这些更改。 验证更改后,应用执行计划来部署基础结构。
很多时候,合规性测试是持续集成过程的一部分,用于确保遵循用户定义的策略。 例如,可以定义 Azure 资源的地缘政治命名约定。 另一个常见示例是从定义的映像子集创建虚拟机。 合规性测试将用于在这些场景和许多其他场景中执行规则。
在这篇文章中,你将学会如何:
- 了解何时使用合规性测试
- 了解如何进行合规性测试
- 查看并运行示例合规性测试
1.配置环境
- Azure 订阅:如果没有 Azure 订阅,请在开始之前创建 一个免费帐户 。
配置 Terraform:如果尚未执行此操作,请使用以下选项之一配置 Terraform:
Docker:安装 Docker。
Python:安装 Python。
Terraform-compliance 工具: 通过运行以下命令安装 Terraform 合规性工具:
pip install terraform-compliance
。示例代码和资源: 使用 DownGit 工具,从 GitHub 下载 compliance-testing 项目 并解压缩到新目录中以包含示例代码。 此目录称为 示例目录。
2. 了解合规性测试和检查
一致性测试是一种非功能性测试技术,用于确定系统是否符合规定的标准。 合规性测试也称为 一致性测试。
大多数软件团队都会进行分析,以检查标准是否得到正确执行和实施。 通常同时工作以提高标准,从而提高质量。
对于合规性测试,需要考虑两个重要概念:合规性测试和合规性检查。
- 合规性测试 可确保每个开发生命周期阶段的输出都符合商定的要求。
- 在项目开始时,应将合规性检查纳入开发周期。 当需求本身没有得到充分记录时,尝试在后期添加合规性检查会变得越来越困难。
进行合规性检查非常简单。 为开发生命周期的每个阶段制定并记录了一组标准和程序。 将每个阶段的输出与记录的要求进行比较。 测试的结果是不符合预定标准的任何“差距”。 合规性测试是通过检查过程完成的,审查过程的结果应记录在案。
让我们看一个具体的例子。
一个常见问题是当多个开发人员应用不兼容的更改时,环境会中断。 假设一个人处理一项更改并应用资源,例如在测试环境中创建 VM。 然后,另一个人应用不同版本的代码,以预配该 VM 的不同版本。 这里需要的是监督,以确保符合规定的规则。
解决此问题的一种方法是定义标记资源的策略 - 例如 with role
和 creator
tags。 定义策略后,将使用 Terraform-compliance 等工具来确保遵循策略。
Terraform-compliance 侧重于 负面测试。 否定测试是确保系统能够正常处理意外输入或不需要的行为的过程。 模糊测试 就是负面测试的一个示例。 使用模糊测试,将测试接收输入的系统,以确保它能够安全地处理意外输入。
幸运的是,Terraform 是任何创建、更新或销毁云基础设施实体的 API 的抽象层。 Terraform 还确保本地配置和远程 API 响应同步。由于 Terraform 主要用于 Cloud API,因此我们仍然需要一种方法来确保针对基础设施部署的代码遵循特定的策略。 Terraform-compliance - 一个免费的开源工具 - 为 Terraform 配置提供此功能。
使用 VM 示例,合规性策略可能如下所示:“如果要创建 Azure 资源,它必须包含标记”。
Terraform-compliance 工具提供了一个测试框架,您可以在其中创建类似于示例的策略。 然后,您可以根据 Terraform 执行计划运行这些策略。
Terraform-compliance 允许您应用 BDD 或 行为驱动开发原则。 BDD 是一个协作过程,所有利益相关者共同定义系统应该做什么。 这些利益相关者通常包括开发人员、测试人员以及对正在开发的系统有既得利益或将受其影响的任何人。 BDD 的目标是鼓励团队构建具体示例,以表达对系统应该如何运行的共同理解。
3. 检查合规性测试示例
在本文前面,您阅读了为测试环境创建 VM 的合规性测试示例。 本节介绍如何将该示例转换为 BDD 功能和方案。 该规则首先使用 Cucumber 表示,Cucumber 是用于支持 BDD 的工具。
when creating Azure resources, every new resource should have a tag
前面的规则翻译如下:
If the resource supports tags
Then it must contain a tag
And its value must not be null
然后,Terraform HCL 代码将遵守以下规则。
resource "random_uuid" "uuid" {}
resource "azurerm_resource_group" "rg" {
name = "rg-hello-tf-${random_uuid.uuid.result}"
location = var.location
tags = {
environment = "dev"
application = "Azure Compliance"
}
}
第一个策略可以编写为 BDD 功能方案 ,如下所示:
Feature: Test tagging compliance # /target/src/features/tagging.feature
Scenario: Ensure all resources have tags
If the resource supports tags
Then it must contain a tag
And its value must not be null
以下代码显示了特定标签的测试:
Scenario Outline: Ensure that specific tags are defined
If the resource supports tags
Then it must contain a tag <tags>
And its value must match the "<value>" regex
Examples:
| tags | value |
| Creator | .+ |
| Application | .+ |
| Role | .+ |
| Environment | ^(prod\|uat\|dev)$ |
4. 运行 compliance-test 示例
在本节中,您将下载并测试该示例。
在示例目录中,导航到该
src
目录。运行 terraform init 以初始化工作目录。
terraform init
运行 terraform validate 以验证配置文件的语法。
terraform validate
要点:
- 您会看到一条消息,指示 Terraform 配置有效。
运行 terraform plan 以创建执行计划。
terraform plan -out main.tfplan
运行 terraform show 将执行计划转换为合规性步骤的 JSON。
terraform show -json main.tfplan > main.tfplan.json
运行 docker pull 下载 terraform-compliance 映像。
docker pull eerkunt/terraform-compliance
运行 docker run 以在 Docker 容器中运行测试。
docker run --rm -v $PWD:/target -it eerkunt/terraform-compliance -f features -p main.tfplan.json
要点:
- 测试将失败,因为 - 虽然要求存在标记的第一条规则成功,但第二条规则失败,因为
Role
缺少 andCreator
标记。
- 测试将失败,因为 - 虽然要求存在标记的第一条规则成功,但第二条规则失败,因为
通过如下修改
main.tf
来修复错误(其中添加了 aRole
和Creator
tag)。tags = { Environment = "dev" Application = "Azure Compliance" Creator = "Azure Compliance" Role = "Azure Compliance" }
要点:
- 配置现在符合策略。
5. 验证结果
再次运行
terraform validate
以验证语法。terraform validate
再次运行
terraform plan
以创建新的执行计划。terraform plan -out main.tfplan
运行 terraform show 将执行计划转换为合规性步骤的 JSON。
terraform show -json main.tfplan > main.tfplan.json
再次运行 docker run 以测试配置。 如果已实现完整规范,则测试成功。
docker run --rm -v $PWD:/target -it eerkunt/terraform-compliance -f features -p main.tfplan.json
运行 terraform apply 来应用执行计划。
terraform apply main.tfplan -target=random_uuid.uuid
要点:
- 将创建一个资源组,其名称遵循以下模式:
rg-hello-tf-<random_number>
。
- 将创建一个资源组,其名称遵循以下模式:
Azure 上的 Terraform 故障排除
排查在 Azure 上使用 Terraform 时遇到的常见问题