Implantando em várias contas com Terraform?

Implantando em várias contas com Terraform?

Estou procurando uma maneira do Terraform de poder implantar em várias contas da AWS simultaneamente no Terraform e sem sucesso. A AWS tem o conceito de fazer isso com Stacks, mas não tenho certeza se existe uma maneira de fazer isso no TF. Se sim, quais seriam algumas soluções?

Você pode ler mais sobre a solução AWS aqui,https://aws.amazon.com/blogs/mt/supercharge-multi-account-management-with-aws-cloudformation/

Responder1

Existem dois problemas que precisam ser superados para usar as mesmas configurações de terraform em várias contas da AWS. A primeira é que você precisará usar um arquivo de estado diferente para cada conta. A segunda será garantir que o provedor AWS use o perfil/credenciais corretos para a conta desejada.

Usando um arquivo de estado diferente para cada conta

Em um nível superior, o terraform funciona simplesmente criando um gráfico de recursos de dependência a partir dos arquivos de configuração do terraform (*.tf) fornecidos; e os compara com um arquivo de estado. O arquivo de estado pode ser local ( terraform.tfstate) ou remotoProcesso interno; um back-end remoto comum da AWS és3.

Mesmo se você especificar o provedor AWS para usar contas separadas por meio de variáveis ​​(mais sobre isso abaixo), se ambas as contas usarem o mesmo back-end, o terraform irá travar continuamente. Isso ocorrerá porque, à medida que muda de uma conta para outra, os IDs da AWS dos recursos não corresponderão e/ou os recursos serão declarados no arquivo de estado que não existem na conta que o terraform está analisando atualmente.

Uma maneira simples de contornar isso é usarespaços de trabalho. Os espaços de trabalho permitem usar diferentes arquivos de estado sem especificar diferentes chaves de back-end. Usar espaços de trabalho é muito simples. Se você tiver um bloco de terraform simples, como:

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

Você pode criar novos espaços de trabalho usando terraform workspace new <workspace-name>. Assim, você pode criar um espaço de trabalho para ambas as contas usando uma sequência como:

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

E você pode mudar seu espaço de trabalho atual usando terraform workspace select:

terraform workspace select account-1

Configurando o provedor AWS para reconhecer o espaço de trabalho

Além de usar arquivos de estado separados. Você também precisará especificar diferentes credenciais da AWS (ou seja, chaves de acesso) para cada conta necessária. As credenciais da AWS são declaradas usandofornecedores. Neste caso, obviamente estamos usando oProvedor AWS.. Você essencialmente deseja usarinterpolaçãodentro do bloco de recursos do provedor AWS, portanto, quando você alternar os espaços de trabalho, o terraform usará as credenciais corretas. Supondo que você tenha seu arquivo de credenciais do AWS configurado com um perfil separado por conta:

[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

Então você pode simplesmente escrever seu bloco de provedor aws como:

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

Portanto, contanto que você nomeie seus espaços de trabalho como nomes de perfil do aws, quando você alternar os espaços de trabalho, o terraform usará um perfil de credencial do aws diferente ao atualizar o estado e construir um gráfico de dependência.

Métodos alternativos

Esta não é de longe a única maneira de conseguir isso. Você poderia construirmódulos; e então ter diretórios diferentes que chamam o módulo com diferentes provedores AWS e arquivos de estado especificados. Existem prós e contras em cada método.

O método do espaço de trabalho é como você faria isso com um único diretório e usaria exatamente os mesmos arquivos de configuração do terraform conforme foram escritos.

Os módulos exigiriam arquivos de configuração separados que pelo menos chamassem os módulos e especificassem os provedores e back-ends. Os módulos fariam muito sentido se você fosse fazer várias contas, várias regiões e vários ambientes. Por exemplo, se você fosse executar em duas regiões para cada conta e em dois ambientes diferentes (preparação e produção). Os módulos fazem sentido aqui porque fornecem flexibilidade usando argumentos como contagem (talvez o teste execute menos instâncias, etc.).

Responder2

Basicamente, o truque é obter o estado dentro de um intervalo compartilhado e especificar credenciais diferentes para as fornecidas ao trocar de conta. Os espaços de trabalho funcionam perfeitamente para mim

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 diferentes perfis especificados para configuração do provedor e de back-end. Você pode ter vários perfis diferentes, desde que cada um seja isolado em seu próprio espaço de trabalho

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

informação relacionada