我在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实例,从而导致资源泄漏。
- 通常如何处理terrraform中的崩溃场景?
- 是否有一种方法可以回滚以前的事务而不需要具有EC2条目的状态文件?
请帮我解决这个问题。由于
如何处理terrraform中的崩溃场景?
这取决于崩溃发生的时间。一些可能的场景如下:
- 很可能,只要你的后端支持锁定,你的状态文件将保持锁定状态。在这种情况下,重启后将不会创建任何内容,因为Terraform无法获得状态文件的锁,因此它将抛出一个错误。我们必须强制解锁状态。
- 我们成功地解锁了状态文件/状态文件根本不是locket。在这种情况下,我们可以有以下场景:
- 状态文件将有一个带有资源标识符的条目,即使在资源正在供应时出现崩溃。在这种情况下,Terraform将刷新状态,如果有任何更改将显示在计划中。然而,我们应该阅读计划,并决定我们是要申请还是先做一些手动调整。
- Terraform无法识别已经存在的资源,所以它将尝试提供它。同样,我们应该阅读状态文件并自己决定要做什么。我们可以导入已经存在的资源,或者终止它,让Terraform尝试重新创建它。
是否有一种方法可以在没有EC2条目的状态文件的情况下回滚以前的事务?
不,没有办法回滚到上一个事务。Terraform将尝试提供.tf
文件中的任何内容。我们所能做的就是从源代码控制中检出以前版本的代码并应用它。