所以我创建了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
复制相似问题