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.tf6 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 -vTerraform v0.11.14Your version of Terraform is out of date! The latest versionis 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.backup0 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 = 3write_capacity = 3hash_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_addresstype = "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.tfvarsaccess_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/