有时ECS实例可能因为某些意外原因被停止,可通过OOS的事件触发器对ECS实例进行监控,一旦实例停止,则对实例自动地执行恢复逻辑,比如自动启动,进而实现ECS实例的快恢复。
步骤拆分
- 对账号下的ECS实例进行监控。
- 一旦有ECS实例停止,则检查其是否为要自动启动的Tag下的ECS实例。
- 若不是该Tag下的实例,则忽略此ECS实例的停止,若是该Tag下的ECS实例,则执行后面逻辑。
- 对实例做一些恢复逻辑,此处对实例进行启动。
- 等待恢复逻辑执行成功,此处等待停止的实例启动成功。
OOS模版任务
- 通过OOS事件触发器监控所有的ECS实例是否停止。
- 若有实例停止,检查该实例是否为要被自启动Tag下的ECS实例。
- 若不是则忽略,实例的停止,若是则对该实例进行启动。
- 等待实例状态变为运行中。
模版内容
FormatVersion: OOS-2019-06-01
Description: Start ECS instance when instance is stopped.
Parameters:
tagKey:
Description: The tag key for query ECS instances.
Type: String
MinLength: 1
MaxLength: 30
Default: oostt
tagValue:
Description: The tag value for query ECS instances.
Type: String
MinLength: 1
MaxLength: 30
Default: oostt
Tasks:
- Name: whenInstanceStopped
Action: 'ACS::EventTrigger'
Properties:
Product: ECS
Name:
- 'Instance:StateChange'
Content:
state:
- Stopped
Outputs:
instanceId:
ValueSelector: .content.resourceId
Type: String
- Name: describeInstancesByTag
Action: ACS::ExecuteApi
Description: Views running ECS instances by specifying tag.
Properties:
Service: ECS
API: DescribeInstances
Parameters:
Tags:
- Key: '{{ tagKey }}'
Value: '{{ tagValue }}'
Outputs:
instanceIds:
Type: List
ValueSelector: Instances.Instance[].InstanceId
- Name: checkInstanceReady
Action: ACS::CheckFor
Description: Checks ECS instance is in specified tag's instances.
Properties:
Service: ECS
API: DescribeInstances
Parameters:
InstanceIds:
- '{{ whenInstanceStopped.instanceId }}'
DesiredValues: '{{describeInstancesByTag.instanceIds}}'
PropertySelector: Instances.Instance[].InstanceId
- Name: startInstance
Action: 'ACS::ExecuteAPI'
Properties:
Service: ECS
API: StartInstance
Parameters:
InstanceId: '{{ whenInstanceStopped.instanceId }}'
Description: start instance.
- Name: untilInstanceReady
Action: 'ACS::WaitFor'
Description: Waits for the ECS instance Running.
Properties:
Service: ECS
API: DescribeInstances
Parameters:
InstanceIds:
- '{{ whenInstanceStopped.instanceId }}'
DesiredValues:
- Running
PropertySelector: 'Instances.Instance[].Status'
Outputs:
InstanceId:
Value: '{{ whenInstanceStopped.instanceId }}'
Type: String
模版参数
- tagKey:要自启动的ECS实例所在Tag的key值。
- tagValue: 要自启动的ECS实例所在Tag的Value值。
操作指南
- 首先登录到运维编排控制台 。
- 单击 自定义模版,单击 创建模版 。
- 单击 YAML 。
将编写好的YAML格式模版内容粘贴到编辑框内,或者您也可直接在编辑框中编写该模版。
-
单击 校验模版。
- 若模板内容已通过校验,继续下一步。
- 若模板内容校验失败,请根据提示内容调整模版。
- 填写 模版名称。
本文此处填写AutoStartEcsWhenStopped。
- 单击 创建模版 。
在自定义模版列表中可通过模版名称快速找到成功创建的模版。 - 单击 创建执行 。
- 风险确认模式 选择 客户了解风险,无需确认 。
-
单击 下一步,设置参数 。
- tagKey:要自启动的ECS实例所在Tag的key值。
- tagValue: 要自启动的ECS实例所在Tag的Value值。
- 单击 下一步,确认创建 ,单击 创建执行 。
在执行管理中可查看刚刚创建的执行,若创建执行成功,且执行状态处于等待中,则表示ECS实例已开始被监控,一旦有ECS实例被停止,则会触发whenInstanceStopped任务后面的任务逻辑,即该Tag下被停止的实例自动启动。
- 那么我们现在就演示下ECS实例自启动,下图是该Tag下运行中的3台实例。
- 我们现在通过手动停止这3台实例,模拟实例意外停止。
- 当实例停止后,执行状态由等待中转换为运行中,开始执行对停止的ECS实例的启动。
- 片刻后,刷新ECS实例的状态,可发现该Tag下被停止的ECS实例已经自启动完成,又变回了运行中状态。