我在Terraform的负载均衡器目标组中有几个aws_instance
节点。我进行了更改,要求销毁每个实例并重新创建它。默认情况下,Terraform将同时销毁并重新创建所有这些实例。一次销毁所有节点很不好,因为这样一来,负载均衡器中就不会再有节点了。
有没有一种配置Terraform的方法,以便它在破坏/创建其他实例之前等待一个实例被完全破坏/重新创建?
答案 0 :(得分:2)
您可以使用create_before_destroy
lifecycle customisation强制Terraform创建新资源,然后在替换操作中销毁旧资源。
不幸的是,如果您的实例花了一段时间才能启动所需的服务,那么您仍然会遇到问题,因为一旦AWS API返回实例正在运行,Terraform就会认为它已完成工作并开始终止它想要替换的旧实例。
您可以通过将实例包含在自动扩展组中来解决此问题(即使您不需要它们进行自动扩展也可以使它们具有最小和最大大小,或者不将自动扩展策略附加到该组)并设置{{3 }}到ELB
。这样可以确保在通过负载均衡器运行状况检查而不是默认的EC2运行状况检查之前(即它是否正在运行并且没有系统或实例状态检查失败),该实例才被视为运行状况良好。这样,Terraform将等到新ASG拥有最少数量的实例通过负载均衡器运行状况检查(并附加到相关目标组或ELB),然后再认为它已完成,然后开始删除旧ASG。 / p>
答案 1 :(得分:0)
有一个depends_on
属性,该属性允许设置显式依赖关系并按顺序创建事物。它因您的情况而受到限制,因为它不等待刚刚创建的新实例“就绪”。
在阅读您的方案时,我有一个主意,您可以使用extermal
数据源。虽然不是肯定的,但它原本打算用于这种事情,但我认为它可以起作用。本质上,您可以编写一个脚本,该脚本将使用AWS CLI和查看实例是否已创建并准备就绪所需的任何其他工具。如果将depends_on
数据源与external
一起使用,或者将D:\home\site\wwwroot
数据源的输出链接到下一个实例(使用输出设置标记?),我认为它将具有您想要的效果。 / p>
这个设计对我来说有点香。还有其他AWS服务和功能可以为您做这种事情,例如具有负载平衡器运行状况检查的ECS滚动部署。
资源:
https://www.terraform.io/docs/providers/external/data_source.html
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-create-loadbalancer-rolling.html
编辑:
如果您被EC2实例所困扰,则另一种本机AWS解决方案可能是使用生命周期挂钩。我将EC2用户数据脚本与调用Lambda函数的生命周期挂钩结合使用,以进行自定义Kafka集群的滚动部署和配置(在MSK之前)。这要求我按顺序启动实例,并为每个实例分配唯一的代理ID。听起来与您的情况类似。
资源: https://docs.aws.amazon.com/autoscaling/ec2/userguide/lifecycle-hooks.html