如何处理terraform进程崩溃和避免重试时资源泄漏?



我在docker容器中部署了一个微服务,用于管理和执行在AWS上创建基础设施的terraform命令。支持的地形模板如下:

provider "aws" {
profile = "default"
region  = "us-east-1"
}

resource "aws_default_vpc" "default" {
tags = {
Name = "Default VPC"
}
}
resource "aws_security_group" "se_security_group" {
name        = "test-sg"
description = "secure soft edge ports"
vpc_id      = aws_default_vpc.default.id
tags = {
Name = "test-sg"
}
}

resource "aws_instance" "web" {
ami           = "ami-*********"
instance_type = "t3.micro"
tags = {
Name = "test"
}

depends_on = [
aws_security_group.se_security_group,
]
}

有了这个系统,当terraform进程正在执行(创建一个EC2实例)时,如果docker容器崩溃,那么状态文件将没有关于正在创建的EC2资源的条目。在容器重新启动时,如果在相同的状态文件上重新启动terrform进程,它将最终创建一个全新的EC2实例,从而导致资源泄漏。

  1. 通常如何处理terrraform中的崩溃场景?
  2. 是否有一种方法可以回滚以前的事务而不需要具有EC2条目的状态文件?

请帮我解决这个问题。由于

如何处理terrraform中的崩溃场景?

这取决于崩溃发生的时间。一些可能的场景如下:

  1. 很可能,只要你的后端支持锁定,你的状态文件将保持锁定状态。在这种情况下,重启后将不会创建任何内容,因为Terraform无法获得状态文件的锁,因此它将抛出一个错误。我们必须强制解锁状态。
  2. 我们成功地解锁了状态文件/状态文件根本不是locket。在这种情况下,我们可以有以下场景:
  • 状态文件将有一个带有资源标识符的条目,即使在资源正在供应时出现崩溃。在这种情况下,Terraform将刷新状态,如果有任何更改将显示在计划中。然而,我们应该阅读计划,并决定我们是要申请还是先做一些手动调整。
  • Terraform无法识别已经存在的资源,所以它将尝试提供它。同样,我们应该阅读状态文件并自己决定要做什么。我们可以导入已经存在的资源,或者终止它,让Terraform尝试重新创建它。

是否有一种方法可以在没有EC2条目的状态文件的情况下回滚以前的事务?

不,没有办法回滚到上一个事务。Terraform将尝试提供.tf文件中的任何内容。我们所能做的就是从源代码控制中检出以前版本的代码并应用它。

最新更新