【问题标题】:Is it possible to schedule a startup of an AWS instance from within the instance?是否可以从实例中安排 AWS 实例的启动?
【发布时间】:2019-02-28 13:28:46
【问题描述】:

我有一个 AWS 实例,它在启动时会收集一些网络数据。从新的公共 IP 地址进行收集很重要——我无法通过在同一地址上再次运行收集来获得有用的数据。

现在,我可以在 EC2 控制台中停止然后重新启动实例,当它重新启动时,它会获得一个新的 IP 地址并收集更多有用的数据。 (只是重启实例并不会分配新的 IP ——我必须先stop然后start。)

我知道基于时间的实例启动调度,但我想做的是从实例本身安排重启。有点像at 工作:at now + 5 minutes restart-this-instance ; shutdown -h now

或者,如果有办法释放和重新分配实例的公共 IP,那也可以。

【问题讨论】:

  • 旁注:这听起来很像网络抓取,网站试图通过监控 IP 地址来防止抓取。请注意,我们不鼓励人们使用此类方法违反网站的条款和条件。
  • 绝对不是网络抓取,尽管我可以看到问题的常见部分。我实际上是在我也在运行的另一个网络系统上收集数据:我想知道来自以前看到的 IP 地址的缓存和重复流量如何影响主系统的测量性能。

标签: amazon-web-services amazon-ec2 aws-cli


【解决方案1】:

不,这是不可能的。

需要在实例停止时发出启动实例的命令。因此,实例无法发出命令以启动自身。

但是,它可能会触发一些外部因素来导致它发生,例如创建 CloudWatch 规则或 Lambda 函数。

【讨论】:

  • 很有趣,谢谢。我曾想过使用“灰胡子的 Lambda:”向外部机器发送电子邮件,这会导致机器在此后不久发出aws start,但直接使用 Lambda 似乎是一个更清洁的解决方案(除了弄清楚如何做它的 Lambda 部分)。
  • @DaveM。选择您最喜欢的受支持语言并使用 Lambda 解决方案运行。许多 Lambda 运行时环境已经包含 AWS 开发工具包,并允许您直接从控制台编辑函数代码(无需打包、zip 文件等),因此对于像这样的简单任务,您可以直接编写代码在 AWS 控制台编辑器中,对其进行部署、构建和触发测试事件,然后观察它的工作。
  • 嗯...也许值得一提的是,在某些情况下(iirc,如果实例位于启用了自动公共 IP 地址分配的子网上并且实例设置为使用子网设置),那么您可以通过临时附加然后分离为此目的预留的 EIP 来强制 IP 更改而无需停止/启动。附加 EIP 后,旧的公共 IP 消失,分离后,池中的新 IP 自动取而代之。
  • Lambda 方法似乎有点工作,但我被困在“重新启动自我”步骤:aws lambda invoke RestartSelf CLI 调用在 Lambda 完成之前不会返回,而 Lambda 不会在instancesStart 完成之前完成。所以我不能关闭 Lambda 然后快速shutdown -h now,并指望 Lambda 让我从停止状态开始。有没有办法让 Lambda 将结果返回给它的调用者,但继续异步处理一段时间?看起来,只要您返回结果,Lambda 驱动程序系统就会假定该函数已完成。
  • --invocation-type Event 做到了。但是shutdown -h now 比您预期的要慢很多。 Lambda 必须休眠几分钟以确保实例在发出instancesStart 命令之前已关闭。
【解决方案2】:

我建议另一种方法...

目标是更改公共 IP 地址,以衡量缓存和来自先前看到的 IP 地址的重复流量如何影响主系统的测量性能。

因此,我会建议:

  • 拥有与实例关联的弹性 IP 地址
  • 当需要一个新的 IP 地址时:
    • 解除关联弹性 IP 地址
    • 释放弹性IP地址
    • 分配一个新的弹性IP地址
    • 新的弹性 IP 地址与实例关联

你可以使用这个脚本:

INSTANCE=`curl -s http://169.254.169.254/latest/meta-data/instance-id/`

ALLOC=`aws ec2 describe-addresses --filters Name=instance-id,Values=$INSTANCE --query Addresses[].AllocationId --output text`

aws ec2 release-address --allocation-id $ALLOC

NEW=`aws ec2 allocate-address --domain vpc --query AllocationId --output text`

aws ec2 associate-address --allocation-id $NEW --instance-id $INSTANCE

【讨论】:

  • 这当然更简单!您知道是否存在成本差异(考虑到您必须为 Lambda 时间付费而不是免费套餐,并且他们会向您收取您必须等待实例关闭的所有 2-3 分钟的费用)?
  • 嗯,如果实例正在运行,ElasticIP 是免费的!我想我们赢了!
  • 请注意,当 IP 地址更改时,您与实例的任何连接都将丢失。上述命令最好作为脚本在实例本身上运行,而不是手动运行(例如,通过将命令粘贴到命令行)。
  • @DaveM。顺便说一句,似乎可以在不先解除关联的情况下释放地址。如果您发现其他情况,请告诉我。
  • 我在尝试这种方式时遇到了“仍然相关”的错误,但我可能与其他 EIP 错误混淆了——有一次,我无意中分配了 5 个地址(它们不是t 被正确释放)所以 AllocateAddress 调用失败。无论如何,我认为拥有一个非弹性公共 IP,然后简单地分配和关联一个 EIP,然后解除关联/解除分配可能会更干净。虚拟机将回到非弹性公共 IP,这是我需要做的,而且我大部分时间都不必持有 EIP。
猜你喜欢
  • 1970-01-01
  • 2018-01-17
  • 2018-08-30
  • 1970-01-01
  • 2014-01-30
  • 2022-08-10
  • 1970-01-01
  • 1970-01-01
  • 2016-08-04
相关资源
最近更新 更多