如何在弹性容器服务(ECS)或弹性容器镜像服务(ECR)、Elastic Beanstalk 和 Lambda 之间进行选择?

如何在弹性容器服务(ECS)或弹性容器镜像服务(ECR)、Elastic Beanstalk 和 Lambda 之间进行选择?

背景: 我曾使用过 EC2 和 RDS。最近我收到一位客户的咨询,他想使用 Amazon Web Services 开发移动和 Web 应用程序,需要建议他应该使用哪种服务?

  • Elastic Beanstalk
  • 拉姆达
  • 弹性容器服务 (ECS) 或弹性容器注册表 (ECR)

此外,我已经在 YouTube 和 Google 上观看了多个教程来了解这些服务,但我仍然无法确定他应该选择哪种服务。

问题: 我对上述服务没有任何专业知识和使用经验。因此,我想向有相关经验的人寻求建议。

请解释使用特定服务的优点和缺点,以便我更容易提供建议。

答案1

Elastic Beanstalk是传统托管 - 您可以上传 PHP 或 Java 或任何应用程序(例如 Wordpress),配置数据库等,然后就可以使用了。它具有一些用于扩展、恢复等的智能功能,但它仍然是一种非常传统的托管平台。

ECS 容器仍然可以运行传统应用程序,但还有一些细节——最值得注意的是容器没有持久存储并且短暂的,它们可以随时进出和重新启动。这意味着它们必须建造并准备好无需手动配置/干预即可运行。有多种方法可以为容器提供持久存储,但如果可以避免,那就更好了。设计应用程序时,例如将所有数据存储在数据库中,将所有文件存储在 S3 中。顺便说一句回流电阻(Elastic Container Registry)只是您容器的存储空间,需要配合 ECS 使用。

拉姆达是一种云原生无服务器概念,其中应用程序被拆分成小函数来处理各种 API 请求。网站前端通常使用 React 或 Vue 或类似工具构建,并由 S3/CloudFront 提供服务。然后它通过 API 网关对 Lambda 进行 API 调用。

无服务器应用程序和容器通常比传统应用程序具有更好的扩展性如果做得正确另一方面,构建您的第一个无服务器应用程序将有一个相当长的学习曲线,因为有些概念与您可能习惯的不同。

这是一个非常简短的概述。这个话题可以讨论几个小时:)

如果您想这样做,请尝试在谷歌上搜索“无服务器应用程序设计最佳实践”或“容器化应用程序设计最佳实践”之类的内容。

希望有帮助:)

答案2

除了前面的答案之外 - Elastic Beanstalk 更像是一个宠物平台而 Docker (ECS) 和 Lambda。这也意味着 Docker 和 Lambda无国籍者这意味着它们不会(不得)在本地存储任何状态,所有内容都在数据库、memcache 集群和 S3 中。另一方面,Beanstalk 可以存储本地状态,但不鼓励现代应用程序这样做,因为它会使扩展变得复杂。

如果你不熟悉宠物和牛的概念

答案3

我知道有一个答案已经被接受,另一个答案也得到了赞同,但我不认为这两个答案特别好。

首先,让我们回顾一下 Elastic Beanstalk (EB)、ECS 和 Lambda 实际上是什么:

  1. EB 绝对不是您的传统托管。传统托管是指您启动一台服务器,然后为其分配一个 IP 地址,然后您通过 ssh 进入该服务器并开始安装东西。另一方面,EB 是一种托管 PaaS,允许用户轻松启动负载均衡器,其后有一个或多个 EC2,然后 EB 将代表您对其进行监控和管理。然后,您可以上传本机应用程序代码(例如 PHP、Python 等),或者您可以上传 Docker 映像,或者定义存储映像的 S3 URL,或者您可以使用 ECR。开箱即用的 EB 提供了 Web 服务器配置和队列工作器配置,但只需进行少量自定义,就可以很容易地在 Web 服务器配置上运行队列工作器。EB 提供了几种自动扩展选项,我发现平均 CPU 是最有效的 - 我们的生产系统在非高峰时段有两台服务器处于空闲状态,每天在高峰时段自动扩展到大约十几台服务器。结果是,您不能也绝不能将 EB 视为“宠物”——它们绝对是“牲畜”。您也不能指望它们的存储是永久的,因为就像 ECS 一样,EB 会根据您的扩​​展要求或检测到 EC2 不健康时创建和销毁 EC2。

  2. ECS 是一种运行 Docker 容器的解决方案,它提供了对配置的更多控制,因此设置、监控和管理起来也更复杂。您要么需要为 ECS 集群启动并分配自己的 EC2,要么让 Fargate 为您管理 EC2 的创建和销毁。后者工作量较少,但成本更高,因为您无法利用预留实例等成本优化机会。

  3. 正如接受的答案所指出的那样,Lambda 是一种“无服务器”托管概念,通常被吹捧为最适合“小型功能”,但实际上您可以在 Lambda 中托管单片 Web 应用程序,只要您的应用程序不超过配置的内存限制。(例如,查找 Laravel Vapor)。实际上,Lambda 并不是“无服务器”的 - 这些功能在托管 Linux 的微型版本(我听说它被称为“Firecracker”)的虚拟机上运行,​​并且整个过程都围绕能够非常快速地启动这些虚拟机进行了优化。这就是为什么 Lambda 有“冷启动”的概念,即当您的“功能”(又名 VM)在一段时间内没有收到任何请求并被关闭时会发生这种情况。Lambda 的主要限制是成本(取决于您的负载)以及“功能”不能运行超过 15 分钟的事实。

我对 OP 以及任何刚接触 AWS 的人的建议是,绝对要使用 Elastic Beanstalk,而不是 ECS 或 Lambda。使用 EB 将为负载均衡器、VPC、EC2 和 CloudWatch 以及 AWS 控制台提供良好的介绍,并使他们能够快速入门。您将能够托管本机代码或 Docker 容器,并且能够运行队列工作器以及处理 Web 流量。扩展选项足以满足 99% 的情况。EB 最常见的限制是环境变量的 4KB 限制,尽管即使这样也可以使用 Secure Secrets Manager 来解决。

如果您有一些特别长时间运行且占用大量 CPU 的批处理操作,那么 ECS 是最佳选择,因为您可以更好地控制运行这些任务的集群。但是,ECS 更复杂,需要更多知识才能设置好一切。老实说,对于托管具有适度批处理需求的 Web 应用程序,EB 就足够了。

有一些 SDK 和其他工具可以使 Lambda 相当容易使用,即使对于单片 Web 应用程序也是如此,但根据您的流量量,它可能会很昂贵,如果您想运行超过 15 分钟的批处理作业,那么 Lambda 不是一个选择。

总之,使用 Elastic Beanstalk。

相关内容