所以我创建了EKS集群,使用
在此基础上,我分别创建了AWS S3和Dynamodb来存储状态文件和锁文件,并在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中的本地地形?
当TF状态驻留在s3后端并且使用相同的terraform创建了s3和dynamodb时,删除EKS集群的正确方法是什么?
发布于 2021-07-26 01:20:47
通常,不建议保留Terraform状态本身中用于Terraform后端状态管理的S3桶(正因为这个原因)。我在Terraform文档中看到了这一点,但是我无法在快速搜索中找到它。
我要做些什么来解决这个问题:
terraform force-unlock LOCK_ID,它在尝试运行命令时给您的错误消息中显示LOCK_ID )。因为它仍然使用相同的旧状态文件(现在只是从不同的桶),所以它不会重新创建所有东西,而且您将能够将TF状态桶/文件与其他资源分离。
如果Terraform出于任何原因拒绝强制解锁,您可以通过AWS控制台进入DynamoDB表并手动删除锁。
https://stackoverflow.com/questions/68515932
复制相似问题