运维编排服务系列-----自动启动意外停止的ECS实例

有时ECS实例可能因为某些意外原因被停止,可通过OOS的事件触发器对ECS实例进行监控,一旦实例停止,则对实例自动地执行恢复逻辑,比如自动启动,进而实现ECS实例的快恢复。

步骤拆分

  1. 对账号下的ECS实例进行监控。
  2. 一旦有ECS实例停止,则检查其是否为要自动启动的Tag下的ECS实例。
  3. 若不是该Tag下的实例,则忽略此ECS实例的停止,若是该Tag下的ECS实例,则执行后面逻辑。
  4. 对实例做一些恢复逻辑,此处对实例进行启动。
  5. 等待恢复逻辑执行成功,此处等待停止的实例启动成功。

OOS模版任务

  1. 通过OOS事件触发器监控所有的ECS实例是否停止。
  2. 若有实例停止,检查该实例是否为要被自启动Tag下的ECS实例。
  3. 若不是则忽略,实例的停止,若是则对该实例进行启动。
  4. 等待实例状态变为运行中。

模版内容

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值。

操作指南

  1. 首先登录到运维编排控制台 。
  2. 单击 自定义模版,单击 创建模版 。
  3. 单击 YAML 。
    将编写好的YAML格式模版内容粘贴到编辑框内,或者您也可直接在编辑框中编写该模版。
    运维编排服务系列-----自动启动意外停止的ECS实例
  4. 单击 校验模版。 

    • 若模板内容已通过校验,继续下一步。
    • 若模板内容校验失败,请根据提示内容调整模版。
  5. 填写 模版名称。
    本文此处填写AutoStartEcsWhenStopped。
    运维编排服务系列-----自动启动意外停止的ECS实例
  6. 单击 创建模版 。
    自定义模版列表中可通过模版名称快速找到成功创建的模版。
  7. 单击 创建执行 。
  8. 风险确认模式 选择 客户了解风险,无需确认 。
    运维编排服务系列-----自动启动意外停止的ECS实例
  9. 单击 下一步,设置参数 。

    • tagKey:要自启动的ECS实例所在Tag的key值。
    • tagValue:  要自启动的ECS实例所在Tag的Value值。
      运维编排服务系列-----自动启动意外停止的ECS实例
  10. 单击 下一步,确认创建 ,单击 创建执行 。
    执行管理中可查看刚刚创建的执行,若创建执行成功,且执行状态处于等待中,则表示ECS实例已开始被监控,一旦有ECS实例被停止,则会触发whenInstanceStopped任务后面的任务逻辑,即该Tag下被停止的实例自动启动。
    运维编排服务系列-----自动启动意外停止的ECS实例
  11. 那么我们现在就演示下ECS实例自启动,下图是该Tag下运行中的3台实例。
    运维编排服务系列-----自动启动意外停止的ECS实例
  12. 我们现在通过手动停止这3台实例,模拟实例意外停止。
    运维编排服务系列-----自动启动意外停止的ECS实例
  13. 当实例停止后,执行状态由等待中转换为运行中,开始执行对停止的ECS实例的启动。
    运维编排服务系列-----自动启动意外停止的ECS实例
  14. 片刻后,刷新ECS实例的状态,可发现该Tag下被停止的ECS实例已经自启动完成,又变回了运行中状态。
    运维编排服务系列-----自动启动意外停止的ECS实例
上一篇:基于Jenkins+OOS+OSS的镜像自动更新


下一篇:python小脚本实现生成由字母数字密码组成的随机密码