Terraform: elección de credenciales para un archivo de estado remoto

10

Tengo infraestructura existente en Terraform y la he estado usando por un tiempo. Recientemente cambié las credenciales de AWS de mi computadora portátil local (los créditos almacenados ~/.aws/credentials) y dejó de funcionar hasta que restablecí esas credenciales.

El problema es que estoy declarando los créditos en la fuente Terraform en sí, pero parece que no los está usando en absoluto.

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"
}

Los permisos de ID de acceso son 100% válidos. Estoy usando la misma ID de cuenta y clave secreta, tanto para la aws configureconfiguración que entra ~/.aws/credentialscomo en las declaraciones de variables de Terraform anteriores.

Todo funciona bien siempre y cuando las credenciales estén dentro, ~/.aws/credentialspero tan pronto como desaparezcan las credenciales del nivel del sistema operativo (es decir rm ~/.aws/credentials), obtengo lo siguiente cuando intento ejecutar operaciones de 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".

Si vuelvo a llenar el ~/.aws/credentialsarchivo ejecutándolo aws configure, funcionará bien nuevamente.

No entiendo: si mi providerconfiguración declara explícitamente las credenciales para usar dentro del código fuente de Terraform, ¿por qué es importante mi configuración de AWS a nivel de sistema operativo?

¿Cómo puedo hacer que Terraform solo use los créditos definidos en mi configuración de Terraform e ignore lo que hay en mi perfil de usuario del sistema operativo?

Editar, es Terraform v0.11.7

Editar: tenga en cuenta que estoy tratando de resolver el problema de por qué los créditos declarados estáticamente no se utilizan en la declaración del proveedor. No busco métodos alternativos o soluciones alternativas. Gracias.

emmdee
fuente
Hrm ... solo una corazonada. Asegúrese de que AWS_PROFILEo AWS_DEFAULT_PROFILEvariables de entorno no se establecen como esas son una pista para el SDK de AWS que debe buscar en el archivo de credenciales.
Erik Osterman
Gracias. Respuesta tardía pero estoy revisando esto. Lamentablemente, he comprobado que los env env no están presentes. Realmente sería bueno si pudiera generar créditos en tiempo de ejecución como otros planes que no usan un back-end remoto. Gracias de todos modos.
emmdee

Respuestas:

10

Tu primera pregunta

Si la configuración de mi proveedor declara explícitamente las credenciales para usar dentro del código fuente de Terraform, ¿por qué mi configuración de AWS a nivel de sistema operativo es importante?

El mensaje de error "Error al cargar el backend: el error al configurar el backend" s3 "" se refiere a la configuración de su Backend S3.

Mire el archivo ./.terraform/terraform.tfstatey verá la configuración del backend S3.

Terraform S3 Backend es diferente al proveedor Terraform AWS. El mensaje de error "No se encontraron fuentes de credenciales válidas para AWS Provider". es engañoso. Implica que se utiliza la configuración de AWS Provider, que es falsa. Las credenciales de backend S3 se configuran por separado y se almacenan en el terraform.tfstatearchivo.

La configuración de AWS a nivel de sistema operativo es importante porque si no se especifican las credenciales de backend S3, como se documenta aquí https://www.terraform.io/docs/backends/types/s3.html , Terraform usa de manera predeterminada lo siguiente, en orden:

  1. Variables de entorno AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY
  2. Archivo de credenciales compartidas de AWS, el valor predeterminado es "~ / .aws / credentials".

No especificó ninguna credencial en su configuración de backend S3, por lo que terraform está predeterminado en el archivo de credenciales compartidas de AWS.

Su configuración de backend S3 no contiene credenciales.

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

Tu segunda pregunta

¿Cómo puedo hacer que Terraform solo use los créditos definidos en mi configuración de Terraform e ignore lo que hay en mi perfil de usuario del sistema operativo?

Primero, los backends no pueden contener interpolación, consulte https://www.terraform.io/docs/backends/config.html . Por lo tanto, no puede usar ninguna variable en la configuración de Backend. por ejemplo, esta configuración no es vá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}
  }
}

Si desea especificar las credenciales de AWS al ejecutar terraform init, especifique la configuración de back-end como opciones.

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

Esto produce una configuración de backend S3 que se ve así, almacenada en el ./.terraform/terraform.tfstatearchivo:

{
    "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
    },

Nuevamente, las credenciales del backend S3 se configuran por separado de sus credenciales de proveedor de AWS.

Vuelva a ejecutar terraform inity especifique las credenciales en la línea de comando como --backend-configopciones para corregir su error.

Mike Marseglia
fuente
Gracias. Respuesta muy detallada y entiendo el problema ahora. En mi caso de uso, terminé usando la shared_credentials_fileopción de que todos mis servidores y proveedores cosecharán y usarán. Parece estar funcionando bien y nada está bloqueado en las credenciales aws de la estación de trabajo del sistema operativo.
emmdee
3

El error que está obteniendo se refiere específicamente a la configuración del backend S3, que AFAIK no hereda la configuración de la configuración del proveedor de AWS; también lo tiene access_keyy secret_keyopciones de configuración que si usted no está utilizando ~/.aws/credentialstendrá que configurar de forma explícita.

bodgit
fuente
1

Es mejor configurar perfiles en sus ~/.aws/credentialsarchivos 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

Luego, en su proveedor puede decirle qué perfil usar

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

Mantendrá las claves fuera de sus archivos de terraformación, lo cual es bueno si alguna vez desea ponerlas en control de fuente.

Miguel
fuente
Gracias por el aporte. Soy muy consciente de los perfiles de credenciales, sin embargo, estoy buscando una solución a la pregunta específica en lugar de un método alternativo o solución alternativa. Los créditos deben estar en variables para el alcance de esta pregunta. Muy apreciado independientemente.
emmdee