Terraform 如果用户\u数据未能运行完成,如何使aws\u实例创建失败

Terraform 如果用户\u数据未能运行完成,如何使aws\u实例创建失败,terraform,Terraform,如果传递到用户_数据的脚本无法运行,是否可能导致aws_实例创建失败?e、 g.有出口1吗 我有一个null_资源,它使用dependens_-on[aws_-instance.myVM]将JSON发布到实例,我需要dependens_-on在用户数据脚本失败时失败 谢谢 user\u数据由实例本身内部运行的软件处理,例如cloud init,因此它的处理与Terraform的AWS提供商启动实例运行的调用是异步的。因此,无法从user\u data处理中反馈状态信息,因为它可能在EC2 API

如果传递到用户_数据的脚本无法运行,是否可能导致aws_实例创建失败?e、 g.有出口1吗

我有一个null_资源,它使用dependens_-on[aws_-instance.myVM]将JSON发布到实例,我需要dependens_-on在用户数据脚本失败时失败


谢谢

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

另外,
dependens\u on
用于排序而不是处理错误,因此
dependens\u on
子句永远不会改变Terraform的错误处理

如果您想在您的实例上同步运行软件,作为Terraform创建操作的一部分,那么不幸的是,唯一实用的选择是使用。这是以牺牲相当多的额外复杂性为代价的,因为Terraform现在必须能够打开与实例的SSH会话并对其进行身份验证,以创建双向通信通道

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

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