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. :)