首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Terraform:“错误:删除S3桶时出错”,同时试图销毁EKS集群

Terraform:“错误:删除S3桶时出错”,同时试图销毁EKS集群
EN

Stack Overflow用户
提问于 2021-07-25 06:01:57
回答 1查看 612关注 0票数 1

所以我创建了EKS集群,使用

Cloudposse ek地形模块

在此基础上,我分别创建了AWS S3和Dynamodb来存储状态文件和锁文件,并在terraform后端配置中添加了相同的文件。

这就是它的样子:

代码语言:javascript
运行
复制
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集群时,我得到了以下错误:

代码语言:javascript
运行
复制
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输出。

代码语言:javascript
运行
复制
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中的本地地形?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-26 01:20:47

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

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

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

因为它仍然使用相同的旧状态文件(现在只是从不同的桶),所以它不会重新创建所有东西,而且您将能够将TF状态桶/文件与其他资源分离。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68515932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档