【问题标题】:Destroy resource on trigger Terraform在触发器 Terraform 上销毁资源
【发布时间】:2020-10-24 16:49:55
【问题描述】:

我正在尝试决定是否将 Ansible 或 Terraform 用于项目。该项目正在云服务器上进行科学计算。我想说“这是一个输入文件,去拿一台 16vCPU 的计算机。当一切都完成后,将输出文件复制回来并销毁资源”。 我有没有办法告诉 terraform“当您检测到命令已完成或某些 api 被命中时销毁/对此资源采取行动”?

【问题讨论】:

  • 据我所知,没有办法做到这一点。 Terraform 应用将始终以特定状态结束,该状态将被记住在您的状态文件中。我对如何实现这一点的第一个猜测是使用 lambda 函数。该函数可以使用 AWS 开发工具包来预置 EC2 实例、管理它们的状态(开始/终止)以及开始执行您的作业。您还可以记住在某处(例如在 SSM 中)启动的实例/正在运行的作业,因此您的 lambda 函数可以在作业完成后处理终止。

标签: terraform


【解决方案1】:

有没有办法让我告诉 terraform “销毁/对此采取行动 当您检测到命令已完成或某些 api 被命中时的资源"?

如果可以通过 API 命中检测到,那么您可以使用 local-exec Provisioner 并使用 curl 在循环中(在包装 shell 脚本中)命中 api 端点,轮询 API 的状态以推断任务是否完成。如果这样做,请确保为此提供程序提供适当的超时值。

对于清理序列(后 API 状态是肯定的),声明 dependency explicitly 以确保 Terraform 能够相应地跟踪执行。

在解释了所有这些之后,您的端到端目标最适合结合 IaC + Config mgmt 工具。如果我必须这样做,我宁愿在以下大纲中使用 Terraform + Ansible 组合

  1. 一个调用 Terraform 来为 16vCPU 资源提供所有必要依赖的 shell 脚本
  2. 从 Terraform 中调用 local-exec 配置程序以启动 ansible 以适当地配置实例、复制文件和启动远程执行等。
  3. 让控件返回到 shell 脚本,该脚本将开始基于 API 轮询使用 curl 轮询任务的状态
  4. 当 shell 脚本检测到任务完成时,它会在本地复制远程文件(此步骤可以做得更好,但这是另一个讨论的主题)
  5. 再次调用 Terraform,这次是销毁,以拆除整个环境。

我进一步建议将它绑定到 jenkins 工作流程中(如果您已经在使用 jenkins),将控制权交给其他用户,并且仍然具有完全的可见性和审核。

【讨论】:

    猜你喜欢
    • 2022-07-13
    • 2020-12-27
    • 2021-02-15
    • 2019-11-14
    • 2019-10-25
    • 2017-12-18
    • 2020-03-27
    • 1970-01-01
    • 2014-09-05
    相关资源
    最近更新 更多