Existe una pregunta bastante interesante cuando se empieza a usar Terraform para mover la infraestructura de alguna aplicación web o producto; ¿Qué hago con los recursos compartidos y/o reusables?
Por ejemplo, si estamos usando AWS, la VPC y sus subnets son recursos que se crearán una vez y serán la base para levantar diferentes servicios y asignarles una IP. Si tenemos una aplicación web con dos diferentes workspaces, llamémoslos stage y prod, éstos necesitaran importar una VPC y subnets existente. Yo llamo a este tipo de recursos reusables base-resources o common-resources.
Si usamos un backend de Terraform remoto como Terraform Cloud, es recomendable tener un workspace independiente para estos recursos base y separarlos del código de tus aplicaciones web y éstos tienen outputs que devuelven el id de la VPC y el subnet:
Por ejemplo, si estamos usando AWS, la VPC y sus subnets son recursos que se crearán una vez y serán la base para levantar diferentes servicios y asignarles una IP. Si tenemos una aplicación web con dos diferentes workspaces, llamémoslos stage y prod, éstos necesitaran importar una VPC y subnets existente. Yo llamo a este tipo de recursos reusables base-resources o common-resources.
Si usamos un backend de Terraform remoto como Terraform Cloud, es recomendable tener un workspace independiente para estos recursos base y separarlos del código de tus aplicaciones web y éstos tienen outputs que devuelven el id de la VPC y el subnet:
provider "aws" {} resource "aws_vpc" "vpc" { ... } resource "aws_subnet" "subnet" { vpc_id = aws_vpc.vpc.id ... } output "vpc" { value = aws_vpc.vpc.id } output "subnet" { value = aws_subnet.subnet.id }
Ahora imaginemos que necesitamos crear una instancia EC2 que usará la VPC creada en el paso anterior. Esta infraestructura se definirá en otro proyecto e importaremos el estado de base-resources:
data "terraform_remote_state" "base_resources" { backend "remote" { config = { organization = "ORG" workspaces = { name = "my-base-resources" } } }
Con el estado externo disponible, ahora podemos crear la instancia EC2 con la VPC y subnets requeridas:
provider "aws" {} resource "aws_instance" "ec2" { ... subnet_id = data.base_resources.outputs.subnet.id ... }
Esta es una muy buena práctica para evitar repetir código y mantener la administración de infraestructura sin mezclar recursos de una aplicación con los recursos comunes o compartidos de proveedor en la nube.