Justo hoy, cada vez que ejecuto terraform apply , veo un error como este: Can't configure a value for "lifecycle_rule": its value will be decided automatically based on the result of applying this configuration.
Ayer estaba funcionando.
El siguiente es el comando que ejecuto: terraform init && terraform apply
La siguiente es la lista de complementos de proveedores inicializados:
- Finding latest version of hashicorp/archive... - Finding latest version of hashicorp/aws... - Finding latest version of hashicorp/null... - Installing hashicorp/null v3.1.0... - Installed hashicorp/null v3.1.0 (signed by HashiCorp) - Installing hashicorp/archive v2.2.0... - Installed hashicorp/archive v2.2.0 (signed by HashiCorp) - Installing hashicorp/aws v4.0.0... - Installed hashicorp/aws v4.0.0 (signed by HashiCorp)Los siguientes son los errores:
Acquiring state lock. This may take a few moments... Releasing state lock. This may take a few moments... ╷ │ Error: Value for unconfigurable attribute │ │ with module.ssm-parameter-store-backup.aws_s3_bucket.this, │ on .terraform/modules/ssm-parameter-store-backup/s3_backup.tf line 1, in resource "aws_s3_bucket" "this": │ 1: resource "aws_s3_bucket" "this" { │ │ Can't configure a value for "lifecycle_rule": its value will be decided │ automatically based on the result of applying this configuration. ╵ ╷ │ Error: Value for unconfigurable attribute │ │ with module.ssm-parameter-store-backup.aws_s3_bucket.this, │ on .terraform/modules/ssm-parameter-store-backup/s3_backup.tf line 1, in resource "aws_s3_bucket" "this": │ 1: resource "aws_s3_bucket" "this" { │ │ Can't configure a value for "server_side_encryption_configuration": its │ value will be decided automatically based on the result of applying this │ configuration. ╵ ╷ │ Error: Value for unconfigurable attribute │ │ with module.ssm-parameter-store-backup.aws_s3_bucket.this, │ on .terraform/modules/ssm-parameter-store-backup/s3_backup.tf line 3, in resource "aws_s3_bucket" "this": │ 3: acl = "private" │ │ Can't configure a value for "acl": its value will be decided automatically │ based on the result of applying this configuration. ╵ ERRO[0012] 1 error occurred: * exit status 1Mi código es el siguiente:
resource "aws_s3_bucket" "this" { bucket = "${var.project}-${var.environment}-ssm-parameter-store-backups-bucket" acl = "private" server_side_encryption_configuration { rule { apply_server_side_encryption_by_default { kms_master_key_id = data.aws_kms_key.s3.arn sse_algorithm = "aws:kms" } } } lifecycle_rule { id = "backups" enabled = true prefix = "backups/" transition { days = 90 storage_class = "GLACIER_IR" } transition { days = 180 storage_class = "DEEP_ARCHIVE" } expiration { days = 365 } } tags = { Name = "${var.project}-${var.environment}-ssm-parameter-store-backups-bucket" Environment = var.environment } }Terraform AWS Provider se actualizó a la versión 4.0.0, que se publicó el 10 de febrero de 2022.
Los principales cambios en el lanzamiento incluyen:
El motivo de este cambio de Terraform es el siguiente: para ayudar a distribuir la administración de la configuración del depósito S3 a través de recursos independientes, varios argumentos y atributos en el recurso aws_s3_bucket son de solo lectura. Las configuraciones que dependen de estos argumentos deben actualizarse para usar el recurso aws_s3_bucket_* correspondiente. Una vez actualizados, new aws_s3_bucket_* deben importarse al estado de Terraform.
Por lo tanto, actualicé mi código en consecuencia siguiendo la guía aquí: Guía de actualización de Terraform AWS Provider Version 4 | Refactorización de depósito S3
El nuevo código de trabajo se ve así:
resource "aws_s3_bucket" "this" { bucket = "${var.project}-${var.environment}-ssm-parameter-store-backups-bucket" tags = { Name = "${var.project}-${var.environment}-ssm-parameter-store-backups-bucket" Environment = var.environment } } resource "aws_s3_bucket_acl" "this" { bucket = aws_s3_bucket.this.id acl = "private" } resource "aws_s3_bucket_server_side_encryption_configuration" "this" { bucket = aws_s3_bucket.this.id rule { apply_server_side_encryption_by_default { kms_master_key_id = data.aws_kms_key.s3.arn sse_algorithm = "aws:kms" } } } resource "aws_s3_bucket_lifecycle_configuration" "this" { bucket = aws_s3_bucket.this.id rule { id = "backups" status = "Enabled" filter { prefix = "backups/" } transition { days = 90 storage_class = "GLACIER_IR" } transition { days = 180 storage_class = "DEEP_ARCHIVE" } expiration { days = 365 } } }Si no desea actualizar su versión de Terraform AWS Provider a 4.0.0, puede usar la versión existente o anterior especificándola explícitamente en el código como se muestra a continuación:
terraform { required_version = "~> 1.0.11" required_providers { aws = "~> 3.73.0" } }Está roto porque Terraform AWS Provider se actualizó a la versión 4.0.0.
Si no puede actualizar su versión, tal vez podría bloquear la versión de su proveedor de AWS de esta manera:
terraform { required_version = "~> 0.12.31" required_providers { aws = "~> 3.74.1" } }Para usuarios de Terragrunt / Terraform
Como han mencionado otros, el proveedor de AWS se actualizó a 4.0. Los cambios importantes se describen aquí (bajo la etiqueta git 4.0) : GitHub | terraform-proveedor-aws | v4.0.0
Tenga en cuenta los cambios importantes en s3. Encontré 39 referencias de aws_s3_bucket en la página. La realidad es que algunos de nosotros no tenemos tiempo para abordar todos los cambios importantes de nuestros proyectos actuales. He encontrado que la versión 3.74.1 es bastante efectiva .
Para restringir todos sus proyectos de Terraform que están configurados con Terragrunt, dentro del archivo raíz terragrunt.hcl de su repositorio de terragrunt, puede especificar lo siguiente:
generate "versions" { path = "versions_override.tf" if_exists = "overwrite_terragrunt" contents = <<EOF terraform { required_providers { aws = { version = "= 3.74.1" source = "hashicorp/aws" } } } EOF }En efecto, Terragrunt generará un archivo de configuración terraform versions_override.tf que definirá la versión explícita de 3.74.1 .
Solución rápida: mantenga su proyecto en la versión 3 hasta que esté listo para pasar a la versión 4 siguiendo la guía de actualización proporcionada por Terraform aquí: Guía de actualización de Terraform AWS Provider Version 4 .
Para hacerlo, congela tu proveedor como se muestra a continuación:
terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 3.74.2" } consul = { source = "hashicorp/consul" } } required_version = ">= 0.13" }