Hablemos de algunas de las mejores prácticas que deben seguirse al utilizar Terraform
Terraform es una herramienta IaC (infraestructura como código) de código abierto muy popular para definir y aprovisionar la infraestructura completa
Aunque Terraform se lanzó en 2014, la adopción de esta herramienta ha crecido a nivel mundial. Cada vez más desarrolladores están aprendiendo Terraform para desplegar infraestructura en su organización
Si ha empezado a utilizar Terraform, debe adoptar las mejores prácticas para un mejor aprovisionamiento de la infraestructura de producción
Si es
un novato, consulte este artículo de Terra
formulario
Estructurar
Cuando esté trabajando en un gran proyecto de infraestructura de producción utilizando Terraform, debe seguir una estructura de directorios adecuada para hacerse cargo de las complejidades que puedan surgir en el proyecto. Lo mejor sería que tuviera directorios separados para diferentes propósitos
Por ejemplo, si está utilizando Terraform en entornos de desarrollo, puesta en escena y producción, tenga directorios separados para cada uno de ellos
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
directorios, 13 archivos
Incluso las configuraciones de terraformación deben estar separadas porque, al cabo de un tiempo, las configuraciones de una infraestructura en crecimiento se volverán complejas.
Por ejemplo - puede escribir todos sus códigos terraform (módulos, recursos, variables, salidas) dentro del propio archivo main.
tf, pero tener códigos terraform separados para las variables y las salidas lo hace más legible y fácil de entender
Convención de nomenclatura
Las convenciones de nomenclatura se utilizan en Terraform para hacer las cosas fácilmente comprensibles
Por ejemplo, digamos que usted quiere hacer tres espacios de trabajo diferentes para diferentes entornos en un proyecto. Entonces, en lugar de nombrarlos como env1, en2, env3, debe llamarlos como dev, escenario, prod. A partir del propio nombre, queda bastante claro que hay tres espacios de trabajo diferentes para cada entorno
También se deben seguir convenciones similares para los recursos, variables, módulos, etc. El nombre del recurso en Terraform debe comenzar con un nombre de proveedor seguido de un guión bajo y otros detalles
Por ejemplo, el nombre del recurso para crear un objeto Terraform para una tabla de rutas en AWS sería aws_route_table
Por lo tanto, si sigue correctamente las convenciones de nomenclatura, será más fácil comprender incluso los códigos complejos
Utilizar módulos compartidos
Se recomienda encarecidamente utilizar los módulos Terraform oficiales disponibles. No es necesario reinventar un módulo que ya existe. Ahorra mucho tiempo y dolor. El registro de Terra form tiene un montón de módulos fácilmente disponibles. Realice cambios en los módulos existentes según las necesidades
Además, cada módulo debe concentrarse en un solo aspecto de la infraestructura, como la creación de una instancia AWS EC2, la configuración de la base de datos MySQL, etc
Por ejemplo, si desea utilizar AWS VPC en su código terraform, puede utilizar - VPC simple
module "vpc_example_simple-vpc" {
source
=
"terraform-aws-modules/vpc/aws//examples/simple-vpc"
version = "2.48.0"
}
Última versión
La comunidad de desarrollo de Terraform es muy activa y el lanzamiento de nuevas funcionalidades se produce con frecuencia. Se recomienda permanecer en la última versión de Terraform como en cuando se produce un nuevo lanzamiento importante. Puede actualizar fácilmente a la última versión
Si se salta varias versiones principales, la actualización será muy compleja
Ejecutar el comando terraform -v
para comprobar si hay una nueva actualización
geekflare@geekflare:~$ terraform -v
Terraform v0.11.14
¡Su versión de Terraform está desactualizada! La última versión
es 0.12.0. Puede actualizarla descargándola de www.terraform.io/downloads.html
Copia de seguridad del estado del sistema
Haga siempre copias de seguridad de los archivos de estado de Terraform
Estos archivos mantienen un registro de los metadatos y recursos de la infraestructura. Por defecto, estos archivos llamados como terraform.tfstate
se almacenan localmente dentro del directorio del espacio de trabajo
Sin estos archivos, Terraform no será capaz de averiguar qué recursos están desplegados en la infraestructura. Por lo tanto, es esencial tener una copia de seguridad del archivo de estado. Por defecto, un archivo con un nombre terraform.tfstate.
se creará una copia de seguridad para mantener una copia de seguridad del archivo de estado
geekflare@geekflare:~$ tree terraform_demo/
terraform_demo/
├── awsec2.tf
├── terraform.tfstate
└── terraform.tfstate.backup
0
directorios, 3 archivos
Si desea almacenar un archivo de estado de copia de seguridad en alguna otra ubicación, utilice la bandera -backup
en el comando terraforme y proporcione la ruta de ubicación
La mayoría de las veces, habrá varios desarrolladores trabajando en un proyecto. Así que, para darles acceso al archivo de estado, debería almacenarse en una ubicación remota utilizando una fuente de datos terraform_remote_state
El siguiente ejemplo realizará una copia de seguridad en S3
data "terraform_remote_state" "vpc" {
backend = "s3"
config = {
bucket = "s3-terraform-bucket"
key = "vpc/terraform.tfstate"
region = "us-east-1"
}
}
Bloquear archivo de estado
Puede haber múltiples escenarios en los que más de un desarrollador intente ejecutar la configuración terraform al mismo tiempo. Esto puede provocar la corrupción del archivo de estado de terraformación o incluso la pérdida de datos. El mecanismo de bloqueo ayuda a prevenir tales escenarios. Se asegura de que, en un momento dado, sólo una persona esté ejecutando las configuraciones de terraformación y no haya ningún conflicto
He aquí un ejemplo de bloqueo del archivo de estado, que se encuentra en una ubicación remota utilizando DynamoDB
recurso "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"
}
}
Cuando varios usuarios intenten acceder al archivo de estado, el nombre de la base de datos DynamoDB y la clave primaria se utilizarán para el bloqueo del estado y el mantenimiento de la coherencia
Nota: no todos los backend soportan el bloqueo
Utilice la variable self
la variable self
es un tipo especial de variable que se utiliza cuando no se conoce el valor de la variable antes de desplegar una infraestructura
Supongamos que desea utilizar la dirección IP de una instancia que sólo se desplegará tras aplicar el comando terraform, por lo que no conocerá la dirección IP hasta que esté en funcionamiento
En estos casos, se utilizan variables self, y la sintaxis para utilizarla es self.ATTRIBUTE
. Así, en este caso, utilizará self.ipv4_address
como variable self para obtener la dirección IP de la instancia. Estas variables sólo están permitidas en los bloques connection y provisioner de la configuración de terraform
connection {
host = self.ipv4_address
type = "ssh"
user = var.users[2]
private_key = file(var.private_key_path)
}
Minimizar el radio de Blast
El radio de explosión no es más que la medida del daño que puede producirse si las cosas no salen según lo previsto
Por ejemplo, si está desplegando algunas configuraciones de terraformación en la infraestructura y la configuración no se aplica correctamente, ¿cuál será la cantidad de daños que sufrirá la infraestructura?
Así que, para minimizar el radio de explosión, siempre se sugiere impulsar unas pocas configuraciones en la infraestructura a la vez. Así, si algo sale mal, el daño a la infraestructura será mínimo y podrá corregirse rápidamente. Desplegar muchas configuraciones a la vez es muy arriesgado
Utilice el archivo var
En terraform, puede crear un archivo con extensión <em>.</em>tfvars
y pasar este archivo al comando terraformar aplicar utilizando la bandera -var-file
. Esto le ayuda a pasar aquellas variables que no desea poner en el código de configuración de terraform
Siempre se sugiere pasar las variables de una contraseña, clave secreta, etc. localmente a través de -var-file en lugar de guardarlo dentro de las configuraciones de terraform o en un sistema de control de versiones de ubicación remota
Por ejemplo, si desea lanzar una instancia ec2 utilizando terraform, puede pasar la clave de acceso y la clave secreta utilizando -var-file
Cree un archivo terraform.tfvars y ponga las claves en este archivo
geekflare@geekflare:~$ gedit terraform.tfvars
access_key = "AKIATYWSDFYU5DUDJI5F"
secret_key = "W9VCCs6I838NdRQQsAeclkejYSJA4YtaZ 2TtG2H"
Ahora, utilice este archivo var en el comando terraform
geekflare@geekflare:~$ terraform apply -var-file=/home/geekflare/terraform.tfvars
Usuario Docker
Cuando se está ejecutando un trabajo de construcción de tuberías CI/CD, se sugiere utilizar contenedores Docker. Terraform proporciona contenedores Docker oficiales que se pueden utilizar. En caso de que esté cambiando el servidor CI/CD, puede pasar fácilmente la infraestructura dentro de un contenedor
Antes de desplegar la infraestructura en el entorno de producción, también puede probar la infraestructura en los contenedores Docker, que son muy fáciles de desplegar. Combinando Terraform y Docker, obtendrá una infraestructura portátil, reutilizable y repetible
Conclusión
Espero que estas mejores prácticas le ayuden en la escritura de mejores configuraciones Terraform. Vaya por delante y empiece a aplicar estos en sus proyectos Terraform para obtener mejores resultados.
-
Avi es un entusiasta de la tecnología con experiencia en tecnologías de tendencia como DevOps, Cloud Computing, Big Data y muchas más. Le apasiona aprender tecnologías de vanguardia y compartir sus conocimientos con los demás a través de... Seguir leyendo