Terraform : "Error: error deleting S3 Bucket" while trying to destroy EKS Cluster

Terraform : "Error: error deleting S3 Bucket" while trying to destroy EKS Cluster

所以我使用
中给出的示例创建了 EKS 集群 Cloudposse eks terraform module

除此之外,我创建了 AWS S3 和 Dynamodb 分别用于存储状态文件和锁定文件,并在 terraform backend config 中添加了相同的内容。

这是它的样子:

resource "aws_s3_bucket" "terraform_state" {
  bucket = "${var.namespace}-${var.name}-terraform-state"
  # Enable versioning so we can see the full revision history of our
  # state files
  versioning {
    enabled = true
  }
  # Enable server-side encryption by default
  server_side_encryption_configuration {
    rule {
      apply_server_side_encryption_by_default {
        sse_algorithm = "aws:kms"
      }
    }
  }
}

resource "aws_dynamodb_table" "terraform_locks" {
  name         = "${var.namespace}-${var.name}-running-locks"
  billing_mode = "PAY_PER_REQUEST"
  hash_key     = "LockID"
  attribute {
    name = "LockID"
    type = "S"
  }
}

terraform {
  backend "s3" {
    bucket = "${var.namespace}-${var.name}-terraform-state"
    key    = "${var.stage}/terraform.tfstate"
    region = var.region
    # Replace this with your DynamoDB table name!
    dynamodb_table = "${var.namespace}-${var.name}-running-locks"
    encrypt        = true
  }
}

现在,当我尝试使用 terraform destroy 删除 EKS 集群时,出现此错误:

Error: error deleting S3 Bucket (abc-eks-terraform-state): BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

这是terraform plan -destroy集群因为s3错误

部分销毁后的输出
Changes to Outputs:
  - dynamodb_table_name             = "abc-eks-running-locks" -> null
  - eks_cluster_security_group_name = "abc-staging-eks-cluster" -> null
  - eks_cluster_version             = "1.19" -> null
  - eks_node_group_role_name        = "abc-staging-eks-workers" -> null
  - private_subnet_cidrs            = [
      - "172.16.0.0/19",
      - "172.16.32.0/19",
    ] -> null
  - public_subnet_cidrs             = [
      - "172.16.96.0/19",
      - "172.16.128.0/19",
    ] -> null
  - s3_bucket_arn                   = "arn:aws:s3:::abc-eks-terraform-state" -> null
  - vpc_cidr                        = "172.16.0.0/16" -> null

我无法手动删除 s3 中的 tfstate,因为这会使 terraform 重新创建所有内容,我也尝试从 tfstate 中删除 s3 资源,但它给我锁定错误(还尝试强制删除锁定并使用 -lock=false )

所以我想知道有没有办法告诉 terraform 在删除所有内容后最后删除 s3。或者有没有办法在本地使用 s3 中的 terraform?

当您的 TF 状态驻留在 s3 后端并且您使用相同的 terraform 创建了 s3 和 dynamodb 时,删除 EKS 集群的正确方法是什么。

通常,不建议将您用于 Terraform 后端状态管理的 S3 存储桶保留在 Terraform 状态本身中(出于这个确切原因)。我在 Terraform 文档中看到了这一点,但我无法通过快速搜索找到它。

我将如何解决这个问题:

  1. Force unlock Terraform 锁(terraform force-unlock LOCK_ID,其中 LOCK_ID 显示在您尝试 运行 命令时它给您的错误消息中。
  2. 从 S3 下载状态文件(通过 AWS 控制台或 CLI)。
  3. 创建一个新的 S3 存储桶(手动,而不是在 Terraform 中)。
  4. 手动上传状态文件到新的bucket。
  5. 修改您的 Terraform 后端配置以使用新存储桶。
  6. 清空旧的 S3 存储桶(通过 AWS 控制台或 CLI)。
  7. 重新运行 Terraform 并允许它删除旧的 S3 存储桶。

由于它仍在使用相同的旧状态文件(现在只是来自不同的存储桶),它不会重新创建所有内容,并且您将能够将您的 TF 状态 bucket/file 与其他状态分离资源。

如果 Terraform 出于某种原因拒绝强制解锁,您可以通过 AWS 控制台进入 DynamoDB table 并手动删除锁定。