场景简介
挂载在负载均衡上的ECS实例,存在被意外停止的可能性,若实例意外停止后没有得到及时处理,负载均衡上一直挂载着异常状态的实例,或被动地等待负载均衡的处理异常,这种情况肯定不是我们想要的。
通过运维编排服务中事件触发器动作可对您运行中实例进行监控,一旦实例进入停止状态,则立刻进行一些逻辑处理,确保异常实例及时移除。
解决方案
-
步骤拆分
- 对ECS实例通过OOS的事件触发器进行有效监控,保证实例中断事件发生后及时得到处理。
- 检查中断的实例是否为当前负载均衡上的,保证后续任务只针对该负载均衡上的中断实例执行。
- 将中断实例从负载均衡后端服务器列表移除,主动剔除问题实例。
- 模版内容(YAML格式)
---
FormatVersion: OOS-2019-06-01
Description: Remove ECS Instance from SLB when Instance Status is Stopped.
Parameters:
regionId:
Description: The Region Id of SLB and Instance.
Type: String
MinLength: 1
MaxLength: 30
OOSAssumeRole:
Description: The RAM role to be assumed by OOS.
Type: String
Default: OOSServiceRole
loadBalancerId:
Description: The ID of the SLB instance.
Type: String
AllowedPattern: lb-[A-Za-z0-9]*
MaxLength: 30
MinLength: 1
RamRole: '{{OOSAssumeRole}}'
Tasks:
- Name: whenInstanceStopped
Action: 'ACS::EventTrigger'
Properties:
Product: ECS
Name:
- 'Instance:StateChange'
Content:
state:
- Stopped
Outputs:
instanceId:
ValueSelector: content.resourceId
Type: String
- Name: checkNeedRemoveOrNot
Action: ACS::CheckFor
Description: check the interrupted Instance is being added on SLB or Not.
OnError: ACS::END
OnSuccess: ACS::NEXT
Properties:
Service: SLB
API: DescribeLoadBalancerAttribute
Parameters:
RegionId: '{{ regionId }}'
LoadBalancerId: '{{ loadBalancerId }}'
DesiredValues:
- "{{whenInstanceStopped.instanceId}}"
PropertySelector: 'BackendServers.BackendServer[].ServerId|select(.=="{{whenInstanceStopped.instanceId}}")'
- Name: setEcsOnBackendServers
Action: ACS::ExecuteApi
Description: Sets ECS instances no weight on backend servers.
Properties:
Service: SLB
API: SetBackendServers
Parameters:
RegionId: '{{ regionId }}'
BackendServers:
- ServerId: '{{ whenInstanceStopped.instanceId }}'
Weight: 0
LoadBalancerId: '{{ loadBalancerId }}'
Outputs:
backendServer:
Type: List
ValueSelector: BackendServers.BackendServer[]
- Name: removeEcsFromBackendServers
Action: 'ACS::ExecuteApi'
Description: Remove ECS instances to backend servers.
Properties:
Service: SLB
API: RemoveBackendServers
Parameters:
RegionId: '{{ regionId }}'
LoadBalancerId: '{{ loadBalancerId }}'
BackendServers:
- ServerId: '{{ whenInstanceStopped.instanceId }}'
Weight: 0
Outputs:
backendServer:
Type: List
ValueSelector: BackendServers.BackendServer[]
操作指南
- 首先登录到运维编排控制台 。
- 单击 自定义模版 ,单击 创建模版 。
- 单击 YAML 。
将编写好的YAML格式模版内容粘贴到编辑框内,或者您也可直接在编辑框中编写该模版。 -
单击 校验模版。
- 若模板内容已通过校验,继续下一步。
- 若模板内容校验失败,请根据提示内容调整模版。
- 填写 模版名称。
本文此处填写"remove_interrupted_instance_from_slb1" 。 - 单击 创建模版 。
在自定义模版列表中可通过模版名称快速找到该模版。 - 单击 创建执行 。
-
风险确认模式 选择 客户了解风险,无需确认 。
-
单击 下一步,设置参数 。
- regionId :将要操作的实例及负载均衡所在的Region。
- loadBalancerId:当该负载均衡上有ECS实例停止时,将从该负载均衡的后端服务器列表上移除停止的ECS实例。
- 单击 下一步,确认创建 ,单击 创建执行 。
在执行管理中可查看刚刚创建的执行,若创建执行成功,且执行状态处于等待中,则表示ECS实例已开始被监控,一旦有该负载均衡上的ECS实例被停止,则会触发whenInstanceStopped任务后面的任务执行,该ECS实例会被自动从负载均衡上移除。 - 那么我们验证下,验证前,在该负载均衡上需要有一个已挂载且正常运行的ECS实例。
-
停止负载均衡上正常运行的ECS实例。
- 负载均衡挂载的ECS实例已停止。
- 当该ECS实例已停止时,该模版执行中whenInstanceStopped任务下面的任务会被触发,且执行状态从等待中变为运行中,即触发了自动从负载均衡移除已停止的ECS实例。
- 现在我们在该负载均衡服务器列表中查询该实例Id,发现服务器列表中已经没有了该台ECS实例,表示自动移除成功。