在 Beanstalk 部署或 ECS 任务不使用时安排 EC2 实例的停止/启动?

Posted

技术标签:

【中文标题】在 Beanstalk 部署或 ECS 任务不使用时安排 EC2 实例的停止/启动?【英文标题】:Scheduling the stopping/starting of an EC2 instance when not in use by a Beanstalk Deployment or an ECS task? 【发布时间】:2018-11-04 06:58:55 【问题描述】:

我有一个包含 Python 代码和第三方二进制可执行文件的 Docker 映像。只有出站网络请求。图像必须每小时运行一次,每次执行持续约 3 分钟。

我可以:

    使用 EC2 实例并通过 cron 计划每小时执行一次 创建 CloudWatch 事件/规则以每小时运行一次 ECS 任务定义 设置 Elastic Beanstalk 环境并安排每小时部署映像

在所有这些场景中,EC2 实例都在 24/7 运行,并且我需要为长时间不使用而付费。

我如何实现每小时启动现有 EC2 实例并在完成我的 docker 映像后停止该实例?

【问题讨论】:

【参考方案1】:

这是我能想到的一种方法。它非常高级,省略了一些细节,但从概念上讲它可以正常工作。您还需要考虑使用的身份和访问管理 (IAM) 角色:

触发 Step Function 的 CloudWatch 事件规则 AWS Step Function 触发 Lambda 函数 用于启动 EC2 实例的 AWS Lambda 函数

EC2 实例轮询 Step Functions 服务的活动任务

    使用 cron 表达式创建 CloudWatch 事件规则以安排定期任务 CloudWatch 事件规则的目标是 AWS Step Function AWS Step Function 状态机首先触发一个 AWS Lambda 函数,该函数启动 EC2 实例 Step Functions 状态机中的下一步调用一个 Activity Task,表示需要执行的 Docker 容器 EC2 实例上运行了一个脚本,该脚本轮询 Activity Task 的工作 EC2 实例执行 Docker 容器,等待它完成,并向 Step Functions Activity Task 发送完成消息 在 EC2 实例上运行的脚本自行关闭 AWS Step Function 结束

请记住,一个可能更好的选择是每小时启动一个新的 EC2 实例,而不是简单地启动和停止同一个实例。尽管通过启动现有实例与启动新实例相比,您可能会获得更好的启动性能,但您还必须花时间像宠物一样维护 EC2 实例:修复出现的问题,或定期修补操作系统。在当今世界,基础设施应该是一次性的,这是一种普遍接受的做法。毕竟,您已经将应用程序打包到 Docker 容器中,因此您很可能不会对容器实际在哪个主机上执行过于具体的期望。

另一种选择是使用 AWS Fargate,它旨在运行 Docker 容器,而无需担心启动和管理容器基础设施。

AWS Step Functions AWS Fargate Blog: AWS Fargate: An Overview Creating a CloudWatch Event Rule that triggers on a schedule

【讨论】:

我很欣赏这种方法的高级概述,因为我是 AWS 的初学者,它为我提供了很多学习和研究的线索。至于关闭 EC2 实例的过程,难道我不能有一个状态来调用一个 lambda 函数来终止我在第一个状态下生成的 EC2 实例吗?它是调用 Docker 容器的状态之后的“下一步”。 是的,当然这是另一种选择。 ? 我只是想让解决方案尽可能简单。 你会建议创建一个新的集群,每个我想运行 docker 镜像吗?我很难启动一个新实例(使用 ecs 优化图像)并将其附加到现有集群。然而,根据docs.aws.amazon.com/AmazonECS/latest/developerguide/…,以编程方式启动集群+实例很容易。 无论采用哪种方法,您仍在创建 EC2 实例并将它们加入集群。我会尝试解决您在启动实例并将其加入集群时遇到的具体问题。假设您的 IAM 实例配置文件/角色和 EC2 用户数据设置正确,它应该“正常工作”。 @SeanPianka 是的,您当然可以为此目的使用 AWS Step Functions。事实上,我发表了一篇博客文章,展示了这一点,其中轮询的频率超过 60 秒是必要的。由于 CloudWatch Events 被限制为 60 秒间隔的最大精度,Step Functions 可以填补此处的空白,并减少 AWS Lambda 中浪费的计算时间。见这里:aws.amazon.com/blogs/compute/…

以上是关于在 Beanstalk 部署或 ECS 任务不使用时安排 EC2 实例的停止/启动?的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk 与 EC2 容器服务 (ECS) - Docker

使用 ECS 的 Docker 级别负载均衡

创建应用程序源包AWS Elastic Beanstalk

AWS Beanstalk 使用 Grunt 任务部署 Laravel

如何在 ECS(容器存储)上验证 AWS EBS(Beanstalk)? AccessDeniedException

我可以使用 Elastic Beanstalk 部署工作线程吗?