Terraform con AWS en Español - Parte 1
Tags: aws, terraform, iac, devops
Published: 2023-02-18 01:56:06

¡Bienvenidos a este tutorial de Terraform en Español! ¿Quieres construir tu propia infraestructura en minutos? ¿O simplemente quieres hacer las cosas más rápido, mejor y más eficientemente? Entonces, Terraform es el camino a seguir. Con Terraform, puedes construir, actualizar y destruir recursos en la nube de una manera fácil, rápida y escalable.
Veremos en esta serie de capítulos desde el nivel básico hasta intermedio de terraform y de manera práctica aplicado sobre la nube de AWS.

**¿Qué es IaC?**

La IaC o Infraestructura como Código (Infrastructure as Code) es una metodología que se utiliza para gestionar la infraestructura de forma automatizada a través de código. En lugar de configurar manualmente servidores, redes, almacenamiento y otros componentes de infraestructura, los desarrolladores y operadores utilizan herramientas de IaC para escribir y gestionar código que define su infraestructura.
La IaC permite automatizar la gestión de infraestructura, reducir errores y aumentar la escalabilidad y la consistencia en la gestión de recursos. Los desarrolladores y operadores pueden trabajar en equipo y versionar sus cambios, lo que facilita el seguimiento y la implementación de cambios en la infraestructura.

**¿Qué es Terraform?**

Terraform es una herramienta de IaC de código abierto desarrollada por HashiCorp. Se utiliza para crear, cambiar y versionar la infraestructura de forma segura y eficiente. Terraform se centra en la declaratividad, lo que significa que los usuarios describen la infraestructura deseada y Terraform se encarga de determinar la mejor manera de crearla.
Terraform admite una amplia variedad de proveedores de servicios en la nube, como AWS, Azure, Google Cloud, y otros proveedores, lo que permite crear infraestructura en diferentes proveedores de servicios. Además, Terraform es compatible con múltiples sistemas operativos y lenguajes de programación, lo que permite una integración más sencilla en diferentes flujos de trabajo.

**Casos de uso de Terraform**

Terraform se puede utilizar en una amplia variedad de casos de uso, entre los que se incluyen:

- Creación de infraestructura de red: Terraform se puede utilizar para crear y gestionar redes en AWS, como VPCs, subredes, grupos de seguridad y equilibradores de carga.
- Implementación de aplicaciones: Terraform se puede utilizar para automatizar la implementación de aplicaciones en AWS, incluyendo la creación de instancias de EC2, el aprovisionamiento de recursos de almacenamiento y la configuración de políticas de escalado automático.
- Gestión de bases de datos: Terraform se puede utilizar para crear y gestionar bases de datos en AWS, incluyendo la configuración de instancias de bases de datos relacionales, como RDS, y bases de datos NoSQL, como DynamoDB.
- Creación de entornos de pruebas y desarrollo: Terraform se puede utilizar para crear y gestionar entornos de pruebas y desarrollo en AWS, lo que permite a los desarrolladores trabajar en entornos aislados y seguros.
- Creación de pipelines de entrega continua: Terraform se puede utilizar para crear pipelines de entrega continua en AWS, lo que permite la implementación automatizada y continua de cambios en la infraestructura y la aplicación en un entorno seguro y controlado.

**¿Cómo instalar Terraform en Linux?**

Para instalar Terraform en Linux, sigue los siguientes pasos:

Abre una terminal de línea de comandos en Linux.

- Actualiza los paquetes de Linux con el siguiente comando:
```
sudo yum update -y
```
- Descarga la última versión de Terraform para Linux en la página de descargas de Terraform. Puedes usar el siguiente comando para descargar la versión 1.3.9:
```
wget https://releases.hashicorp.com/terraform/1.3.9/terraform_1.3.9_linux_386.zip
```
- Descomprime el archivo ZIP que acabas de descargar con el siguiente comando:
```
unzip terraform_1.1.4_linux_amd64.zip
```
- Mueve el archivo binario de Terraform a un directorio que esté en tu PATH de usuario, como /usr/local/bin, con el siguiente comando:
```
sudo mv terraform /usr/local/bin/
```
- Verifica que Terraform esté instalado y funcionando correctamente ejecutando el siguiente comando:
```
terraform version
```
Este comando debería mostrar la versión de Terraform que acabas de instalar.

Para realizar la instalación en otro Sistema Operativo, por favor revisar el siguiente enlace: https://developer.hashicorp.com/terraform/downloads

**Estructura de archivos básica para un proyecto en Terraform**

Algo que considero importante y que brinda mejor visión sobre el uso y configuración de Terraform es la estructura de archivos, a continuación se comparte un ejemplo y explicación de cada uno de ellos.

