Infraestructura como código: Cloudformation vs Terraform
Tags: aws, cloudformation, terraform, iac
Published: 2023-03-15 13:46:34

La infraestructura tecnológica es cada vez más requerida de forma más rápida y eficiente para soportar sistemas robustos y disponibles para los usuarios. Librerias, paquetes y codigo fuente que componen el sofware requieren de elementos de hardware para ejecutar correctamente, y con la evolución del modelo de implementación de infraestructura tecnológias físicas a infraestructuras virtuales, la entrega de dichos elementos es mucho más rápida. Por ejemplo, tener 100 servidores virtuales configurados en minutos gracias a la infraestructura como código.

---

## Infraestructura como código

Entender el concepto de infraestructura como código ó IaC es simple si nos preguntamos, ¿Y si pudieramos implementar infraestructura tecnológica virtual como si estuviéramos desarrollando software?. Esto significa provisionar infraestructura a tráves del software para tener aplicaciones más consistentes aprovechando los ciclos de DevOps para ser automatizados.

**¿Cómo funciona la IaC?**

Los recursos de infraestructura se declaran en una plantilla de código, luego es ejecutado por el sistema IaC para crear esos recursos en una cuenta de proveedor de nube. Se pueden agrupar recursos en stacks para usar varias veces y por otros stacks. Las plantillas pueden estar almacenadas en un repositorio de código, versionadas con un sistema de control de versiones y desplegadas mediante pipelines en diferentes ambientes, similar a como se entrega una aplicación con DevOps.

**YAML vs JSON**

La infraestructura como codigo es usada con los lenguajes de programación YAML y JSON para declarar los recursos en las plantillas.

- YAML significa Yet Another Markup Language. JSON significa JavaScript Object Notation.
- YAML es un lenguaje de indentación. JSON usa llaves, basado en javascript.
- YAML es más legible para humanos. JSON es común en aplicaciones web y base de datos cloud.
- YAML usa extensiones .yam o .yml. JSON usa extensión .json

A continuación una pequeña guía básica de los servicios de IaC más comunes, AWS Cloudformation y HashiCorp Teraform.

## AWS CloudFormation

Desarrollado por AWS, CoudFormation permite el despliegue de infraestructura de forma declarativa usando plantillas en YAML ó JSON. La creación de recursos (VM, buckets, SG) se ejecutan en el orden correcto y según configuración especificadas en la cuenta de AWS. Permite separación de plantillas y recursos a través de pilas (stacks), con bajo costo de implementación.

**Anatamonía de template Cloudformation**

```
---
AWSTemplateFormatVersion: "version date"

Description: # Descripcion general del stack.
  String

Parameters: # Variables de entradas dinámicas.
  set of parameters

Mappings: # Variables estáticas.
  set of mappings

Conditions: # Lista de condiciones.
  set of conditions

Resources: # Recursos declarados.
  set of resources

Outputs: # Variables de salida.
  set of outputs
```

Además de desplegar recursos en la cuenta AWS también es posible configurar las aplicaciones en las máquinas virtuales mediante user-data ó cfn-init.

**User-data**

- Script en powershell (Windows) ó bash (Linux)
- Usado en instancias EC2 y ASG durante la creación del recurso.
- Formato Base64

**Cfn-init**
- Metadata de recursos.
- Configuraciones en lenguaje legible.
- La instancia EC2 consulta la metadata a CloudFormation.

## HashiCorp Terraform

Desarrollado por HashipCorp, Terraform permite definir y configurar infraestructura de forma declarativa usando un lenguaje de programación de alto nivel propio llamado HashiCorp Configuration Language (HCL). Los recursos y variables se declaran en configuration files de extensión .tf, las integraciones se realizan mediante Providers, recursos personalizados en Modules y la informacion acerca de estado de recursos en un State data (de extension .tfstate)

Es imperativo, lo que significa que se ejecuta para alcanzar un estado final deseado de los recursos.

**Anatamonía de template Terraform**

```
# Definicion de recursos
block_type "label" "name_label" {
    key = "value"
    nested_block {
        key = "value"
        }
    }

# Declaracion de variables de entrada
variable "name_label" {
   type = value
   description = "value"
   default = "value"
   sensitive = true | false
}

# Variables locales
locals {
key = value
}

# Variables de salida
output "name_label" {
value = output_value
description = "Description of output"
sensitive = true | false
}

# Providers
terraform {
    required_providers {
        provider_name = {
            source = "address_to_provider"
            version = "version_expression"
        }
    }
}

# Modules
module "name_label" {
    source = "local_or_remote_source"
    version = "version_expression"
    providers = {
        module_provider = parent_provider
    }
# Input variable values...
}
```

La configuracion de las aplicaciones en las máquinas virtuales se pueden realizar mediante mediante user-data ó funciones propias del lenguaje HCL. Para desplegar los recursos se usan los siguientes comandos en la terminal:

```
# Inicializar entorno Terraform
$> terraform init

# Planear estado deseado
$> terraform plan

# Desplegar plan si no hay errores
$> terraform apply

# Destruir plan y recursos desplegados
$> terraform destroy
```

Publicado en: [The Bucket of Notes](https://medium.com/@thebucketofnotes/infraestructura-como-c%C3%B3digo-cloudformation-vs-terraform-9174b8376c7b)