将EC2操作添加到Cloudwatch Alarm上的运行状况检查

时间:2019-12-27 19:36:55

标签: amazon-web-services amazon-sns amazon-route53 cloudwatch-alarms

我有一个AWS bitnami实例,它在网站不可用时创建了Route 53运行状况检查警报。第一个动作成功触发并给我发送了电子邮件。但是,我也希望实例重新启动,尽管“添加EC2”操作显示为灰色,并且显示为:“此操作仅适用于EC2每个实例指标”。如何添加呢?

enter image description here

这可能与此有关:我的EC2实例存在于爱尔兰AZ中,但是当我在Route 53中的运行状况检查中创建警报和SNS主题时,它将自动在N.Virginia AZ中创建它们。而且我似乎无权更改更改的位置。

1 个答案:

答案 0 :(得分:0)

原始解决方案:

您最好的做法是使用CloudWatch Events。

您可以创建与CloudWatch警报状态更改事件中的警报相匹配的规则,并运行EC2实例重启API调用:

enter image description here

事件模式如下:

{
  "source": [
    "aws.cloudwatch"
  ],
  "detail-type": [
    "CloudWatch Alarm State Change"
  ],
  "detail": {
    "alarmName": ["YOUR_ROUTE53_ALARM_NAME"],
    "previousState": {
        "value": ["OK"]
    },
    "state": {
        "value": ["ALARM"]
    }
  }
}

模式语法有点奇怪,您必须将单个字符串包装到数组中。 此模式将与名为YOUR_ROUTE53_ALARM_NAME的警报的警报状态更改匹配,该警报的先前状态为OK,当前状态为ALARM

我在比赛中添加了先前的状态,因为我不知道警报是否会触发多次。没有它,您可能会陷入无限重启的恕我直言的循环。

关于目标,我让CloudWatch Events为您创建新角色。


更新后的解决方案:(由于原因,发问者需要单独的停止和开始呼叫)

您仍将使用CloudWatch Events(CWE)来检测警报中的更改。

然后您有两个选择:

  1. 使用lambda处理我建议的单独的停止/开始:

    1. 创建一个NodeJS 12 Lambda(每个Node lambda都提供一个AWS JS SDK),您将使用的功能在AWS.EC2类中
    2. 为您的实例调用stopInstances,实例状态将更改为stopping
    3. 使用waitFor来监听实例状态更改为stopped
    4. 致电startInstances重新启动 您需要确保您的Lambda具有必要的IAM权限才能重新启动EC2实例。
  2. 创建两个CWE规则

    1. 第一个规则检测到警报并定位EC2 StopInstances API调用(与我原来的解决方案相同,只是略有不同的目标)
    2. 第二条规则根据实例状态更改进行匹配,并以EC2 StartInstances API调用为目标。

      state change notification看起来像这样:

      {
         "id":"7bf73129-1428-4cd3-a780-95db273d1602",
         "detail-type":"EC2 Instance State-change Notification",
         "source":"aws.ec2",
         "account":"123456789012",
         "time":"2015-11-11T21:29:54Z",
         "region":"us-east-1",
         "resources":[
            "arn:aws:ec2:us-east-1:123456789012:instance/i-abcd1111"
         ],
         "detail":{
            "instance-id":"i-abcd1111",
            "state":"stopped"
        }
      }
      

      匹配该通知的事件模式很简单:  enter image description here

      此解决方案的问题是状态更改通知除了stateinstance-id之外没有任何其他字段。无法区分先触发的关机和正常关机。每次关闭都会触发此规则,然后重新启动实例。

      如果要手动关闭实例,则必须禁用第二条CWE规则(可以启用/禁用规则),这样它才不会触发启动。这对您来说可能是一个合理的权衡。

顺便说一句,我想说的是,如果EC2重新启动还不够,则您的实例有些混乱。