共用方式為


使用 Terraform 和 Azure 實作合規性測試

Terraform 可啟用雲端基礎結構的定義、預覽和部署。 使用 Terraform,您可以使用 HCL 語法建立組態檔。 HCL 語法可讓您指定雲端提供者,例如 Azure,以及構成雲端基礎結構的專案。 建立組態檔之後,您會建立一個 執行計劃 ,讓您在部署基礎結構變更之前先預覽這些變更。 驗證變更之後,您會套用執行計劃來部署基礎結構。

許多時候,合規性測試是持續整合程式的一部分,並用來確保遵循使用者定義的原則。 例如,您可以定義 Azure 資源的地緣政治命名慣例。 另一個常見範例是從已定義的映像子集建立虛擬機。 合規性測試將用來在這些和其他許多案例中強制執行規則。

在本文中,您將學會如何:

  • 瞭解使用合規性測試的時機
  • 瞭解如何進行合規性測試
  • 查看並執行範例合規性測試

1.設定您的環境

  • Azure 訂用帳戶:如果您沒有 Azure 訂用帳戶,請在開始之前建立 免費帳戶
  • Docker:安裝 Docker

  • Python:安裝 Python

  • Terraform-compliance 工具: 執行下列命令來安裝 Terraform 合規性工具: pip install terraform-compliance

  • 範例程式代碼和資源: 使用 DownGit 工具,從 GitHub 下載 合規性測試專案 ,然後解壓縮到新的目錄,以包含範例程式代碼。 此目錄稱為 範例目錄

2.瞭解合規性測試和檢查

合規性測試是一種非功能性測試技術,可判斷系統是否符合規定的標準。 合規性測試也稱為 一致性測試

大部分的軟體小組都會進行分析,以檢查標準是否已正確強制執行並實作。 通常同時努力提高標準,進而提高品質。

透過合規性測試,有兩個重要概念需要考慮:合規性測試和合規性檢查。

  • 合規性測試 可確保每個開發生命週期階段的輸出都符合已同意的需求。
  • 合規性檢查 應該在項目開始時整合到開發週期中。 當需求本身尚未充分記載時,嘗試在稍後階段新增合規性檢查會變得越來越困難。

進行合規性檢查是簡單的。 針對開發生命週期的每個階段,會開發並記錄一組標準和程式。 每個階段的輸出都會與記載的需求進行比較。 測試的結果是指出任何不符合預定標準的「差距」。 合規性測試是透過檢查程式完成,而且應該記錄檢閱程序的結果。

讓我們看看特定範例。

常見的問題是,當多個開發人員套用互不相容的變更時,環境會出現問題。 假設一個人在處理變更,並應用資源,例如在測試環境中建立虛擬機器。 接著,另一個人會套用不同版本的程序代碼,以布建該 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 計劃 以建立執行計劃。

    terraform plan -out main.tfplan
    
  5. 執行 terraform show ,將執行計劃轉換為合規性步驟的 JSON。

    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 標籤。

    失敗測試的範例

  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. 執行 terraform show ,將執行計劃轉換為合規性步驟的 JSON。

    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
    

    成功測試的範例

  5. 執行 terraform apply 以應用執行計劃。

    terraform apply main.tfplan -target=random_uuid.uuid
    

    要點:

    • 資源群組是以下列模式的名稱建立: rg-hello-tf-<random_number>

排除 Azure 上 Terraform 的故障

針對在 Azure 上使用 Terraform 時的常見問題進行疑難解答

後續步驟