10 mejores prácticas de Terraform para un mejor aprovisionamiento de infraestructura

Hablemos de algunas de las mejores prácticas que se deben seguir al usar 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 implementar infraestructura en su organización.

Si comenzó a usar Terraform, debe adoptar las mejores prácticas para un mejor aprovisionamiento de la infraestructura de producción.

Estructuración

Cuando trabaja en un gran proyecto de infraestructura de producción con Terraform, debe seguir una estructura de directorios adecuada para solucionar las complejidades que puedan surgir en el proyecto. Sería mejor si tuviera directorios separados para diferentes propósitos.

Por ejemplo, si usa terraform en entornos de desarrollo, ensayo y producción, tenga directorios separados para cada uno de ellos.

[email protected]:~$ 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

Incluso las configuraciones de terraformación deben estar separadas porque, después de un período, las configuraciones de una infraestructura en crecimiento se volverán complejas.

Por ejemplo, puede escribir todos sus códigos de terraformación (módulos, recursos, variables, salidas) dentro del mismo archivo main.tf, pero tener códigos de terraformación separados para variables y salidas lo hace más legible y fácil de entender.

Convenio de denominación

Las convenciones de nomenclatura se utilizan en Terraform para que las cosas sean fácilmente comprensibles.

Por ejemplo, supongamos que desea crear tres espacios de trabajo diferentes para diferentes entornos en un proyecto. Entonces, en lugar de nombrarlos como env1, en2, env3, debe llamarlos como desarrollador, escenario, pinchar. Por el nombre en sí, queda bastante claro que hay tres espacios de trabajo diferentes para cada entorno.

También se deben seguir convenciones similares para 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 de terraformación 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.

Usar módulos compartidos

Se recomienda encarecidamente utilizar los módulos oficiales de Terraform disponibles. No es necesario reinventar un módulo que ya existe. Ahorra mucho tiempo y dolor. El registro de Terraform tiene muchos módulos disponibles. Realice cambios en los módulos existentes según la necesidad.

Además, cada módulo debe concentrarse en un solo aspecto de la infraestructura, como crear una instancia AWS EC2, configurar la base de datos MySQL, etc.

Por ejemplo, si desea usar AWS VPC en su código de terraformación, puede usar: VPC simple

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

Ultima versión

La comunidad de desarrollo de Terraform es muy activa y el lanzamiento de nuevas funcionalidades ocurre con frecuencia. Se recomienda permanecer en la última versión de Terraform como cuando ocurre una nueva versión importante. Puede actualizar fácilmente a la última versión.

Si omite varias versiones principales, la actualización se volverá muy compleja.

Ejecute el comando terraform -v para comprobar si hay una nueva actualización.

[email protected]:~$ 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

Estado del sistema de respaldo

Siempre haga una copia de seguridad de los archivos de estado de Terraform.

Estos archivos realizan un seguimiento de los metadatos y los recursos de la infraestructura. De forma predeterminada, estos archivos llamados terraform.tfstate se almacenan localmente dentro del directorio del espacio de trabajo.

Sin estos archivos, Terraform no podrá averiguar qué recursos se implementan en la infraestructura. Por lo tanto, es esencial tener una copia de seguridad del archivo de estado. De forma predeterminada, se creará un archivo con el nombre terraform.tfstate.backup para mantener una copia de seguridad del archivo de estado.

[email protected]:~$ tree terraform_demo/
terraform_demo/
├── awsec2.tf
├── terraform.tfstate
└── terraform.tfstate.backup
0 directories, 3 files

Si desea almacenar un archivo de estado de copia de seguridad en otra ubicación, use el indicador -backup en el comando terraform y proporcione la ruta de la ubicación.

La mayoría de las veces, habrá varios desarrolladores trabajando en un proyecto. Por lo tanto, para darles acceso al archivo de estado, debe almacenarse en una ubicación remota utilizando una fuente de datos terraform_remote_state.

El siguiente ejemplo tomará 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”
   }
}

Archivo de estado de bloqueo

Puede haber varios escenarios en los que más de un desarrollador intente ejecutar la configuración de terraformación 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, a la vez, solo una persona esté ejecutando las configuraciones de terraformación y que no haya ningún conflicto.

Este es un ejemplo de cómo bloquear el archivo de estado, que se encuentra en una ubicación remota mediante 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”
   }
}

Cuando varios usuarios intentan acceder al archivo de estado, el nombre de la base de datos y la clave principal de DynamoDB se utilizarán para bloquear el estado y mantener la coherencia.

Nota: no todos los bloqueos de soporte de backend.

Usar variable propia

self variable es un tipo especial de variable que se utiliza cuando no conoce el valor de la variable antes de implementar una infraestructura.

Supongamos que desea utilizar la dirección IP de una instancia que se implementará solo después del comando de aplicación de terraformación, por lo que no sabrá la dirección IP hasta que esté en funcionamiento.

En tales casos, usa variables propias y la sintaxis para usarlas es self.ATTRIBUTE. Entonces, en este caso, usará self.ipv4_address como variable propia para obtener la dirección IP de la instancia. Estas variables solo se permiten en bloques de conexión y aprovisionador de configuración de terraformación.

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

Minimizar el radio de explosión

El radio de explosión no es más que la medida del daño que puede ocurrir si las cosas no salen según lo planeado.

Por ejemplo, si está implementando algunas configuraciones de terraformación en la infraestructura y la configuración no se aplica correctamente, ¿cuál será la cantidad de daño a la infraestructura?

Por lo tanto, para minimizar el radio de explosión, siempre se sugiere impulsar algunas configuraciones en la infraestructura a la vez. Entonces, si algo salió mal, el daño a la infraestructura será mínimo y se puede corregir rápidamente. Implementar muchas configuraciones a la vez es muy arriesgado.

Usar archivo var

En terraform, puede crear un archivo con la extensión .tfvars y pasar este archivo al comando de aplicación de terraform usando el indicador -var-file. Esto le ayuda a pasar aquellas variables que no quiere poner en el código de configuración de terraformación.

Siempre se sugiere pasar variables para 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 versión de ubicación remota.

Por ejemplo, si desea lanzar una instancia ec2 usando terraform, puede pasar la clave de acceso y la clave secreta usando -var-file

Cree un archivo terraform.tfvars y coloque las claves en este archivo.

[email protected]:~$ gedit terraform.tfvars

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

Ahora, use este archivo var en el comando terraform.

[email protected]:~$ terraform apply -var-file=/home/geekflare/terraform.tfvars

Ventana acoplable de usuario

Cuando está ejecutando un trabajo de compilación de canalización de CI/CD, se sugiere usar contenedores acoplables. Terraform proporciona contenedores Docker oficiales que se pueden usar. En caso de que esté cambiando el servidor de CI/CD, puede pasar fácilmente la infraestructura dentro de un contenedor.

Antes de implementar la infraestructura en el entorno de producción, también puede probar la infraestructura en los contenedores acoplables, que son muy fáciles de implementar. Al combinar Terraform y Docker, obtiene una infraestructura portátil, reutilizable y repetible.

Conclusión

Espero que estas mejores prácticas lo ayuden a escribir mejores configuraciones de Terraform. Continúe y comience a implementarlos en sus proyectos de terraformación para obtener mejores resultados.

Publicaciones relacionadas

Botón volver arriba