Terraform: Escolhendo credenciais para um arquivo de estado remoto

10

Eu tenho infraestrutura existente no Terraform e a uso há algum tempo. Recentemente, troquei as credenciais da AWS do meu laptop local (os creds armazenados ~/.aws/credentials) e ele parou de funcionar até que eu as reconfigurasse novamente.

O problema é que estou declarando os creds na própria fonte Terraform, mas parece que não os estou usando.

terraform {
  backend "s3" {
    bucket = "example_tf_states"
    key    = "global/vpc/us_east_1/example_state.tfstate"
    encrypt = true
    region     = "us-east-1"
  }
}

provider "aws" {
  access_key = "${var.access_key}"
  secret_key = "${var.secret_key}"
  region = "${var.region}"
}



variable "access_key" {
  default = "<hidden_for_stack_exchange_post>"
}

variable "secret_key" {
  default = "<hidden_for_stack_exchange_post>"
}

variable "region" {
  default = "us-east-1"
}

As permissões de identificação de acesso são 100% boas. Estou usando o mesmo ID de conta e chave secreta para as aws configureconfigurações que entram nas ~/.aws/credentialsdeclarações de variáveis ​​Terraform acima.

Tudo funciona bem desde que os creds estejam, ~/.aws/credentialsmas assim que as credenciais no nível do sistema operacional desaparecem (ou seja rm ~/.aws/credentials), recebo o seguinte ao tentar executar as operações do Terraform, como terraform plan:

Failed to load backend:
Error configuring the backend "s3": No valid credential sources found for AWS Provider.
  Please see https://terraform.io/docs/providers/aws/index.html for more information on
  providing credentials for the AWS Provider

Please update the configuration in your Terraform files to fix this error.
If you'd like to update the configuration interactively without storing
the values in your configuration, run "terraform init".

Se eu preencher novamente o ~/.aws/credentialsexecutando, aws configureele funcionará bem novamente.

Não estou entendendo - se minha providerconfiguração está declarando explicitamente as credenciais para usar dentro do código-fonte do Terraform, por que minha configuração da AWS no nível do SO é importante?

Como posso fazer com que o Terraform use apenas os creds definidos na minha configuração do Terraform e ignore o que está no meu perfil de usuário do SO?

Editar, é Terraform v0.11.7

Edit: Observe que estou tentando resolver o problema de por que os cleds declarados estaticamente não estão sendo utilizados na declaração do provedor. Não procura métodos alternativos ou soluções alternativas. Obrigado.

emmdee
fonte
Hum ... apenas um palpite. Verifique se as variáveis ​​de ambiente AWS_PROFILEou AWS_DEFAULT_PROFILEnão estão definidas, pois são uma dica para o AWS SDK de que ele deve procurar no arquivo de credenciais.
Erik Osterman
Obrigado. Resposta tardia, mas estou revisitando isso. Infelizmente, verifiquei que os ambientes não estão presentes. Realmente seria bom se pudesse solicitar creds em tempo de execução, como outros planos que não usam um back-end remoto. Obrigado de qualquer forma.
Emmdee 29/11

Respostas:

10

Sua primeira pergunta

se minha configuração de provedor está declarando explicitamente as credenciais para usar dentro do código-fonte do Terraform, por que minha configuração da AWS no nível do sistema operacional é realmente importante?

A mensagem de erro "Falha ao carregar o back-end: erro ao configurar o back-end" s3 "" refere-se à sua configuração do Backend S3.

Procure no arquivo ./.terraform/terraform.tfstatee você verá a configuração do S3 Backend.

O Terraform S3 Backend é diferente do Terraform AWS Provider. A mensagem de erro "Nenhuma fonte de credencial válida foi encontrada para o AWS Provider". é enganoso. Isso implica que a configuração do provedor da AWS seja usada, o que é falso. As credenciais de back-end do S3 são configuradas separadamente e armazenadas no terraform.tfstatearquivo.

