如何将领导者属性设置为 AWS Beanstalk 实例?

Posted

技术标签:

【中文标题】如何将领导者属性设置为 AWS Beanstalk 实例?【英文标题】:How to set leader attribute to an AWS Beanstalk instance? 【发布时间】:2017-11-22 23:13:38 【问题描述】:

我在 AWS Beanstalk 中有以下配置

环境类型:负载均衡、自动伸缩 实例数:1 - 4

创建新实例时,会为新实例添加 crontab。所以重复的crons正在执行。如何将 crontab 设置为仅在一个实例中执行?

我在我的项目中使用 .ebextensions。

【问题讨论】:

【参考方案1】:

你不能指定哪个实例被分配了领导标志;有一个选举过程来确定哪个实例“获胜”。

话虽如此,您可以在创建 crontab 时在 .ebextensions/crontab.config 文件中使用 leader_only 标志。它可能看起来像这样:

container_commands:
  01_create_crontab:
    command: "> /etc/cron.d/mycrontab && chmod 644 /etc/cron.d/mycrontab"
    leader_only: true

【讨论】:

请记住,这个方案并不可靠,AWS 可能会在扩容/缩容过程中,甚至在平台或 ENV 变量更新期间更改“领导者”实例。【参考方案2】:

而不是依赖于在部署时设置 cronjobs,这是不可靠的(AWS 可能会在部署后更改“领导者”),您应该考虑在实际作业代码中检查或设置领导者实例。

见https://github.com/dignoe/whenever-elasticbeanstalk/blob/master/bin/ensure_one_cron_leader,它是Ruby,不是php,但代码可读。

将 crontab 定义部署到所有实例,但在触发作业时: * 使用分布式互斥锁(Redis/ElastiCache 或数据库支持)——只有一名工作人员能够通过 * 或者,代码可能更复杂:检查所有实例是否是领导者,如果没有,则设置一个,然后仅在领导者上继续工作。

或者,您必须改用 Worker Tier 或 SNS/SQS 系统。在 cron.yml 中设置计划,定义一个仅接受来自 localhost 的请求的 POST 端点(将在工作服务器上运行一个本地守护进程,它侦听 SQS 消息并触发作业 => POST)。这不是一个理想的解决方案,但它是一种权衡,AWS EB 平台还有其他好处。

【讨论】:

以上是关于如何将领导者属性设置为 AWS Beanstalk 实例?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AWS Elastic Beanstalk 环境中将 Tomcat 的 URIencoding 设置为 UTF8?

如何在 AWS Elastic Beanstalk 中为多个 grails 环境使用单个 .war?

AWS Beanstalk 跨多个 AWS 账户部署

AWS Elastic beanstalk:使用 docker 镜像时如何设置 ulimit

如何使 django 项目与 AWS Beanstalk 兼容?

通过 ACM 和负载均衡器为 aws Nodejs 弹性 beanstalk 设置了 HTTPS,我如何在 s3 存储桶中为 Angular 设置 HTTPS