使用 Terraform 和 Azure 實作合規性測試
Terraform 可讓您定義、預覽和部署雲端基礎結構。 使用 Terraform 時,您可以使用 HCL 語法來建立設定檔。 HCL 語法可讓您指定雲端提供者 (例如 Azure) 和構成雲端基礎結構的元素。 建立設定檔之後,您可以建立執行計畫,讓您先預覽基礎結構變更,之後再部署。 驗證變更之後,您可以套用執行計畫來部署基礎結構。
許多時候,合規性測試是持續整合程式的一部分,並用來確保遵循使用者定義的原則。 例如,您可以定義 Azure 資源的地緣政治命名慣例。 另一個常見範例是從已定義的映像子集建立虛擬機。 合規性測試將用來在這些和其他許多案例中強制執行規則。
在本文中,您將學會如何:
- 瞭解使用合規性測試的時機
- 瞭解如何進行合規性測試
- 查看並執行範例合規性測試
1.設定環境
- Azure 訂用帳戶:如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
設定 Terraform:如果您尚未這麼做,請使用下列其中一個選項來設定 Terraform:
Docker:安裝 Docker。
Python:安裝 Python。
Terraform-compliance 工具: 執行下列命令來安裝 Terraform 合規性工具:
pip install terraform-compliance
。範例程式代碼和資源: 使用 DownGit 工具,從 GitHub 下載合規性測試專案 ,然後解壓縮到新的目錄,以包含範例程式代碼。 此目錄稱為 範例目錄。
2.瞭解合規性測試和檢查
合規性測試是一種非功能性測試技術,可判斷系統是否符合規定的標準。 合規性測試也稱為 一致性測試。
大部分的軟體小組都會進行分析,以檢查標準是否已正確強制執行並實作。 通常同時努力提高標準,進而提高品質。
透過合規性測試,有兩個重要概念需要考慮:合規性測試和合規性檢查。
- 合規性測試 可確保每個開發生命週期階段的輸出都符合已同意的需求。
- 合規性檢查 應該在項目開始時整合到開發週期中。 當需求本身尚未充分記載時,嘗試在稍後階段新增合規性檢查會變得越來越困難。
進行合規性檢查是直接的。 針對開發生命週期的每個階段,會開發並記錄一組標準和程式。 每個階段的輸出都會與記載的需求進行比較。 測試結果是不符合預先決定標準的任何「差距」。 合規性測試是透過檢查程式完成,而且應該記錄檢閱程序的結果。
讓我們看看特定範例。
常見的問題是當多個開發人員套用不相容變更時中斷的環境。 假設一個人在變更上運作,並套用資源,例如在測試環境中建立 VM。 接著,另一個人會套用不同版本的程序代碼,以布建該 VM 的不同版本。 這裡需要的是監督,以確保符合規定的規則。
解決此問題的其中一種方法是定義標記資源的原則,例如使用 role
和 creator
標記。 定義原則之後,會使用 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.執行合規性測試範例
在本節中,您會下載並測試範例。
在範例目錄中,流覽至
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
和Creator
標籤失。
- 測試將會失敗,因為第一個需要標籤的規則成功時,第二個規則會失敗,因為
依照下列方式修改來修正
main.tf
錯誤(新增和Creator
標記的位置Role
)。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 時的常見問題進行疑難排解