在健康检查时将 EC2 操作添加到 Cloudwatch 警报
Add EC2 Action to Cloudwatch Alarm on health check
我有一个 AWS bitnami 实例,当网站变得不可用时,我创建了一个 Route 53 运行状况检查警报。第一个动作成功触发并给我发了一封电子邮件。但是,我还希望重新启动实例,尽管添加 EC2 操作显示为灰色并且显示为:"This action is only available for EC2 Per-Instance Metrics"。我该如何添加?
可能与此有关:我的 EC2 实例存在于爱尔兰 AZ 中,但是当我在 Route 53 的健康检查中创建警报和 SNS 主题时,它会自动在 N.Virginia AZ 中创建它们.而且我似乎无权改变它的去向。
原解:
您最好的做法是使用 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"]
}
}
}
模式语法有点奇怪,您必须将单个字符串包装到数组中。
此模式将匹配名为 YOUR_ROUTE53_ALARM_NAME
的警报的警报状态更改,之前的状态为 OK
,当前状态为 ALARM
。
我把之前的状态添加到匹配中,因为我不知道警报是否会触发多次。没有它,恕我直言,您可能会陷入无限重启的循环。
关于目标,我会让 CloudWatch Events 为您创建新角色。
更新解决方案:(提问者因为原因需要单独的stop and start calls)
您仍然会使用 CloudWatch Events (CWE) 来检测警报中的变化。
那么你有两个选择:
使用 lambda 来处理单独的 stop/start 我建议:
- 创建一个 NodeJS 12 Lambda(每个 Node lambda 都有可用的 AWS JS SDK),您将使用的函数在 AWS.EC2 class
- 为您的实例调用
stopInstances
,实例状态将变为stopping
- 使用
waitFor
监听实例状态变为stopped
- 调用
startInstances
重新启动
您需要确保您的 Lambda 具有必要的 IAM 权限才能重启 EC2 实例。
创建两个 CWE 规则
- 第一条规则检测警报并定位 EC2 StopInstances API 调用(与我原来的解决方案相同,只是目标略有不同)
第二条规则匹配该实例状态更改并针对 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"
}
}
匹配该通知的事件模式很简单:
此解决方案的问题是状态更改通知除了 state
和 instance-id
之外没有任何其他字段。您无法区分第一规则触发的关机和正常关机。每次关闭都会触发此规则并再次启动实例。
如果您想手动关闭实例,则必须禁用第二条 CWE 规则(规则可以是 enabled/disabled),这样它就不会触发启动。这对你来说可能是一个合理的权衡。
顺便说一句,如果 EC2 重启还不够,我会说你的实例有问题。
我有一个 AWS bitnami 实例,当网站变得不可用时,我创建了一个 Route 53 运行状况检查警报。第一个动作成功触发并给我发了一封电子邮件。但是,我还希望重新启动实例,尽管添加 EC2 操作显示为灰色并且显示为:"This action is only available for EC2 Per-Instance Metrics"。我该如何添加?
可能与此有关:我的 EC2 实例存在于爱尔兰 AZ 中,但是当我在 Route 53 的健康检查中创建警报和 SNS 主题时,它会自动在 N.Virginia AZ 中创建它们.而且我似乎无权改变它的去向。
原解:
您最好的做法是使用 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"]
}
}
}
模式语法有点奇怪,您必须将单个字符串包装到数组中。
此模式将匹配名为 YOUR_ROUTE53_ALARM_NAME
的警报的警报状态更改,之前的状态为 OK
,当前状态为 ALARM
。
我把之前的状态添加到匹配中,因为我不知道警报是否会触发多次。没有它,恕我直言,您可能会陷入无限重启的循环。
关于目标,我会让 CloudWatch Events 为您创建新角色。
更新解决方案:(提问者因为原因需要单独的stop and start calls)
您仍然会使用 CloudWatch Events (CWE) 来检测警报中的变化。
那么你有两个选择:
使用 lambda 来处理单独的 stop/start 我建议:
- 创建一个 NodeJS 12 Lambda(每个 Node lambda 都有可用的 AWS JS SDK),您将使用的函数在 AWS.EC2 class
- 为您的实例调用
stopInstances
,实例状态将变为stopping
- 使用
waitFor
监听实例状态变为stopped
- 调用
startInstances
重新启动 您需要确保您的 Lambda 具有必要的 IAM 权限才能重启 EC2 实例。
创建两个 CWE 规则
- 第一条规则检测警报并定位 EC2 StopInstances API 调用(与我原来的解决方案相同,只是目标略有不同)
第二条规则匹配该实例状态更改并针对 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" } }
匹配该通知的事件模式很简单:
此解决方案的问题是状态更改通知除了
state
和instance-id
之外没有任何其他字段。您无法区分第一规则触发的关机和正常关机。每次关闭都会触发此规则并再次启动实例。如果您想手动关闭实例,则必须禁用第二条 CWE 规则(规则可以是 enabled/disabled),这样它就不会触发启动。这对你来说可能是一个合理的权衡。
顺便说一句,如果 EC2 重启还不够,我会说你的实例有问题。