【问题标题】:In Amazon AWS, how can I invoke a Lambda Function to execute only when an ELB's instance state transitions from InService to OutOfService?在 Amazon AWS 中,我如何才能调用 Lambda 函数以仅在 ELB 的实例状态从 InService 转换为 OutOfService 时执行?
【发布时间】:2017-11-23 14:49:49
【问题描述】:

需要考虑的案例

  1. 给定:一个附加到状态为 InService 的 ELB 的实例

    何时:其状态从 InService 变为 OutOfService

    然后:一个 AWS Lambda 函数被调用,InstanceId 作为事件的一部分

  2. 给定:一个全新的实例,第一次注册到 ELB

    何时:它仍在启动过程中(因此尚未在健康检查中报告阳性)

    那么:没有调用 AWS Lambda 函数,因为没有发生所需的状态更改

我尝试过的解决方案

我设置了一个 Lambda 函数来每分钟轮询一个硬编码的 ELB 列表。它为每个状态为 OutOfService 的实例成功调用。然而,这是不可取的,因为它不支持上述案例列表中的第二种情况。

我修改了向 ELB 报告的健康检查功能。如果健康检查失败,则调用实例的 ELB 实例状态。但这也很难确定实例是否仍在启动。

在第二种解决方案中还有更多可供探索的选项,但理想情况下,我不希望轮询 ELB 以获取信息以触发 Lambda 函数。相反,我希望 Lambda 函数接收此类转换的事件(通过 CloudWatch、SNS 或其他可用的方式)。

对我尚未考虑的选项有任何见解吗?

【问题讨论】:

  • 最终,最好的方法可能是使用 CloudWatch Events,但该服务尚不支持 ELB(根据 docs.aws.amazon.com/AmazonCloudWatch/latest/events/…)。
  • 是的,这正是我认为我可以在开始之前采取的路线。只有到了这一部分,我才意识到缺少功能。
  • 另一个潜在的选择可能是对 ELB 指标使用 CloudWatch 警报。例如,在 N 个时间段内的 HealthyHostCount 为零时发出警报,这可能会导致向 SNS 主题发送 SNS 通知,然后调用 Lambda 函数。

标签: amazon-web-services amazon-sns amazon-elb amazon-cloudwatch


【解决方案1】:

我同意投票状态不是正确的答案。探索的一种选择是使用 cloudwatch 警报来触发您的 lambda 函数。

不能 100% 确定是否有内置指标,或者您是否需要为此创建自定义指标,但您可以通过 cloudwatch 触发 SNS 通知,进而触发您的 lambda 函数。

【讨论】:

  • 设法让它在健康检查端点内工作。现在,每当 ELB 进行健康检查但失败时(如果实例不在启动过程中),它会检查 ELB 是否将其实例状态标记为 OutOfService。这种方法的唯一缺点是,如果运行状况端点本身出现故障(并且负载均衡器将实例状态标记为 OutOfService),则无法调用 Lambda 函数。我将尝试用自定义指标替换我所做的。需要做一些阅读才能做到这一点。
  • 现在我有了 ELB 所针对的健康端点,它可以正常工作(也很高兴让轮询频率与 ELB 健康检查间隔参数相关),这是唯一获胜的东西如果 ELB 运行状况端点本身已关闭,则不执行 Lambda 调用。我想到了一个潜在的解决方案。每次到达健康端点时,它都会向该实例唯一的主题发送 SNS 通知。如果该主题的最新消息超过时间阈值,则会触发 CloudWatch 警报。此 CloudWatch 警报可以执行调用
  • 但是接下来我要考虑如果机器正在启动并且healthpoint还没有激活怎么办......在这种情况下,我不想触发lambda函数。
  • 所以另一种选择可能是尝试使用应用程序负载均衡器(应该几乎相同的设置),您可以使用 AWS config 来触发 lambda 函数。
猜你喜欢
  • 2019-01-10
  • 2015-05-25
  • 2015-07-13
  • 2015-01-23
  • 1970-01-01
  • 2016-08-05
  • 2020-06-24
  • 2018-03-26
  • 1970-01-01
相关资源
最近更新 更多