据我了解,当亚马逊自动缩放组缩减时,任何打开终止实例的连接都会丢失 - 没有优雅的终止。
我想知道其他人是如何处理的。
我的想法是连接的发起者应该处理失败,因为它应该能够处理实例失败而不是故意终止的情况。
有什么想法吗?
谢谢,
皮特
答案 0 :(得分:2)
如果您使用的是负载均衡器,则可以在“实例”选项卡上打开连接耗尽选项。它允许您设置在终止实例之前等待连接关闭的时间。最长是3600秒。见https://aws.amazon.com/blogs/aws/elb-connection-draining-remove-instances-from-service-with-care/
答案 1 :(得分:1)
您通常在自动缩放的实例前使用Elastic Load Balancer(ELB)。负载均衡器将停止向即将终止的实例发送请求。如果您使用以下格式:
as-put-scaling-policy MyScaleDownPolicy --auto-scaling-group MyAutoScalingGroup --adjustment=-1 --type ChangeInCapacity --cooldown 300
您的实例有足够的时间在终止之前完成处理请求。
在此处查看更多详情:http://docs.amazonwebservices.com/AutoScaling/latest/DeveloperGuide/US_SetUpASLBApp.html
请注意,您应该为这些实例设置ELB组。来自AWS Auto-scaling docs:
Auto Scaling确定要终止的特定实例后,它 检查实例是否是Elastic Load的一部分 平衡小组。如果是这样,Auto Scaling会指示负载均衡器 从负载平衡组中删除实例并等待 删除完成。如果Auto Scaling确定实例是 Auto Scaling尝试不属于Elastic Load Balancing组 通过运行系统关闭脚本来终止实例。
答案 2 :(得分:1)
我这样做的方法是使用生命周期钩子。哪个可以在一段时间内中断终止过程(默认为1小时)。
它被设计为在您的工作完成后恢复,但超时工作会导致连接耗尽。
您可以选择向Auto Scaling组添加挂钩 处于此状态的实例进入Terminating:Wait状态。这个状态 允许您在终止之前访问这些实例。
来源:http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/AutoScalingGroupLifecycle.html
con:通过CLI设置,但也不错。
如何做到这一点: http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/adding-lifecycle-hooks.html
创建IAM时,您需要以下政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"autoscaling:PutLifecycleHook",
"autoscaling:DeleteLifecycleHook",
"autoscaling:RecordLifecycleActionHeartbeat",
"autoscaling:CompleteLifecycleAction",
"autoscaling:DescribeAutoscalingGroups",
"autoscaling:DescribeLifecycleHooks",
"autoscaling:PutInstanceInStandby",
"autoscaling:PutInstanceInService",
"iam:AddRoleToInstanceProfile",
"iam:CreateInstanceProfile",
"iam:CreateRole",
"iam:PassRole",
"iam:ListInstanceProfiles",
"ec2:Describe*"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
祝你好运!
答案 3 :(得分:0)
EC2 / AutoscalingGroups的搜索空间中没有解决方案。我不会假设等待从ELB中删除完成意味着等待现有连接关闭。 ELB确实强制执行他们自己的不可配置的超时,但即使假设当ELB报告任何打开的连接时,该组也会等待它,这是乐观的。
一个可能的答案是分支到其他AWS产品,如SQS和SNS。这两个策略可以代表大多数终止策略,因为它们也可以由CloudWatch警报触发。缺少的部分是工人选择,冷却和重置警报。