天天看點

Terraform 改善基礎架構的十個最佳實踐

作者:Seal軟體

Terraform 是一種非常流行的開源 IaC(基礎設施即代碼)工具,用于定義和提供完整的基礎設施。Terraform 于 2014 年推出,其采用率已在全球範圍内快速增長,越來越多的開發人員正在學習 Terraform 并嘗試在其組織中部署基礎設施。

如果您已經開始使用 Terraform,則必須采用最佳實踐來更好地配置生産基礎設施。本文章将總結10個關于 Terraform 改善基礎架構的最佳實踐。

結構化

當您使用 Terraform 處理大型生産基礎設施項目時,需要遵循适當的目錄結構來應對項目中可能出現的複雜性。建議為不同目的建立單獨的目錄。如果您在開發、暫存和生産環境中使用 Terraform,請為每個環境設定單獨的目錄。

Terraform 配置也應該是分開的,因為經過一段時間後,不斷增長的基礎設施的配置将變得更加複雜。

geekflare@geekflare:~$ tree terraform_project/
terraform_project/
├── dev
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
├── modules
│ ├── ec2
│ │ ├── ec2.tf
│ │ └── main.tf
│ └── vpc
│ ├── main.tf
│ └── vpc.tf
├── prod
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
└── stg
├── main.tf
├── outputs.tf
└── variables.tf

6 directories, 13 files
           

您可以在檔案 main.tf 本身内編寫所有的 Terraform 代碼(子產品、資源、變量、輸出),同時為變量和輸出設定單獨的 Terraform 代碼使其更具可讀性和易于了解。

命名規則

Terraform 中使用命名規則讓資源易于了解、一目了然。

例如,假設您要為項目中的不同環境建立三個不同的工作區。與其将環境命名為env1 、env2 、env3 ,不如嘗試使用dev、stage、prod 來命名。從名稱本身來看,很明顯每個環境都代表着不同的工作空間。資源、變量、子產品等的也遵循類似的規則。

Terraform 中的資源名稱應以相關資源名稱開頭,後跟下劃線和其他詳細資訊。例如,用于在 AWS 中為 route table 建立 Terraform 對象的資源名稱為 aws_route_table。

是以如果正确地遵循命名規則,即使是複雜的代碼也會更容易了解。

使用共享子產品

強烈建議使用可用的官方 Terraform 子產品。直接使用現有子產品,能夠有效節省時間和精力。Terraform registry 有很多現成可用的子產品,企業可以根據需要對現有子產品進行更改。

此外,每個子產品應該隻專注于基礎設施的一個方面,比如建立 AWS EC2 執行個體、設定 MySQL 資料庫等。舉個例子,如果您想在 terraform 代碼中使用 AWS VPC,可以直接使用 -simple VPC。

module "vpc_example_simple-vpc" {
source
= "terraform-aws-modules/vpc/aws//examples/simple-vpc"
version = "2.48.0"
}
           

使用最新版本

Terraform 開發社群非常活躍,新功能釋出頻繁。建議在釋出新的主要版本時使用最新版本的 Terraform。您可以輕松更新到最新版本。如果跳過多個主要版本,更新将變得非常複雜。

運作terraform -v指令以檢查版本更新。

geekflare@geekflare:~$ terraform -v
Terraform v0.11.14
Your version of Terraform is out of date! The latest version
is 0.12.0. You can update by downloading from www.terraform.io/downloads.html
           

備份系統狀态

請始終備份 Terraform 的狀态檔案,這些檔案跟蹤基礎設施的中繼資料和資源。預設情況下,這些名為terraform.tfstate的檔案本地存儲在工作區目錄中。

如果沒有這些檔案,Terraform 将無法确定在基礎設施上部署了哪些資源。是以,必須備份狀态檔案。預設情況下,terraform.tfstate.backup會被建立并用來儲存狀态檔案的備份。

geekflare@geekflare:~$ tree terraform_demo/
terraform_demo/
├── awsec2.tf
├── terraform.tfstate
└── terraform.tfstate.backup
0 directories, 3 files
           