```
├── main.tf
├── providers.tf
├── variables.tf
├── outputs.tf
├── modules/
│   ├── networking/
│   │   ├── main.tf
│   │   ├── variables.tf
│   │   ├── outputs.tf
│   │   └── ...
│   ├── instances/
│   │   ├── main.tf
│   │   ├── variables.tf
│   │   ├── outputs.tf
│   │   └── ...
│   └── ...
├── environments/
│   ├── dev/
│   │   ├── main.tf
│   │   ├── variables.tf
│   │   ├── outputs.tf
│   │   └── ...
│   ├── staging/
│   │   ├── main.tf
│   │   ├── variables.tf
│   │   ├── outputs.tf
│   │   └── ...
│   └── prod/
│       ├── main.tf
│       ├── variables.tf
│       ├── outputs.tf
│       └── ...
└── README.md
```
Para aterrizar mejor el ejemplo anterior, supongamos que queremos crear una infraestructura en AWS con Terraform que incluya un VPC, una subred pública y una instancia EC2. Entonces los archivos anteriores podrian explicarse así:

- main.tf: Este es el archivo principal donde se define la mayoría de los recursos. En este archivo, se crearía el VPC, la subred pública y la instancia EC2.
- variables.tf: Este archivo se utiliza para definir las variables que se utilizarán en el archivo main.tf. En este caso, definiríamos variables como el CIDR block para el VPC, el nombre de la subred pública, el tipo de instancia EC2, etc.
- outputs.tf: Este archivo se utiliza para definir las salidas que se mostrarán después de que Terraform haya aplicado los cambios. Por ejemplo, podríamos definir una salida que muestre la dirección IP pública de la instancia EC2.
- providers.tf: Este archivo se utiliza para especificar el proveedor de servicios cloud que se está utilizando. En este caso, especificaríamos el proveedor de AWS.

El directorio modules/ contiene módulos reutilizables para cada componente del sistema. Por ejemplo, hay un módulo de networking y un módulo de instancias de EC2. Cada módulo tiene su propio archivo main.tf, variables.tf, y outputs.tf para definir los recursos específicos del módulo.

El directorio environments/ contiene archivos específicos de cada ambiente, como dev, staging y prod. Cada ambiente tiene sus propios archivos main.tf, variables.tf, y outputs.tf para definir los recursos específicos de ese ambiente.

Finalmente, hay un archivo README.md para documentar el proyecto.

Esta estructura de archivos separa claramente los recursos en módulos reutilizables y ambientes específicos, lo que facilita la organización del código y la administración de los diferentes ambientes.

**Terraform Workflow y principales comandos**

El flujo de trabajo de Terraform generalmente sigue los siguientes pasos:

1. Definir la configuración de infraestructura en archivos de configuración .tf.
2. Inicializar el directorio de trabajo de Terraform con el comando terraform init.
3. Crear un plan de ejecución para la infraestructura con el comando terraform plan.
4. Revisar y aprobar el plan de ejecución si está de acuerdo con los cambios propuestos.
5. Aplicar los cambios propuestos con el comando terraform apply.
6. Verificar la infraestructura creada y el estado actual de la misma con el comando terraform show.
7. Modificar la configuración de infraestructura en los archivos .tf y volver a partir del paso 3 si se requieren cambios.

A continuación, describimos los comandos más utilizados en Terraform:

- terraform init: Este comando inicializa el directorio de trabajo de Terraform y descarga las dependencias necesarias, como los proveedores y módulos. Se recomienda ejecutar este comando siempre que se inicie un nuevo proyecto o cuando se realicen cambios en los proveedores o módulos.

- terraform plan: Este comando muestra un plan de ejecución que describe los cambios que se van a realizar en la infraestructura. Este plan incluye la creación, modificación o eliminación de recursos. También muestra un resumen de los cambios y un resumen de los costos estimados.

- terraform apply: Este comando aplica los cambios descritos en el plan de ejecución generado por el comando terraform plan. Este comando también solicita una confirmación antes de aplicar los cambios.

- terraform destroy: Este comando elimina todos los recursos creados por Terraform. Este comando también solicita una confirmación antes de eliminar los recursos.

- terraform show: Este comando muestra el estado actual de la infraestructura en formato legible por humanos. Este comando también se puede utilizar para verificar si los recursos se han creado correctamente.

- terraform validate: Este comando verifica la sintaxis de los archivos .tf y comprueba si la configuración es válida.

- terraform state: Este comando se utiliza para gestionar el estado de la infraestructura. Este comando se puede utilizar para ver, actualizar o eliminar recursos del estado.

Estos son algunos de los comandos más utilizados en Terraform, pero hay muchos otros comandos y opciones que se pueden utilizar según sea necesario.

Con esto terminamos el primer capítulo.
En el segundo capítulo trabajaremos el stack de una aplicación multi-tier en AWS.