¿Implementar en varias cuentas con Terraform?

¿Implementar en varias cuentas con Terraform?

He estado buscando una forma de Terraform para poder implementar en múltiples cuentas de AWS simultáneamente en Terraform y quedarme seco. AWS tiene el concepto de hacer esto con Stacks, pero no estoy seguro de si hay una manera de hacerlo en TF. Si es así, ¿cuáles serían algunas soluciones?

Puede leer más sobre la solución AWS aquí,https://aws.amazon.com/blogs/mt/supercharge-multi-account-management-with-aws-cloudformation/

Respuesta1

Hay dos problemas que deben superarse para utilizar las mismas configuraciones de terraform en varias cuentas de AWS. La primera es que necesitarás utilizar un archivo de estado diferente para cada cuenta. El segundo será asegurarse de que el proveedor de AWS utilice el perfil/las credenciales correctas para la cuenta deseada.

Usar un archivo de estado diferente para cada cuenta

En un nivel alto, terraform funciona simplemente creando un gráfico de recursos de dependencia a partir de los archivos de configuración de terraform (*.tf) proporcionados; y los compara con un archivo estatal. El archivo de estado puede ser local ( terraform.tfstate) o remoto.backend; un backend remoto común de AWS ess3.

Incluso si especifica que el proveedor de AWS use cuentas separadas a través de variables (más sobre esto a continuación), si ambas cuentas usan el mismo backend, terraform fallará continuamente. Esto ocurrirá porque, a medida que cambia de una cuenta a otra, los ID de AWS de los recursos no coincidirán y/o los recursos se indicarán en el archivo de estado que no existen en la cuenta que Terraform está analizando actualmente.

Una forma sencilla de evitar esto es utilizarespacios de trabajo. Los espacios de trabajo le permiten utilizar diferentes archivos de estado sin especificar diferentes claves de backend. Usar espacios de trabajo es muy sencillo. Si tiene un bloque terraform simple como:

terraform {
    backend "s3" {
       bucket = "aws_bucket"
       key    = "terraform.tfstate"
       region = "us-east-1"
    }
}

Puede crear nuevos espacios de trabajo usando terraform workspace new <workspace-name>. Entonces, puedes crear un espacio de trabajo para ambas cuentas usando una secuencia como:

terraform workspace new account-1
terraform workspace new account-2

Y puedes cambiar tu espacio de trabajo actual usando terraform workspace select:

terraform workspace select account-1

Configurar el proveedor de AWS para que tenga en cuenta el espacio de trabajo

Además de utilizar archivos de estado separados. También deberá especificar diferentes credenciales de AWS (es decir, claves de acceso) para cada cuenta necesaria. Las credenciales de AWS se indican medianteproveedores. En este caso, obviamente estamos usando elProveedor de AWS.. Básicamente quieres usarinterpolacióndentro del bloque de recursos del proveedor de AWS, de modo que cuando cambie de espacio de trabajo, terraform utilizará las credenciales correctas. Suponiendo que tiene su archivo de credenciales de AWS configurado con un perfil separado por cuenta:

[account-1]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

[account-2]
aws_access_key_id=AKIAI44QH8DHBEXAMPLE
aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY

Luego, simplemente puede escribir su bloque de proveedor de AWS como:

provider "aws" {
    region  = "us-east-1"
    profile = "${terraform.workspace}"
}

Entonces, siempre que nombre sus espacios de trabajo como los nombres de su perfil de AWS, cuando cambie de espacio de trabajo, terraform utilizará un perfil de credenciales de AWS diferente al actualizar el estado y crear un gráfico de dependencia.

Metodos alternativos

Esta no es ni mucho menos la única manera de lograrlo. Podrías construirmódulos; y luego tener diferentes directorios que llamen al módulo con diferentes proveedores de AWS y archivos de estado especificados. Hay pros y contras de cada método.

El método del espacio de trabajo es cómo lo haría con un solo directorio, y estaría usando exactamente los mismos archivos de configuración de terraform tal como están escritos.

Los módulos requerirían archivos de configuración separados que al menos llamen a los módulos y especifiquen los proveedores y los servidores. Los módulos tendrían mucho sentido si fuera a trabajar con múltiples cuentas, múltiples regiones y múltiples entornos. Por ejemplo, si fuera a ejecutar en dos regiones para cada cuenta y dos entornos diferentes (ensayo y producción). Los módulos tienen sentido aquí porque brindan flexibilidad al usar argumentos como el recuento (quizás la preparación ejecutará una menor cantidad de instancias, etc.).

Respuesta2

Básicamente, el truco consiste en obtener el estado dentro de un depósito compartido y especificar diferentes credenciales para las proporcionadas al cambiar de cuenta. Los espacios de trabajo me funcionan perfectamente

provider "aws" {
  version = "~> 2.18"
  profile = "second_account"
}

terraform {
  backend "s3" {
    encrypt = true
    bucket  = "shared_bucket"
    region  = "us-east-1"
    key     = "state"
    profile = "first_shared_account"
  }

  required_version = "~> 0.12.7"
}

Observe los diferentes perfiles especificados para la configuración del proveedor y del backend. Puede tener varios perfiles diferentes siempre que cada uno de ellos esté aislado en su propio espacio de trabajo.

aws configure --profile third_account
terraform workspace new third_account
terraform workspace select third_account

información relacionada