如果要将備份狀态檔案存儲到其他位置,在 terraform 指令中使用-backup标記并提供位置路徑。大部分情況下,一個項目會有多個開發人員參與。是以為了讓開發人員友善通路狀态檔案。應該使用terraform_remote_state資料源将其存儲在遠端位置。

以下示例将備份到 S3。

data "terraform_remote_state" "vpc" {
backend = "s3"
config = {
bucket = “s3-terraform-bucket”
key = “vpc/terraform.tfstate"
region = “us-east-1”
   }
}
           

鎖定狀态檔案

可能有多個場景,其中不止一個開發人員試圖同時運作 Terraform 配置。這可能導緻 terraform 狀态檔案損壞甚至資料丢失。鎖定機制能夠有效防止此類情況發生,確定一次隻有一個人在運作 terraform 配置,并且沒有沖突。

下面是使用 DynamoDB 鎖定位于遠端位置的狀态檔案的示例。

resource “aws_dynamodb_table” “terraform_state_lock” {
name = “terraform-locking”
read_capacity = 3
write_capacity = 3
hash_key = “LockingID”

attribute {
name = “LockingID”
type = “S”
   }

}
terraform {
backend “s3” {
bucket = “s3-terraform-bucket”
key = “vpc/terraform.tfstate”
region = “us-east-2”
dynamodb_table = “terraform-locking”
   }
}
           

當多個使用者嘗試通路狀态檔案時,DynamoDB 資料庫名稱和主鍵将用于狀态鎖定并保持一緻性。注意:并非所有後端都支援鎖定。

使用自變量

self變量是一種特殊的變量,當您在部署基礎設施之前不知道變量的值時可以使用它。假設您要使用僅在 terraform apply 指令後部署的執行個體的 IP 位址,也就是在它啟動并運作之前您是不知道 IP 位址的。

在這種情況下,您可以使用自變量self.ATTRIBUTE。在這個例子中,您可以使用self.ipv4_address作為自變量來擷取執行個體的 IP 位址。這些變量隻允許在 terraform 配置的連接配接和配置塊上使用。

connection {
host = self.ipv4_address
type = "ssh"
user = var.users[2]
private_key = file(var.private_key_path)
}
           

最小化爆炸半徑

爆炸半徑(Blast Radius)是衡量如果流程沒有按計劃進行時可能發生的損害的量度。

例如,如果您在基礎設施上部署了一些 Terraform 配置,但配置沒有得到正确應用,那麼對基礎設施造成的損害會有多大。是以,為了盡量減少故障影響範圍,建議每次配置的基礎設施數量不宜過多。即便出現問題,對基礎設施的損害也能控制在較小範圍,并且可以迅速得到糾正。一次性配置大量基礎設施是非常危險的。

使用 var 檔案

在 terraform 中,您可以建立一個帶有擴充名的檔案<em>.</em>tfvars,并使用-var-file此檔案傳遞給 terraform apply 指令。這個方式可以幫助您傳遞那些您不想放入 terraform 配置代碼中的變量。

始終建議通過-var-file在本地傳遞密碼、密鑰等變量,而不是将其儲存在 terraform 配置或遠端位置版本控制系統中。

例如,如果您想使用 terraform 啟動 ec2 執行個體,您可以使用-var-file傳遞通路密鑰和其他機密資訊。建立檔案 terraform.tfvars 并将密鑰放入此檔案中。

geekflare@geekflare:~$ gedit terraform.tfvars

access_key = "AKIATYWSDFYU5DUDJI5F"
secret_key = "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"
           

然後在 terraform 指令中使用這個 var 檔案。

geekflare@geekflare:~$ terraform apply -var-file=/home/geekflare/terraform.tfvars
           

使用 Docker

當您運作 CI/CD 流水線建構作業時,建議使用 docker 容器。Terraform 提供了可以直接使用的官方 Docker 容器。如果需要更改 CI/CD 伺服器,您可以輕松地在容器内傳遞基礎設施。

在生産環境上部署基礎設施之前,您還可以在 docker 容器上測試基礎設施,非常容易部署。通過結合 Terraform 和 Docker,您可以獲得可移植、可重用、可重複的基礎設施。

參考連結:

https://geekflare.com/terraform-best-practices/