亚马逊EC2 ELB警报 - 哪个实例不健康?

时间:2014-01-30 10:08:10

标签: amazon-web-services amazon-ec2 amazon-elb

我们在Amazon EC2上托管了一些应用程序,并使用 Elastic Load Balancer(ELB)来管理一个应用程序的多个实例。此外,我们已设置ELB警报以获取有关不健康主机的通知,即实例已关闭时。

到目前为止,除了AWS控制台中的ELB状态页面之外,我无法确定在警报响起时检查哪个实例确实已关闭的位置。但是,如果实例再次返回 In Service 状态,这对我也没有帮助。 ELB发出的电子邮件通知不包含此信息;我无法在控制台的警报历史记录中找到它。

有没有办法告诉哪个实例触发了ELB警报,即使实例在此期间已回到 OK 状态?

干杯,亚历克斯

5 个答案:

答案 0 :(得分:7)

可悲的是,亚马逊没有提供运行状况检查日志,因此假设服务器不再不健康,则无法找出之后哪个实例未通过运行状况检查。您只能使用Per-Az指标来了解哪个AZ是实例。

但是,如果在期间查询AWS api ,您可以知道哪个实例已关闭。所以,我想到了一个可能的解决方法:

  • 设置新的SNS主题,并将HTTP操作添加到自定义URL,该URL触发枚举实例的作业并通过邮件向您发送该信息。
  • 然后为UnHealthyHostCount设置CloudWatch警报> 0并将操作设置为SNS主题。

困难的部分是您的网址应该处理SNS订阅&确认描述here

知道哪个实例当前是OutOfService的命令是:

elb-describe-instance-health *LoadBalancerName* --region *YourRegion*

答案 1 :(得分:2)

您可以使用可以获取状态的AWS SDK gem或其他AWS库。使用它来创建一个cron任务,定期获取每个实例的状态并将其记录在某处。要么你会得到你需要的东西,要么一个实例的状态消失会告诉你哪一个坏了。

答案 2 :(得分:2)

我们正在使用以下Lambda函数来弥补缺少运行状况检查日志记录:

'use strict';

var AWS = require('aws-sdk');
var elb = new AWS.ELB();

exports.handler = (event, context, callback) => {

    var params = {
        LoadBalancerName: "<elb_name_here>"
    };
    elb.describeInstanceHealth(params, function(err, data) {
        if (err) console.log(err, err.stack); // an error occurred
        else     console.log(data);           // successful response
    });
};

它不会在CloudWatch中生成最漂亮的日志,但数据就在那里。它允许我们查看是否存在更频繁丢弃的特定实例,等等。它的设置与上面的Gerardo Grignoli's answer非常相似。我添加了一个CloudWatch警报,以便在触发警报时向Lambda函数发送SNS消息。它对消息本身没有任何作用 - 消息只是Lambda函数运行和记录实例状态的触发机制。

答案 3 :(得分:-3)

没有。 CloudWatch中的ELB指标不会从设计角度为您提供该级别的详细信息和IMHO。如果主机运行状况不佳,则特定主机上的监控应报告不是ELB的详细信息。如果一个节点在ELB中停止服务,那对ELB来说应该不是问题。虽然,在负载均衡器中,确定一个警报状态是有意义的,其中6台机器中的3台进入“未处于服务状态”。查看CloudWatch指标

答案 4 :(得分:-3)

转到负载均衡器并找到与您的ELB关联的负载均衡器。然后查看OutofService

的实例