如果 user_data 无法运行完成,如何使 aws_instance 创建失败

use*_*431 4 terraform

如果传递给 user_data 的脚本无法运行,是否有可能使 aws_instance 创建失败?例如,出口1?

我有一个使用depends_on [aws_instance.myVM] 将JSON 发布到实例的null_resource,当user_data 脚本失败时,我需要使depends_on 失败。

谢谢!

Mar*_*ins 6

user_data由运行在实例本身内部的软件处理,例如cloud-init,因此它的处理与ec2:RunInstancesTerraform 的 AWS 提供商为启动实例运行而进行的调用是异步的。因此,无法从user_data处理中反馈状态信息,因为它可能会在 EC2 API 开始报告实例“正在运行”后运行一段时间,具体取决于它在启动过程中的处理位置。

此外,depends_on用于排序而不是处理错误,因此depends_on子句永远不会改变有关 Terraform 错误处理的任何内容。

如果您想您的实例作为同步Terraform的创建操作的一部分来运行软件,然后不幸的是,唯一可行的选择是使用remote-exec供应方。这是以一些相当大的额外复杂性为代价的,因为 Terraform 现在必须能够打开与实例的 SSH 会话并对其进行身份验证以创建双向通信通道。

作为这种复杂性的回报,Terraform 可以运行相关代码,因此 Terraform 可以检测它是否成功(使用其退出状态)。如果远程命令失败,Terraform 将停止进一步处理,返回错误,并将实例标记为受污染,以便下一个计划将尝试再次创建它。

话虽如此,最好找到一种不同的方式来实现您的目标,不需要将 Terraform 运行直接耦合到虚拟机中运行的软件的状态。这不是一般预料,Terraform配置应该既需要启动虚拟机交互与在同一操作在虚拟机上运行的软件。对于某些系统分解来说,这可能是一个好点,其中您有一个 Terraform 配置声明虚拟机应该存在,然后第二个配置假设虚拟机存在并对其采取行动。然后,您可以运行在这两者之间运行所需的任何其他软件,以检查实例是否成功启动。