连续而不是并行地重新部署Terraform aws_instance节点

时间:2019-10-09 23:41:30

标签: amazon-ec2 terraform terraform-provider-aws

我在Terraform的负载均衡器目标组中有几个aws_instance节点。我进行了更改,要求销毁每个实例并重新创建它。默认情况下,Terraform将同时销毁并重新创建所有这些实例。一次销毁所有节点很不好,因为这样一来,负载均衡器中就不会再有节点了。

有没有一种配置Terraform的方法,以便它在破坏/创建其他实例之前等待一个实例被完全破坏/重新创建?

2 个答案:

答案 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