成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何使用Terratest測試基礎架構即代碼

譯文
開發 架構
本文簡要討論了什么是IaC以及測試基礎架構代碼的意義,然后深入探討了如何使用Terratest進行IaC測試。

譯者 | 布加迪

審校 | 孫淑娟

手動設置基礎架構是費時又費力的過程。這時候我們可以利用基礎架構即代碼(IaC)工具來自動管理基礎架構。IaC自動化可用于任何類型的基礎架構:虛擬機和存儲等。隨著越來越多的基礎架構變成代碼,有必要為IaC進行單元測試和集成測試。

本文簡要討論了什么是IaC以及測試基礎架構代碼的意義,然后深入探討了如何使用Terratest進行IaC測試。

一、基礎架構即代碼(IaC)

基礎架構即代碼是通過代碼配置和設置環境的過程,而不是通過GUI手動創建所需的基礎架構和支持系統。比如說,配置虛擬機、設置虛擬機并為其創建監控機制。Terraform、Packer和Ansible就是典型的IaC。借助基礎架構即代碼,您還可以將基礎架構跟蹤到Git等版本控制系統中,進行模塊化和模板化,以便在多個環境和地區重用相同的代碼。災難恢復是從基礎架構即代碼獲得的重要好處之一。有了IaC,您可以盡快在其他地區或環境復制基礎架構。

二、測試基礎架構代碼

IaC測試可以分為多個階段:

1.健全性或靜態分析

2.單元測試

3.集成測試

  • 健全性或靜態分析?

這是測試基礎架構代碼的初始階段。在靜態分析中,我們確保代碼有正確的語法。它還有助于確保我們的代碼符合行業標準,并遵循最佳實踐。Linter屬于這一類。幾款典型的健全性測試工具包括面向Chef的foodcritic、面向Docker的hadolint和面向Terraform的tflint等。

  • 單元測試?

借助單元測試,我們不用實際配置基礎架構即可評估代碼。比如可以限制容器以便以非root用戶身份運行,或者云網絡安全組應該只有TCP協議。幾個典型的單元測試是面向Terraform的Conftest和面向Chef Cookbooks的Chefspecs。

以非root用戶身份執行的Conftest例子:

package main

deny[msg] {

input.kind == "Deployment"

not input.spec.template.spec.securityContext.runAsNonRoot

msg := "Containers must not run as root"

}
  • 集成測試?

在集成測試中,我們希望通過將IaC實際部署到所需的環境中對其進行測試。比如說,您部署了一個虛擬機,并在該機器的端口80上托管Nginx服務器。因此,您將在部署之后檢查端口80是否在偵聽。

以下是使用ServerSpec執行該操作的例子:

describe port(80) do

it { should be_listening }

end

我們在本文中介紹使用Terrratest對基礎架構代碼進行集成測試。

三、Terratest是什么?我們可以用它來做什么?

Terratest是由Gruntwork開發的Go庫,可幫助您為使用Terraform或Packer編寫的基礎架構即代碼創建和自動化測試。它為您提供了各種任務所需的函數和模式,比如:

測試Docker鏡像、Helm圖和Packer模板。

允許與各種云提供商API兼容,比如AWS和Azure。

Terratest為基礎架構代碼執行健全性和功能測試。有了Terratest,您可以輕松識別當前基礎架構代碼中的問題并盡快解決問題。我們還可以利用Terratest對基礎架構進行合規測試,比如針對通過IaC創建的任何新S3存儲桶啟用版本控制和加密。

四、安裝Terratest所需的二進制文件

Terratest主要需要Terraform和Go來執行。我們在這篇博文中使用了Terraform版本1.0.0 和Go版本1.17.6進行測試。

  • 安裝Terraform?

