You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Terraform中自动销毁执行完SQL脚本的EC2实例?

如何在Terraform配置内自动销毁一次性初始化EC2实例

完全可以在同一份Terraform文件中实现需求,以下是两种实用的落地方案:

方案一:通过local-exec自动触发资源销毁

这是最直接的方法,无需修改现有CI流水线——只要CI保持执行terraform apply -auto-approve即可。在EC2资源的配置里,给remote-exec(执行SQL脚本)后加一个local-exec步骤,脚本执行完成后自动调用Terraform命令销毁该EC2实例。

示例代码:

resource "aws_instance" "init_ec2" {
  # 替换为你的EC2基础配置
  ami           = "ami-xxxxxx"
  instance_type = "t2.micro"
  vpc_security_group_ids = [aws_security_group.init_sg.id]

  # 远程连接EC2执行SQL初始化脚本
  provisioner "remote-exec" {
    inline = [
      "sudo yum install -y mysql",
      "mysql -h ${aws_db_instance.my_rds.endpoint} -u admin -p${var.db_password} < /path/to/your-init-script.sql"
    ]

    connection {
      type        = "ssh"
      user        = "ec2-user"
      private_key = file(var.ssh_private_key_path)
      host        = self.public_ip
    }
  }

  # 脚本执行完成后,自动销毁当前EC2实例
  provisioner "local-exec" {
    command = "terraform destroy -target=aws_instance.init_ec2 -auto-approve"
    when    = create  # 仅在EC2创建并完成远程脚本后执行
    depends_on = [aws_instance.init_ec2.remote-exec]  # 确保SQL脚本执行完再销毁
  }

  lifecycle {
    prevent_destroy = false  # 允许Terraform销毁该资源
  }
}

注意要点:

  • 确保CI环境中运行Terraform的账号有权限执行销毁命令,且当前工作目录包含完整的Terraform配置和状态文件。
  • 执行过程中,terraform apply会先创建RDS和EC2,完成SQL初始化后,自动触发销毁EC2,最终状态里不会保留这个一次性实例。

方案二:用count参数结合本地标记文件

如果担心直接调用terraform destroy的风险,可以通过标记文件控制EC2的创建状态:

  1. 初始状态下无标记文件,count=1创建EC2;
  2. SQL脚本执行完成后,通过local-exec生成标记文件;
  3. Terraform读取标记文件后,将count设为0,后续apply时自动销毁EC2。

示例代码:

# 检查初始化完成标记文件
data "local_file" "init_completed" {
  filename = "./init_done.flag"
}

resource "aws_instance" "init_ec2" {
  # 存在标记文件则不创建EC2,否则创建1台
  count = fileexists("./init_done.flag") ? 0 : 1

  # 你的EC2基础配置
  ami           = "ami-xxxxxx"
  instance_type = "t2.micro"
  # ...其他配置(安全组、密钥对等)

  provisioner "remote-exec" {
    inline = [
      "sudo yum install -y mysql",
      "mysql -h ${aws_db_instance.my_rds.endpoint} -u admin -p${var.db_password} < /path/to/your-init-script.sql"
    ]

    connection {
      type        = "ssh"
      user        = "ec2-user"
      private_key = file(var.ssh_private_key_path)
      host        = self.public_ip
    }
  }

  # 脚本执行完成后生成标记文件
  provisioner "local-exec" {
    command = "touch ./init_done.flag"
    when    = create
  }
}

这个方案需要CI流水线执行两次terraform apply(第一次创建EC2并生成标记,第二次销毁EC2),如果流水线无法修改,方案一更适合你的场景。

内容的提问来源于stack exchange,提问作者Bhushan Karmarkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:45:02