从networking请求(局域网唤醒)自动启动AWS EC2实例

我想按需启动一个EC2实例,并在闲置一段时间(例如,没有networking活动时间大于1小时)时将其closures,但我不能说出一个标准的方式在AWS中这样做看起来像,因为AWS不支持唤醒LAN。

我打算运行的服务将需要持久的networking连接,例如ssh。

我所瞄准的用户体验如下所示:

  • 如果服务在用户尝试连接时启动,用户可以立即访问该服务。
  • 如果服务在用户尝试连接时closures,则用户收到“服务正在启动”的回复(并且连接已closures)。 用户在几分钟后重试并成功连接(或者如果他重试太早,则再次收到“开始”消息)。 在最后一次用户断开连接后,服务将保持长达一个小时。

我的动机主要是节约成本。 这种需求将是非常难以预测的(所以计划的实例并不适合),可能不到12小时/天,而且用户愿意等待几分钟才能启动服务。 而且我不想用保留的实例定价来locking1年以上的期限。

我也有一些野蛮刺我怎么可能做到这一点,并会感谢他们是多么合理/明智的反馈:

  1. 使用一个自动缩放组,“缩放”服务从0到最多1个实例。 但是我不知道如果没有实例运行,我将能够发出“服务正在开始”的回复。
  2. 运行一个t2.micro实例,当服务closures,其唯一目的是捕获连接尝试,发出“启动”回复,触发启动实际的服务实例,然后死亡。 当服务实例由于不活动而closures时,需要再次启动t2.micro实例。

谢谢!

Lambda的工作原理与此类似,不过相反,它使用户在启动应用程序时等待。 在Lambda中,虽然你没有一个实例可以pipe理,但全部都是在引擎盖下完成的。

我还会检查是否可以执行一些涉及Lambda和Route53故障转移检查的操作,例如,如果实例closures,则用户命中Lambda,如果实例closures,则打开实例。 这可能不适用于Lambda需要一个特定的主机头。

或者再次使用R53故障转移来运行保留实例t2.nano来执行“等待室”,然后代理或重新定向到另一个实例。

你可以做这样的事情,而不需要其他服务:

import boto3 import json def lambda_handler(event, context): ec2 = boto3.resource('ec2') instance = ec2.Instance(event['instance_id']) if instance.state['Code'] == 16: # Instance is running, do what you want elif instance.state['Code'] == 80: # Instance is stopped, start it instance.start() return { 'status': 'instance-unavailable' } else # Instance is in another state 

在这种情况下, instance id由参数接收,但是当然可以对其进行硬编码。