按照Terraform網站的下載部分(https://www.terraform.io/downloads)在您的計算機上安裝Terraform,您可以使用軟件包管理器或下載二進制文件,并使其在PATH中可用。

安裝后,通過運行以下命令驗證是否已正確安裝:

terraform version

Go & test依賴項安裝可以通過以下步驟來完成:

  • 安裝Go?

您可以使用Linux發行版的軟件包管理器來安裝Go,或者遵照Go的安裝文檔(https://go.dev/doc/install)。

  • Go測試需要gcc來執行測試?

go test命令可能需要gcc,您可以使用發行版的軟件包管理器安裝它。比如在CentOS/Amazon Linux 2上,您可以使用yum install -y gcc。

五、Terratest實戰

現在,我們將使用Terratest執行一些集成測試。安裝步驟完成后,克隆terratest-sample存儲庫,開始執行Terratest。我們將先使用Go編寫測試并執行測試。

重要的事先說:

1.您的測試文件名稱應包含_test,比如sample_test.go。這是Go查找測試文件的方式。

2.您的測試函數名稱應以Test開頭,其中T大寫。比如說,TestFunction沒有問題,但testFunction會給出錯誤“沒有要運行的測試”。

  • 設置AWS身份驗證配置?

我們需要AWS憑證在AWS中設置基礎架構,可以使用環境變量或共享憑證文件進行配置。

基礎架構的Terraform代碼可以在組件的相應文件夾中找到。若是ec2,它位于ec2_instance下,若是API網關,它位于api_gateway文件夾下。Terratest將Terraform的output.tf的輸出作為測試的輸入。下面這個代碼段用于測試我們是否在使用的ec2實例上有相同的ssh密鑰。

package terratest
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/gruntwork-io/terratest/modules/terraform"
)
func TestEc2SshKey(t *testing.T) {
terraformOptions := terraform.WithDefaultRetryableErrors(t, &terraform.Options{
TerraformDir: "../terraform",
})
defer terraform.Destroy(t, terraformOptions)
terraform.InitAndApply(t, terraformOptions)
ec2SshKey := terraform.Output(t, terraformOptions, "instance_ssh_key") assert.Equal(t, "terratest", ec2SshKey)
}

我們將把它分成不同的部分以便理解:第一步,我們定義一個名為Terratest的Go軟件包,然后我們導入測試執行所需的不同軟件包。

package terratest
import (
"testing"
"github.com/stretchr/testify/assert" "github.com/gruntwork-io/terratest/modules/terraform"
)

一旦我們滿足了所有的先決條件,將創建一個函數來執行實際測試:

func TestEc2SshKey(t *testing.T) {
terraformOptions := terraform.WithDefaultRetryableErrors(t, &terraform.Options{
TerraformDir: "../terraform",
})
defer terraform.Destroy(t, terraformOptions)
terraform.InitAndApply(t, terraformOptions)
ec2SshKey := terraform.Output(t, terraformOptions, "instance_ssh_key") assert.Equal(t, "terratest", ec2SshKey)
}

借助以下部分,我們定義了Terratest應該在其中查找Terraform清單文件(即main.tf和output.tf)的目錄,以便創建基礎架構。

terraformOptions := terraform.WithDefaultRetryableErrors(t, &terraform.Options{
TerraformDir: "../terraform",
})

在Go中,我們使用defer方法來執行清理任務,它應該是terraform destroy。

我們使用下面的代碼片段來定義它:

defer terraform.Destroy(t, terraformOptions)

現在我們可以繼續實際執行了:

使用terraform.InitAndApply ,我們調用通常用于Terraform執行的Terraform函數terraform init和apply:

terraform.InitAndApply(t, terraformOptions)

如前所述,Terratest查找來自output.tf的輸出,尋找變量定義。

在下面的代碼片段中,我們從Terraform輸出中獲取ssh密鑰,并與已定義的ssh密鑰名稱進行匹配:

ec2SshKey := terraform.Output(t, terraformOptions, "instance_ssh_key") assert.Equal(t, "terratest", ec2SshKey)

六、執行測試

將目錄切換到已克隆存儲庫的位置。進入到測試文件所在的位置。

初始化Go模塊,并下載依賴項。請查看Terratest文檔的“設置項目”部分以獲取更多詳細信息。

go mod init ec2_instance
go mod tidy

最后執行測試:

$ go test –v

--- PASS: TestEc2SshKey (98.72s)
PASS
ok command-line-arguments 98.735s

七、不妨繼續使用Terratest

在上一節中,我們使用Terratest執行了一些基本的測試。現在,我們將通過部署一個以Lambda和ALB作為后端的API網關來執行高級測試。

  • 高級功能

API網關的GET請求將由ALB處理,任何方法將由Lambda通過API網關來處理。部署后,我們將對網關部署URL執行HTTP GET請求,并檢查它是否返回成功碼。

注意:我們在執行中沒有使用任何API_KEY進行身份驗證,但您應該使用它來再現API Gateway更實際的使用。

Terraform output.tf
output "lb_address" {
value = aws_lb.load-balancer.dns_name
description = "DNS of load balancer"
}
output "api_id" {
description = "REST API id"
value = aws_api_gateway_rest_api.api.id
}
output "deployment_invoke_url" {
description = "Deployment invoke url"
value = "${aws_api_gateway_stage.test.invoke_url}/resource"
}
  • 測試執行的代碼片段

在第一個場景中,我們已經解釋了基本語法,因此將直接進入測試函數。

func TestApiGateway(t *testing.T) {
//awsRegion := "eu-west-2"
terraformOptions := terraform.WithDefaultRetryableErrors(t, &terraform.Options{
TerraformDir: "../",
})
defer terraform.Destroy(t, terraformOptions)
terraform.InitAndApply(t, terraformOptions)
stageUrl := terraform.Output(t, terraformOptions,"deployment_invoke_url") time.Sleep(30 * time.Second)
statusCode := DoGetRequest(t, stageUrl)
assert.Equal(t, 200 , statusCode)
}
func DoGetRequest(t terra_test.TestingT, api string) int{
resp, err := http.Get(api)
if err != nil {
log.Fatalln(err)
}
//We Read the response status on the line below.
return resp.StatusCode
}

在上面的代碼片段中,我們定義了函數DoGetRequest來運行HTTP GET測試。然后,我們將此函數的輸出用作TestApiGateway函數的輸入。

  • 測試執行和輸出
TestApiGateway 2022-03-01T06:56:18Z logger.go:66: deployment_invoke_url = "https://iuabeqgmj2.execute-api.eu-west-1.amazonaws.com/test/resource" TestApiGateway 2022-03-01T06:56:18Z logger.go:66: lb_address = "my-demo-load-balancer-
376285754.eu-west-1.elb.amazonaws.com"
TestApiGateway 2022-03-01T06:56:18Z retry.go:91: terraform [output -no-color -json deployment_invoke_url]
TestApiGateway 2022-03-01T06:56:18Z logger.go:66: Running command terraform with args [output –
no-color -json deployment_invoke_url]
TestApiGateway 2022-03-01T06:56:19Z logger.go:66: "https://iuabeqgmj2.execute-api.eu-west-
1.amazonaws.com/test/resource"
--- PASS: TestApiGateway (42.34s)
PASS
ok command-line-arguments 42.347s

如您所見,它執行了測試函數TestApiGateway,其中它對API網關的deployment_invoke_url執行了TTP GET測試,并返回了測試狀態。

八、使用Terratest進行Terratest模塊的 可擴展性和合規測試

我們還可以利用Terratest進行合規測試。一些例子包括:

  • 檢查是否在您的SQS隊列或S3存儲桶上啟用了加密。
  • 驗證您是否為API網關設置了特定的限制。

我們為API網關開發了Terratest檢查機制。在該例子中,我們驗證是否為您的API網關添加了Authorizer。

目前,Terratest在其AWS模塊中沒有API網關模塊。您可以在Terratest AWS模塊目錄中找到可用的AWS模塊。Docker、Packer或Helm等其他Terratest模塊可以在Terratest模塊目錄中找到。

我們使用Terratest和AWS Go SDK方法為Authorizer創建了自己的測試函數。

九、結語

企業及其客戶希望產品更快速地交付。基礎架構即代碼加快了基礎架構的配置,恰好滿足了這個要求。隨著越來越多的基礎架構變成代碼,用戶對測試的需求也在增加。我們在本文中討論了Terratest之類的工具如何幫助您在將代碼部署到生產環境之前對其進行驗證。我們介紹了Terratest的工作原理,甚至執行了測試用例來表明它是如何完成的。Terratest的優點之一是具有可擴展性,我們可以通過使用本文中提到的模塊實現這種可擴展性。

原文鏈接:https://www.cncf.io/blog/2022/07/18/testing-your-infrastructure-as-code-using-terratest/

責任編輯:武曉燕 來源: 51CTO技術棧
相關推薦

2021-06-15 21:00:24

架構測試代碼化

2023-02-19 15:31:09

架構軟件開發代碼

2020-04-17 19:41:57

基礎架構即代碼平臺即代碼云計算

2020-06-18 08:52:37

基礎架構即代碼

2016-04-14 09:12:20

惠普

2020-09-25 07:00:00

基礎架構代碼模板

2017-09-16 17:28:55

基礎設施代碼持續交付

2024-02-04 09:13:24

基礎設施代碼DevOps

2019-04-17 09:00:00

DevOps基礎架構代碼工具

2016-08-30 10:39:44

云計算

2016-09-01 15:02:38

混合云多云基礎架構

2022-01-14 08:00:00

云計算云治理工具

2022-01-10 08:00:00

云原生云計算技術

2021-11-11 09:00:00

IaC工具自動化

2022-04-11 19:08:06

設施作用域pod

2016-08-18 16:55:00

基礎設施

2022-06-17 10:24:57

IaC

2017-12-04 12:49:16

跨國互聯網基礎設施即代碼

2021-06-18 11:02:12

云計算infrastruct云安全

2021-07-26 09:53:58

IaC基礎設施即代碼云數據中心
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲电影中文字幕 | 激情五月激情综合网 | 亚洲一区二区 | 在线欧美亚洲 | 免费a v网站 | 国产一区二区在线播放视频 | 久久成人免费 | 精品乱码一区二区 | 超碰国产在线 | 亚洲国产成人在线视频 | 亚洲444kkkk在线观看最新 | 日日操夜夜操天天操 | 日本一二区视频 | 日韩一级 | 欧美黄视频 | 免费观看一级特黄欧美大片 | 日韩中文字幕高清 | 久久国产成人午夜av影院武则天 | 色网在线看 | 神马久久春色视频 | 激情麻豆视频 | 日韩av.com | 欧美在线亚洲 | 免费看黄视频网站 | 伊人精品国产 | 91麻豆精品一区二区三区 | jlzzjlzz国产精品久久 | 国产精品福利网站 | 色偷偷噜噜噜亚洲男人 | 美女视频一区二区三区 | 亚洲一区中文字幕 | 中文字幕一区二区三区在线视频 | 国产精品婷婷 | 在线伊人网 | 午夜国产 | 免费在线精品视频 | 国产精品成人在线观看 | 天堂视频一区 | 国产精品久久一区二区三区 | 97精品视频在线 | 国产成人精品一区二区三区网站观看 |