Migrar servicio a otra región AWS usando Terraform Workspaces y Git Branches

En este ejercicio lo que queremos realizar es el migrar un servicio (Cluster, ECS, RDS, EC2) hacia otra región de AWS.

La idea principal es crear un workspace en terraform para manejar el estado de transición y una rama de git para llevar los cambios necesarios en los archivos .tf y si tu infraestructura lo permite solo tendrías que meter cambios en el segmento provider como se ve acontinuación.

provider "aws" {
  region = "us-east-1"
}

Tomemos en cuenta que este ejercicio depende de:

  • Tu backend de estados esta en S3
  • Tu Lock con DynamoDB

Y muy importante notificar a tu Equipo que estas trabajando en una migración para que no metan cambios :)

Migrar el servicio

Creamos una rama git para los cambios y un workspace para el estado

git checkout -b enhancement/migration
terraform workspace new migration

Revisamos que estemos en el nuevo workspace

terraform workspace list
  default
* migration

Realizamos las adecuaciones a nuestros archivos terraform, como el cambio de nombre de la región AWS en el segmento de provider.

Validamos y aplicamos los recursos en la nueva región.

terraform plan
terraform apply

Ahora tenemos nuestro servicio completamente creado, hacemos nuestras pruebas para validar que la replica en la región este funcional antes de pasar a migrar el estado de terraform.

Para finalizar confirmamos nuestros cambios en la rama

git add *.tf 
git commit -b "region migration for service X"
git push 

Mover nuestro workspace migration hacia el default

Una vez que terminamos de crear el servicio en la nueva región tenemos ahora que mover nuestro estado de terraform hacia el workspace default.

Siempre antes de hacer algun moviento con terraform apliquen un plan para verificar que nuestra infraestructura esta sin cambios pendientes.

Primero nos movemos al workspace migration y respaldamos el estado para importarlo mas adelante.

terraform workspace select migration
terraform state pull > migration.tfstate

Una vez respaldado, nos movemos al workspace default y a nuestra rama de producción (master)

git checkout master
terraform workspace select default

Ahora volvemos a confirmar cambios y eliminamos el stack que ya migramos

terraform plan
terraform destroy

Nos regresamos a la rama de migración que tiene los cambios e importamos el estado previo que generamos (migration.tfstate) al workspace default.

git checkout enhancement/migration
terraform workspace select default
terraform state push migration.tfstate

Validamos con un plan para revisar que la infraestructura no tenga cambios.

Y para finalizar eliminamos nuestro workspace donde llevamos la migración

terraform workspace delete -force migration

Con el estado ya alojado en nuestro workspace default creamos un PR ó hacemos merge de nuestros cambios al branch master, cual sea su flujo de integración.

Este es un proceso que me sirvió y espero a alguno de ustedes les ayude. :)

Armando Uch

An Accidental Engineer
• Lazy #Programmer • #TacOps 🌮 • #BOFH
🎸⚾️🍺☕️


2022-02-17