簡體   English   中英

Terraform:嘗試銷毀 EKS 集群時出現“錯誤:刪除 S3 存儲桶時出錯”

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

所以我使用給出的示例創建了 EKS 集群
Cloudposse eks terraform 模塊

最重要的是,我創建了 AWS S3 和 Dynamodb 來分別存儲 state 文件和鎖定文件,並在terraform 后端配置中添加了相同的內容。

這是它的外觀:

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 state 位於 s3 后端並且您使用相同的 terraform 創建了 s3 和 dynamodb 時,刪除 EKS 集群的正確方法是什么。

通常,不建議將用於 Terraform 的后端 state 管理的 S3 存儲桶保留在 Terraform state 本身中(確切原因)。 我已經在 Terraform 文檔中看到了這一點,但我無法在快速搜索中找到它。

我會做些什么來解決這個問題:

  1. 強制解鎖Terraform 鎖( terraform force-unlock LOCK_ID ,其中LOCK_ID顯示在您嘗試運行命令時給您的錯誤消息中)。
  2. 從 S3 下載 state 文件(通過 AWS 控制台或 CLI)。
  3. 創建一個新的 S3 存儲桶(手動,而不是在 Terraform 中)。
  4. 手動將 state 文件上傳到新存儲桶。
  5. 修改您的 Terraform 后端配置以使用新存儲桶。
  6. 清空舊的 S3 存儲桶(通過 AWS 控制台或 CLI)。
  7. 重新運行 Terraform 並允許它刪除舊的 S3 存儲桶。

由於它仍在使用相同的舊 state 文件(現在只是來自不同的存儲桶),它不會重新創建所有內容,您將能夠將 TF state 存儲桶/文件與其他資源分離。

如果由於某種原因,Terraform 拒絕強制解鎖,您可以通過 AWS 控制台將 go 插入 DynamoDB 表並手動刪除鎖定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM