Descargué terraform 0.9 e intenté seguir la guía de migración para pasar del remote-state
al backend
Pero no parece funcionar. Reemplacé:
data "terraform_remote_state" "state" { backend = "s3" config { bucket = "terraform-state-${var.environment}" key = "network/terraform.tfstate" region = "${var.aws_region}" } }
con
terraform { backend "s3" { bucket = "terraform-backend" key = "network/terraform.tfstate" region = "us-west-2" } }
sin embargo, cuando ejecuto terraform
init en una de mis carpetas de entorno, obtengo:
Advertencia de obsolescencia: este entorno está configurado para usar el estado remoto heredado. El estado remoto cambió significativamente en Terraform 0.9. Actualice su configuración de estado remoto para usar la nueva configuración de 'backend'. Por ahora, Terraform continuará usando su configuración actual. El soporte de estado remoto heredado se eliminará en Terraform 0.11.
Puede encontrar una guía para actualizar aquí:
También tuve que eliminar la interpolación de variables ya que esto ya no está permitido. ¿Significa eso que un S3 Bucket se usa para múltiples entornos? ¿Qué me he perdido aquí?
Según la guía de actualización ( https://www.terraform.io/docs/backends/legacy-0-8.html ) después de terraform init
, también debe ejecutar el terraform plan
para finalizar la migración, que actualizará el archivo de estado remoto en s3 .
En cuanto a la configuración para múltiples entornos, terminamos usando una secuencia de comandos de shell contenedor con el paso de parámetros para ${application_name}/${env}/${project}
y usando una configuración parcial.
Para una estructura de proyecto como esta:
├── projects │ └── application-name │ ├── dev │ │ ├── bastion │ │ ├── db │ │ ├── vpc │ │ └── web-cluster │ ├── prod │ │ ├── bastion │ │ ├── db │ │ ├── vpc │ │ └── web-cluster │ └── backend.config └── run-tf.sh
para cada application_name/env/component = carpeta (es decir, dev/vpc) agregamos un archivo de configuración de back-end de marcador de posición como este: backend.tf
:
terraform { backend "s3" { } }
Donde el contenido de la carpeta para cada componente se verá así:
│ ├── prod │ │ ├── vpc │ │ │ ├── backend.tf │ │ │ ├── main.tf │ │ │ ├── outputs.tf │ │ │ └── variables.tf
En el nivel "application_name/" o "application_name/env" agregamos un archivo backend.config, como este:
bucket = "BUCKET_NAME" region = "region_name" lock = true lock_table = "lock_table_name" encrypt = true
Nuestro script de shell contenedor espera que se ejecuten los parámetros application-name
, environment
, component
y el terraform cmd
real.
El contenido del script run-tf.sh (simplificado):
#!/bin/bash application=$1 envir=$2 component=$3 cmd=$4 tf_backend_config="root_path/$application/$envir/$component/backend.config" terraform init -backend=true -backend-config="$tf_backend_config" -backend-config="key=tfstate/${application}/${envir}/${component}.json" terraform get terraform $cmd
Así es como se ve una invocación típica de run-tf.sh:
$ run-tf.sh application_name dev vpc plan $ run-tf.sh application_name prod bastion apply
Te confundiste con el comando remoto terraform con el estado remoto. No tiene que cambiar ninguna cosa de estado remoto que tenga en sus archivos tf.
En lugar de configurar su estado remoto con el comando remoto terraform y use el archivo de configuración de back-end mencionado en el enlace de migración.
Vea el segundo comentario de github en este enlace. Tiene un buen procedimiento paso a paso sobre lo que hizo para migrar. https://github.com/hashicorp/terraform/issues/12792