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 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 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
Escribiendo infraestructura como desarrollando software permite agilidad al aprovisionar recursos en minutos, escalabilidad al aumentar o disminuir capacidad según demanda de las aplicaciones y reducción de costos al pagar sólo por uso. Son grandes ventajas de la virtualización y computación en la nube para reducir tiempo en operación manual tecnológica y aumentar el enfoque en el desarrollo de nuevas tecnologías.
Referencias
What is AWS CloudFormation?, AWS CloudFormation UserGuide: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html
Terraform — Getting Started by Ned Bellavance, Pluralsight: https://www.pluralsight.com/courses/terraform-getting-started-2021
What is the difference between YAML and JSON?, Geeks for Geeks: https://www.geeksforgeeks.org/what-is-the-difference-between-yaml-and-json/
Anatomía de la plantilla CloudFormation, AWS CloudFormation UserGuide: https://docs.aws.amazon.com/es_es/AWSCloudFormation/latest/UserGuide/template-anatomy.html
Terraformando las nubes, Deloitte: https://www2.deloitte.com/es/es/blog/todo-tecnologia/2021/que-es-terraform.html