Infraestructura como código: Cloudformation vs Terraform
Héctor Alexander 🧑💻📖
Posted on March 15, 2023
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
Posted on March 15, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.