将 EC2 操作添加到运行状况检查时的 Cloudwatch 警报

Cor*_*iew 4 amazon-web-services amazon-sns amazon-route53 cloudwatch-alarms

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

在此输入图像描述

是否与此相关:我的 EC2 实例位于爱尔兰可用区,但是当我在 Route 53 中的运行状况检查上创建警报和 SNS 主题时,它会自动在弗吉尼亚北部可用区创建它们。而且我似乎无权改变它的去向。

Zde*_*k F 5

原解决方案:

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

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

在此输入图像描述

事件模式如下所示:

{
  "source": [
    "aws.cloudwatch"
  ],
  "detail-type": [
    "CloudWatch Alarm State Change"
  ],
  "detail": {
    "alarmName": ["YOUR_ROUTE53_ALARM_NAME"],
    "previousState": {
        "value": ["OK"]
    },
    "state": {
        "value": ["ALARM"]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

模式语法有点奇怪,您必须将单个字符串包装到数组中。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 调用。

      状态更改通知如下所示:

      {
         "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"
        }
      }
      
      Run Code Online (Sandbox Code Playgroud)

      与该通知匹配的事件模式很简单: 在此输入图像描述

      state此解决方案的问题是状态更改通知除了和之外没有任何其他字段instance-id。您无法区分第一规则触发的关闭和正常关闭。每次关闭都会触发此规则并再次启动实例。

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

顺便说一句,我想说,如果 EC2 重新启动还不够,那么您的实例就会出现问题。