Terraform:尝试销毁 EKS 集群时出现“错误:删除 S3 存储桶时出错”

Posted

技术标签:

【中文标题】Terraform:尝试销毁 EKS 集群时出现“错误:删除 S3 存储桶时出错”【英文标题】:Terraform : "Error: error deleting S3 Bucket" while trying to destroy EKS Cluster 【发布时间】:2021-10-01 13:41:01 【问题描述】:

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

在此之上,我分别创建了 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.

这是由于 s3 错误导致集群部分销毁后terraform plan -destroy 的输出

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 集群的正确方法是什么。

【问题讨论】:

错误是关于 S3,而不是 EKS。所以 EKS 已经被销毁了? 错误是在销毁 EKS 集群时,集群没有完全销毁,它在 AWS S3 删除时停止。 @Marcin 我已经添加了销毁计划输出一些东西被删除了一些东西正在等待处理。 【参考方案1】:

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

我会做些什么来解决这个问题:

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

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

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

【讨论】:

以上是关于Terraform:尝试销毁 EKS 集群时出现“错误:删除 S3 存储桶时出错”的主要内容,如果未能解决你的问题,请参考以下文章

EKS:kubernetes 集群中的不健康节点

使用 Terraform 将 `configMap` 应用到 EKS 集群

Terraform EKS 配置图被禁止

Terraform EKS 标记

如何使用 Terraform 配置 EKS ALB

Terraform 外部数据源 EKS 指纹有时不起作用