IaC en la nube (Terraform & CloudFormation)
IaC en la nube es el uso de herramientas declarativas para aprovisionar y gestionar recursos cloud (red, compute, storage, seguridad) como codigo, de forma repetible, versionable y…
Definicion
IaC en la nube es el uso de herramientas declarativas para aprovisionar y gestionar recursos cloud (red, compute, storage, seguridad) como codigo, de forma repetible, versionable y escalable. En esta nota se cubren Terraform (multi‑cloud) y AWS CloudFormation (AWS‑native).
Contexto
- IaC cloud es una pieza central de DevSecOps y Seguridad en canalizaciones DevOps (CI-CD).
- Complementa la nota base de Infraestructura como codigo (IaC).
- Contraste con on‑prem en IaC local (On-Prem) - Vagrant & Ansible.
- Para conceptos de VPC/SG/NACL, ver Cloud Security Fundamentals.
Desarrollo (MIT-style)
1) Panorama de IaC cloud
- En cloud, IaC permite crear infraestructura elastica y consistente con un flujo declarativo.
- Herramientas clave en esta nota:
- Terraform: multi‑cloud, basado en HCL y archivo de estado.
- CloudFormation: servicio gestionado AWS‑native con plantillas JSON/YAML.
2) Terraform — fundamentos
Arquitectura (alto nivel):
- Terraform Core aplica el estado deseado.
- Fuentes de verdad:
- Archivos de configuracion (definen recursos).
- Estado (
terraform.tfstate) con el estado actual.
- Providers ejecutan las acciones contra APIs (AWS, Azure, GCP, Kubernetes, etc.).
Configuracion (HCL):
provider "aws" { region = "eu-west-2"}
resource "aws_vpc" "flynet_vpc" { cidr_block = "10.0.0.0/16" tags = { Name = "flynet-vpc" }}Dependencias entre recursos:
resource "aws_security_group" "example_security_group" { name = "example-security-group" description = "Example Security Group" vpc_id = aws_vpc.flynet_vpc.id
ingress { from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = [aws_vpc.flynet_vpc.cidr_block] }}Modularizacion (estructura ejemplo):
tfconfig/ - flynet_vpc_security.tf - other_module.tf - variables.tf - main.tfVariables y modulos (resumen):
variable "vpc_cidr_block" { description = "CIDR block for the VPC" type = string default = "10.0.0.0/16"}module "flynet_vpc_security" { source = "./flynet_vpc_security.tf"}Flujo de trabajo (dia 1 / dia 2+ / dia N):
- Write → Init → Plan → Apply
- Destroy cuando la infraestructura ya no se necesita.
Comandos clave:
terraform initterraform planterraform applyterraform destroy3) CloudFormation — fundamentos
Modelo declarativo: plantillas JSON/YAML describen estado deseado.
Plantillas y pilas:
- La plantilla crea una stack (pila) que agrupa recursos.
Ejemplo minimo (template):
AWSTemplateFormatVersion: '2010-09-09'Description: 'A simple CloudFormation template'
Resources: MyEC2Instance: Type: 'AWS::EC2::Instance' Properties: ImageId: 'ami-12345678' InstanceType: 't2.micro' KeyName: 'my-key-pair'
MyS3Bucket: Type: 'AWS::S3::Bucket' Properties: BucketName: 'my-s3-bucket'
Outputs: EC2InstanceId: Description: 'ID of the EC2 instance' Value: !Ref MyEC2InstanceArquitectura (master‑worker):
- Nodo principal (servicio CloudFormation) orquesta.
- Nodos de trabajo en regiones AWS aprovisionan recursos.
Funciones y conceptos clave:
- Secciones: Version, Description, Parameters, Resources, Outputs.
- Funciones intrinsecas:
!Ref,!GetAtt,!Sub. - Change Sets: previsualizar cambios.
- Eventos y rollback: registro de eventos y reversion automatica en errores.
- Referencias entre pilas para dependencias multi‑stack.
4) Terraform vs CloudFormation (resumen)
| Dimension | Terraform | CloudFormation |
|---|---|---|
| Alcance | Multi‑cloud | AWS‑native |
| Estado | tfstate |
State gestionado por AWS |
| Lenguaje | HCL | JSON/YAML |
| Ecosistema | Comunidad + modulos | Integracion nativa AWS |
| Uso tipico | Hibrido/multinube | AWS puro |
5) IaC seguro (cloud)
Buenas practicas comunes (Terraform + CloudFormation):
- Control de versiones (Git) y revisiones de codigo.
- Minimo privilegio en credenciales.
- Parametrizar secretos (no hardcode).
- Gestion segura de credenciales y registros de auditoria.
CloudFormation:
- Usar roles IAM con permisos minimos.
- Guardar templates en S3 cifrado.
- Politicas de stack para controlar actualizaciones.
Terraform:
- Cifrar estado y usar backends remotos.
- Proteger variables sensibles (Vault/KMS).
- Configurar credenciales del proveedor de forma segura.
6) Practica guiada (lab)
- Sitio interactivo con etapas Review → Apply → Destroy.
- Simula flujo de Terraform (init/plan/apply/destroy).
- Rellena YAML con bloques seguros para endurecer la infraestructura.
Ejemplos
- Terraform: VPC + Security Group con dependencia por referencia de recursos.
- CloudFormation: plantilla con EC2 + S3 y outputs.
- Escenario: multinube (Terraform) vs AWS‑centrico (CloudFormation).
Pitfalls / Errores comunes
- No usar
plan/change setsantes de aplicar cambios. - Secrets en texto plano dentro de templates/HCL.
- Permisos excesivos en roles/credenciales IaC.
- Estado sin cifrado o sin backend remoto.
- Plantillas almacenadas sin control de acceso.
Diagrama
flowchart LR subgraph Terraform A[HCL config] --> B[terraform init] B --> C[terraform plan] C --> D[terraform apply] D --> E[tfstate] end subgraph CloudFormation T[Template JSON/YAML] --> V[Validate] V --> O[Orchestrate] O --> W[Workers AWS Regions] W --> S[Stack Create/Update] end
Referencias
- TryHackMe — Intro to IaC: https://tryhackme.com/room/introtoiac
- TryHackMe — Source Code Security: https://tryhackme.com/room/sourcecodesecurity
- CloudFormation Designer: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/working-with-templates-cfn-designer-overview.html
- AWS S3: https://aws.amazon.com/s3/
- AWS Auto Scaling: https://aws.amazon.com/autoscaling/
- AWS Rollback (Auto Scaling): https://docs.aws.amazon.com/autoscaling/ec2/userguide/instance-refresh-rollback.html
- AWS IAM: https://aws.amazon.com/iam/?gclid=Cj0KCQiAm4WsBhCiARIsAEJIEzXouhhd93RvbhqE9xDx8UN65Y44Gq19qsHQf_D5yk9QkScSLgQwvDgaAtOWEALw_wcB&trk=35b38fd8-ca20-4fe2-b46d-16f845a47e34&sc_channel=ps&ef_id=Cj0KCQiAm4WsBhCiARIsAEJIEzXouhhd93RvbhqE9xDx8UN65Y44Gq19qsHQf_D5yk9QkScSLgQwvDgaAtOWEALw_wcB:G:s&s_kwcid=AL!4422!3!651612449969!e!!g!!amazon%20iam!19836376240!155574317508
- TryHackMe image (Terraform provisioning): https://tryhackme-images.s3.amazonaws.com/user-uploads/6228f0d4ca8e57005149c3e3/room-content/7cdb769ecb4e5b5a0bb23f30d999454a.svg
- TryHackMe image (Terraform architecture): https://tryhackme-images.s3.amazonaws.com/user-uploads/6228f0d4ca8e57005149c3e3/room-content/b25923ed88b91dc85d24605c3b97f03d.svg
- TryHackMe image (Terraform Day 1): https://tryhackme-images.s3.amazonaws.com/user-uploads/6228f0d4ca8e57005149c3e3/room-content/8f2325af86bb7978f2106f733caac33b.svg
- TryHackMe image (Terraform Day N): https://tryhackme-images.s3.amazonaws.com/user-uploads/6228f0d4ca8e57005149c3e3/room-content/667e6e2b9cbac61df9d17ac8e0aabae9.svg
- TryHackMe image (CloudFormation flow): https://tryhackme-images.s3.amazonaws.com/user-uploads/61a7523c029d1c004fac97b3/room-content/10cd2efae7292cd42ba523ba3625c3c8.svg
- TryHackMe image (Terraform vs CloudFormation): https://tryhackme-images.s3.amazonaws.com/user-uploads/6228f0d4ca8e57005149c3e3/room-content/46b69b1f213ad744229dd1a273835633.svg