Terraform AWS Provider Error: Value for unconfigurable attribute. Can't configure a value for "acl": its value will be decided automatically

Terraform AWS Provider Error: Value for unconfigurable attribute. Can't configure a value for "acl": its value will be decided automatically

就在今天,每当我 运行 terraform apply 时,我都会看到类似这样的错误:Can't configure a value for "lifecycle_rule": its value will be decided automatically based on the result of applying this configuration.

昨天还在用。

以下是我运行的命令:terraform init && terraform apply

以下是已初始化的提供程序插件列表:

- 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)

错误如下:

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 1

我的代码如下:

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 已升级到 2022 年 2 月 10 日发布的版本 4.0.0。

版本中的主要变化包括:

  • AWS 提供商 4.0.0 版对 aws_s3_bucket 资源进行了重大更改。
  • AWS Provider 的版本 4.0.0 将是支持 EC2-Classic 资源的最后一个主要版本,因为 AWS 计划完全停用 EC2-Classic 网络。有关更多详细信息,请参阅 AWS 新闻博客。
  • 版本 4.0.0 和 4.x.x 版本的 AWS Provider 将是与 Terraform 0.12-0.15 兼容的最后版本。

Terraform 进行此更改的原因如下:为了帮助通过独立资源分配 S3 存储桶设置的管理,aws_s3_bucket 资源中的各种参数和属性已变为 read-only。应更新依赖于这些参数的配置以使用相应的 aws_s3_bucket_* 资源。更新后,new aws_s3_bucket_* 资源应导入 Terraform 状态。

因此,我按照此处的指南相应地更新了我的代码:Terraform AWS Provider Version 4 Upgrade Guide | S3 Bucket Refactor

新的工作代码如下所示:

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

如果您不想将您的 Terraform AWS Provider 版本升级到 4.0.0,您可以通过在代码中明确指定来使用现有或旧版本,如下所示:

terraform {
  required_version = "~> 1.0.11"
  required_providers {
    aws  = "~> 3.73.0"
  }
}

它已损坏,因为 Terraform AWS Provider 已更新到版本 4.0.0。

如果您无法升级您的版本,也许您可​​以像这样锁定您的 AWS 提供商版本:

terraform {
  required_version = "~> 0.12.31"

  required_providers {
    aws  = "~> 3.74.1"
  }
}

Terragrunt/Terraform 用户:

正如其他人提到的,AWS Provider 已升级到 4.0。 此处描述了重大更改(在 git 4.0 标签下)GitHub | terraform-provider-aws | v4.0.0

请注意对 s3 的重大更改。我在页面上找到了 39 个 aws_s3_bucket 引用。现实是我们中的一些人没有时间解决我们当前项目的所有重大变化。 我发现 3.74.1 版本非常有效

要限制使用 Terragrunt 配置的所有 Terraform 项目,在 terragrunt 存储库的根 terragrunt.hcl 文件中,您可以指定以下内容:

generate "versions" {
    path      = "versions_override.tf"
    if_exists = "overwrite_terragrunt"
    contents  = <<EOF
    terraform {
        required_providers {
        aws = {
            version = "= 3.74.1"
            source = "hashicorp/aws"
        }
        }
    }
EOF
}

实际上,Terragrunt 将生成一个 versions_override.tf terraform 配置文件,它将定义 3.74.1.

的显式版本

快速解决方案:将您的项目保留在版本 3 上,直到您准备好按照 Terraform 在此处提供的升级指南迁移到版本 4:Terraform AWS Provider Version 4 Upgrade Guide.

为此,请冻结您的提供商,如下所示:

terraform {
   required_providers {

    aws = {
         source = "hashicorp/aws"
         version =  "~> 3.74.2"
    }

    consul = {
      source = "hashicorp/consul"
    }
  }

  required_version = ">= 0.13"
}

我正在按照有关 terraform 文档的教程在 AWS Lambda 上创建服务。 https://learn.hashicorp.com/tutorials/terraform/lambda-api-gateway

这个配置

resource "aws_s3_bucket" "lambda_bucket" {
  bucket = random_pet.lambda_bucket_name.id
  acl = "private"
  force_destroy = true
}

会出现以下错误

Error: Value for unconfigurable attribute
  with aws_s3_bucket.lambda_bucket,
  on main.tf line 32, in resource "aws_s3_bucket" "lambda_bucket":
  32:   acl           = "private"
Can't configure a value for "acl": its value will be decided automatically
based on the result of applying this configuration.

由于 acl 现在是只读的,请更新您的配置以使用 aws_s3_bucket_acl 资源并删除 aws_s3_bucket 资源中的 acl 参数:

resource "aws_s3_bucket" "lambda_bucket" {
  bucket = random_pet.lambda_bucket_name.id

  force_destroy = true
}

resource "aws_s3_bucket_acl" "lamdbda_bucket" {
  bucket = aws_s3_bucket.lambda_bucket.id
  acl = "private"
}