Sua configuração da AWS no nível do sistema operacional é importante porque, se nenhuma credencial de back-end do S3 for especificada, conforme documentado aqui https://www.terraform.io/docs/backends/types/s3.html , o Terraform usará o seguinte, na ordem seguinte:

  1. Variáveis ​​de ambiente AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY
  2. Arquivo de credenciais compartilhadas da AWS, o valor padrão é "~ / .aws / credenciais".

Você não especificou nenhuma credencial na configuração do S3 Backend, portanto o terraform é o padrão para o arquivo de credenciais compartilhadas da AWS.

Sua configuração de back-end do S3 não contém credenciais.

terraform {
  backend "s3" {
    bucket = "example_tf_states"
    key    = "global/vpc/us_east_1/example_state.tfstate"
    encrypt = true
    region     = "us-east-1"
  }
}

Sua segunda pergunta,

Como posso fazer com que o Terraform use apenas os creds definidos na minha configuração do Terraform e ignore o que está no meu perfil de usuário do SO?

Primeiro, os back-ends não podem conter interpolação, consulte https://www.terraform.io/docs/backends/config.html . Portanto, você não pode usar nenhuma variável na configuração de back-end. por exemplo, esta configuração é inválida

terraform {
  backend "s3" {
    bucket = "example_tf_states"
    key    = "global/vpc/us_east_1/example_state.tfstate"
    encrypt = true
    region     = "us-east-1"
    access_key = ${var.access_key}
    secret_key = ${var.secret_key}
  }
}

Se você desejar especificar credenciais da AWS ao executar, terraform initespecifique a configuração de back-end como opções.

terraform init --backend-config="access_key=your_access_key" --backend-config="secret_key=your_secret_key"

Isso produz uma configuração do S3 Backend semelhante a esta, armazenada no ./.terraform/terraform.tfstatearquivo:

{
    "version": 3,
    "serial": 1,
    "lineage": "bd737d2d-1181-ed64-db57-467d14d2155a",
    "backend": {
        "type": "s3",
        "config": {
            "access_key": "your_access_key",
            "secret_key": "your_secret_key"
        },
        "hash": 9345827190033900985
    },

Novamente, as credenciais de back-end do S3 são configuradas separadamente das credenciais do provedor da AWS.

Execute novamente terraform inite especifique as credenciais na linha de comando como --backend-configopções para corrigir seu erro.

Mike Marseglia
fonte
Obrigado. Resposta muito detalhada e agora entendo o problema. No meu caso de uso, acabei usando a shared_credentials_fileopção que todos os meus back-ends e provedores coletariam e usariam. Parece estar funcionando bem e nada está bloqueado nas credenciais aws da estação de trabalho do SO.
emmdee
3

O erro que você está recebendo refere-se especificamente à configuração do back-end do S3, que o AFAIK não herda as configurações da configuração do provedor da AWS; ele também tem access_keye secret_keyopções de configuração que se você não está usando ~/.aws/credentialsvocê precisará explicitamente configure.

bodgit
fonte
1

É melhor configurar perfis em seus ~/.aws/credentialsarquivos, como

[profile1]
aws_access_key_id = xxxx
aws_secret_access_key = xxxxx
region = us-east-1

[profile2]
aws_access_key_id = xxxx
aws_secret_access_key = xxxx
region = us-west-2

Em seu provedor, você pode dizer qual perfil usar

provider "aws" {
  profile = "profile2"
  region = "${var.region}"
}

Ele manterá as chaves fora dos arquivos de terraform, o que é uma coisa boa se você quiser colocá-las no controle de origem.

Mike
fonte
Obrigado pela contribuição. Estou muito ciente dos perfis de credenciais, no entanto, estou procurando uma solução para a pergunta específica em vez de um método ou solução alternativa. Os creds precisam estar em variáveis ​​para o escopo desta questão. Muito apreciado independentemente.
emmdee