Yamil Urbina

May 21, 2021

Importando el estado de otro workspace en Terraform Cloud

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:

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.