【问题标题】:How to run cron job only on single instance in AWS AutoScaling?如何仅在 AWS AutoScaling 中的单个实例上运行 cron 作业?
【发布时间】:2021-08-05 22:05:04
【问题描述】:
我为我的应用程序安排了 2 个 cronjobs。
我的应用程序服务器在一个自动缩放组中,由于高可用性,我至少保留了 2 个实例。一切正常,但由于自动缩放中有 2 个实例,cron 作业正在运行多次。
我无法将实例大小限制为 1,因为我的应用程序已经在生产环境中,我更喜欢 HA。
我应该如何限制在单个实例上执行 cron 作业?还是我必须使用其他服务,例如 AWS Lamda 或 AWS ELlasticBeanstalk
【问题讨论】:
标签:
amazon-web-services
cron
autoscaling
【解决方案1】:
首先您应该考虑在这些实例上运行 crons 是否合适。如果您试图保持这种高可用性并且它是通过客户直接交互的,那么 crons 性能会产生什么影响?
也许考虑使用一个单独的自动缩放组或实例,总共有 1 个实例来运行这些 crons?您可以在 cron 需要运行之前启动实例或更新自动缩放组,然后在完成后自动关闭。
否则,您需要考虑为脚本使用锁定机制。通过使用它,您的脚本编写一个锁以确认它正在处理中,在脚本运行开始时它会检查是否有任何脚本锁正在进行中。为了进一步防止多台服务器之间发生冲突的可能性,请考虑在脚本的开头添加抖动(随机睡眠秒数)。
适合写锁的技术如下:
【解决方案2】:
Chris Williams 建议的解决方案听起来很合理如果不能选择使用 lambda 函数。
模拟 cron 作业的一种方法是将 CloudWatch Events(现在称为 EventBridge)与 AWS Lambda 结合使用。
首先,您需要使用需要按计划执行的代码编写一个 Lambda 函数。 Lambda 支持cron expressions。
然后,您可以将 Schedule Expressions 与 EventBridge/CloudWatch Event 一起使用,就像使用 cron 选项卡一样,并将 Lambda 函数作为目标。
【解决方案3】:
您可以对实例启用终止保护。为系统管理员附加必要的角色和权限。一旦实例在系统管理器下的托管实例下可用,您就可以在 cloudwatch 中创建计划事件来运行 ssm 文档。如果您正在运行 bash 脚本,请将其转换为 ssm 文档并将此文档设置为 targate。或者你可以使用 shellscript 文档来运行命令