使用 Terraform 和 Azure 进行符合性测试

使用 Terraform 可以定义、预览和部署云基础结构。 使用 Terraform 时,请使用 HCL 语法来创建配置文件。 利用 HCL 语法,可指定 Azure 这样的云提供程序和构成云基础结构的元素。 创建配置文件后,请创建一个执行计划,利用该计划,可在部署基础结构更改之前先预览这些更改。 验证了更改后,请应用该执行计划以部署基础结构。

在很多时候,符合性测试是持续集成过程的一部分,用于确保遵循用户定义的策略。 例如,可定义 Azure 资源的地缘政治命名约定。 另一个常见示例是根据所定义的部分映像创建虚拟机。 符合性测试会用于在这些及其他很多方案中强制实施规则。

在本文中,学习如何:

  • 了解何时采用符合性测试
  • 了解如何执行符合性测试
  • 查看和运行示例符合性测试

1.配置环境

  • Azure 订阅:如果没有 Azure 订阅,请在开始之前创建一个免费帐户。
  • Docker:安装 Docker

  • Python:安装 Python

  • Terraform 符合性工具:运行以下命令来安装 Terraform 符合性工具:pip install terraform-compliance

  • 示例代码和资源:使用 DownGit 工具从 GitHub 下载 compliance-testing project,并将其解压缩到新的目录中,使其包含示例代码。 此目录被称为“示例目录”

2. 了解符合性测试和符合性检查

符合性测试是一种非功能性测试技术,用于确定系统是否符合规定的标准。 合规性测试也称为一致性测试

大多数软件团队会进行分析来检查标准是否得到恰当地采用和实施。 通常,这些团队共同协作来提升标准,这转而又会促进质量的提升。

执行符合性测试时,需要考虑两个主要概念:符合性测试和符合性检查。

  • 符合性测试可确保每个开发生命周期阶段的结果符合商定的要求
  • 在项目开始时,应将符合性检查集成到开发周期中。 如果要求本身未得到充分记录,那么尝试在稍后的阶段添加符合性检查会变得愈发困难。

执行符合性检查非常简单。 我们针对开发生命周期的每个阶段制定和记录了一套标准和流程。 每个阶段的结果都与记录的要求进行比较。 测试结果是指不符合预定标准的任何“差距”。 通过检查过程完成符合性测试,评审过程的结果应记录下来。

我们来看一个具体的示例。

一个常见的问题是,当多名开发人员应用不兼容的更改时,环境会崩溃。 假设有个人进行更改并应用了资源,例如在测试环境中创建虚拟机 (VM)。 之后,另一个人应用了不同版本的代码来预配该 VM 的另一版本。 需要在这里进行监督,确保符合设定规则。

要解决此问题,一种方法是定义标记资源的策略,例如使用 rolecreator 标记。 定义策略后,Terraform-compliance 之类的工具被采用来确保遵循策略。

Terraform-compliance 侧重于负面测试。 负面测试是确保系统可正常处理意外输入或不需要的行为的过程。 模糊处理就是一种负面测试。 通过模糊处理,接收输入的系统会经过测试,以确保它可安全地处理意外的输入。

幸运的是,Terraform 是任何创建、更新或销毁云基础结构实体的 API 的抽象层。 Terraform 还确保本地配置和远程 API 响应处于同步状态。由于 Terraform 主要用于云 API,因此我们仍然需要一种方法来确保针对基础结构部署的代码遵循特定的策略。 Terraform-compliance 是一种免费的开源工具,它为 Terraform 配置提供了此功能。

使用 VM 示例时,符合性策略可能如下所示:“如果要创建 Azure 资源,则它必须包含标记”。

Terraform-compliance 工具提供了一个测试框架,你可在该框架中创建与示例类似的策略。 然后,你可针对 Terraform 执行计划运行这些策略。

通过 Terraform-compliance 可应用 BDD(即行为驱动开发)原则。 BDD 是一个协作过程;在此过程中,所有利益干系人相互协作,共同定义系统应执行的操作。 这些利益干系人通常包括开发人员、测试人员,以及对正在开发的系统有既得利益或将受其影响的任何人。 BDD 的目标是鼓励团队创建具体的示例,来表达对系统行为的共识。

3. 检查符合性测试示例

在本文前面的部分,你了解了为测试环境创建 VM 的符合性测试示例。 本部分介绍如何将该示例转换为 BDD 功能和方案。 首先使用 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. 运行符合性测试示例

在本部分中,你将下载并测试示例。

  1. 在示例目录中,导航到 src 目录。

  2. 运行 terraform init,将工作目录进行初始化。

    terraform init
    
  3. 运行 terraform validate 来验证配置文件的语法。

    terraform validate
    

    要点

    • 你会看到一条消息,它指出 Terraform 配置有效。
  4. 运行 terraform plan 以创建执行计划。

    terraform plan -out main.tfplan
    
  5. 若要将执行计划转换为符合性步骤的 JSON,请运行 terraform show

    terraform show -json main.tfplan > main.tfplan.json
    
  6. 运行 docker pull 以下载 terraform-compliance 映像。

    docker pull eerkunt/terraform-compliance
    
  7. 运行 docker run 以在 docker 容器中运行测试。

    docker run --rm -v $PWD:/target -it eerkunt/terraform-compliance -f features -p main.tfplan.json
    

    要点

    • 测试将失败,原因是虽然要求存在标记的第一条规则成功,而由于缺少 RoleCreator 标记,第二条规则会失败。

    Example of a failed test

  8. 按如下所示修改 main.tf(添加 RoleCreator 标记)来修复错误。

      tags = {
        Environment = "dev"
        Application = "Azure Compliance"
        Creator     = "Azure Compliance"
        Role        = "Azure Compliance"
      } 
    
    

    要点

    • 配置现在符合策略。

5. 验证结果

  1. 再次运行 terraform validate 以验证语法。

    terraform validate
    
  2. 再次运行 terraform plan 以创建新的执行计划。

    terraform plan -out main.tfplan
    
  3. 若要将执行计划转换为符合性步骤的 JSON,请运行 terraform show

    terraform show -json main.tfplan > main.tfplan.json
    
  4. 再次运行 docker run 以测试配置。 如果已实施完整规范,则测试会成功。

    docker run --rm -v $PWD:/target -it eerkunt/terraform-compliance -f features -p main.tfplan.json
    

    Example of a successful test

  5. 运行 terraform apply 以应用执行计划。

    terraform apply main.tfplan -target=random_uuid.uuid
    

    要点

    • 创建一个资源组,名称采用 rg-hello-tf-<random_number> 模式。

Azure 上的 Terraform 故障排除

排查在 Azure 上使用 Terraform 时遇到的常见问题

后续步骤