共用方式為


使用 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。 接著,另一個人會套用不同版本的程序代碼,以布建該 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. 執行 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錯誤(新增和 Creator 標記的位置Role)。

      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 時的常見問題進行疑難排解

下一步