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 configure
configurações que entram nas ~/.aws/credentials
declarações de variáveis Terraform acima.
Tudo funciona bem desde que os creds estejam, ~/.aws/credentials
mas 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/credentials
executando, aws configure
ele funcionará bem novamente.
Não estou entendendo - se minha provider
configuraçã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.
AWS_PROFILE
ouAWS_DEFAULT_PROFILE
não estão definidas, pois são uma dica para o AWS SDK de que ele deve procurar no arquivo de credenciais.Respostas:
Sua primeira pergunta
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.tfstate
e 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.tfstate
arquivo.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:
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.
Sua segunda pergunta,
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
Se você desejar especificar credenciais da AWS ao executar,
terraform init
especifique 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.tfstate
arquivo:Novamente, as credenciais de back-end do S3 são configuradas separadamente das credenciais do provedor da AWS.
Execute novamente
terraform init
e especifique as credenciais na linha de comando como--backend-config
opções para corrigir seu erro.fonte
shared_credentials_file
opçã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.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_key
esecret_key
opções de configuração que se você não está usando~/.aws/credentials
você precisará explicitamente configure.fonte
É melhor configurar perfis em seus
~/.aws/credentials
arquivos, comoEm seu provedor, você pode dizer qual perfil usar
Ele manterá as chaves fora dos arquivos de terraform, o que é uma coisa boa se você quiser colocá-las no controle de origem.
fonte