将数据迁移到云端的最佳 AWS 架构解决方案

Best AWS architecture solution for migrating data to cloud

假设我有 4 或 5 个数据源可以通过 API 调用访问。数据聚合和挖掘全部编写在 python 文件中。可以说输出都是结构化数据。我知道有很多考虑因素,但从较高的层面来看,如果我最终想 运行 在 BI 软件中进行分析,一些可能的解决方案会是什么样子?

  1. 我能否在 Lambda 中托管 python 脚本并将每日触发器设置为 运行 python 文件。然后将输出存储在 RDS/Aurora 中?或者因为我运行宁 API 调用的应用程序不在 AWS 中,我是否需要在 运行宁 Lambda 函数之前将数据放在 AWS 实例中?

  2. 或者在 EC2 实例中托管 python 脚本,使用 lambda 触发每日刷新,仅将数据存储在 EC2-ESB 或 Redshift 中?

刚开始学习AWS云架构,知识还比较有限。似乎任何问题都可以有多种解决方案,所以不确定上述 2 个想法是否可行。

您提到了两种行之有效的方法。最终,这在很大程度上取决于您的用例、预算等。您是对的,通常在 AWS 中,您会有不同的解决方案来解决相同的问题。例如,另一种可能的解决方案是将您的 Python 脚本和 运行 容器化到容器服务 (ECS/EKS) 上。但考虑到您刚刚开始使用 AWS,我将重点关注您提到的方法,因为它可能是最常见的两种方法。

简而言之,根据您的描述,我不建议使用 EC2,因为它会增加您的用例的复杂性,而且会增加额外的成本。如果您可以想象最终的设置,您将需要配置和管理实例本身、它的 class 类型、AMI、您的脚本部署、对互联网的访问、子网等。还有一件小事需要澄清:您将可能在其上设置一个 cron 表达式来触发您的脚本(不是到达 EC2 的 lambda!)。正如您所看到的,相当大的设置带来的好处很少(除了可能获得一些 AWS 经验;))并且实例大部分时间都处于空闲状态,这远非最佳。

如果您只需要 运行 每日 Python 脚本并且需要将输出存储在某个地方我建议使用 lambda 进行处理,您可以简单地安排一个事件(首选方式现在是 Amazon EventBridge),它每天触发您的 lambda 函数一次。然后根据你的输出和你需要如何处理它,你可以使用 Python SDK 从 lambda 明显地使用 RDS,但如果你不需要 运行 特定的,你也可以使用 S3 作为 blob 存储查询 - 例如,如果您可以将输出存储为 json 格式。

请注意,lambda 的一个限制是每次执行只能 运行 连续 15 分钟。好处是默认情况下 lambda 可以访问互联网,因此您无需关心任何网关设置并且可以访问您的外部端点。

同样从成本的角度来看 运行宁一个 lambda/day 与 S3 结合应该是免费的或几乎免费的。 lambda 的定价非常便宜。 运行 24/7 一个 EC2 实例或 RDS(也是一个实例)会花费你一些钱。

在 S3 中存储的 Lambda 是可行的方法。 EC2/EBS 成本会随着时间的推移而增加,EC2 将限制您可以实现的并行度。

将 Step Functions 视为一种组织和编排 Lambda 的方法。我有 python 代码,可将 500K+ 文件复制到 S3 并需要一周时间才能 运行。如果我并行复制文件(一次 500 个左右),这个过程大约需要 10 个小时。并行性受到采购系统的限制,因为我可以通过扩大范围来使其过载。主 Lambda 以受控速率启动文件副本 Lambda,但也在 运行 几分钟后终止,但 returns 最后一个文件更新到控制 Step Function。 Step Function 在最后一个停止的地方重新启动主 Lambda。

由于您有多个源,因此您可以并行地拥有多个顶级 Lambda 运行,所有这些都来自同一个 Step Function,并且每个 Lambda 都启动受控数量的 worker Lambda。您不会使 S3 不堪重负,但您需要确保不会使您的资源过载。

这个最好的部分是它花费几美分(在我使用的规模上)。

数据进入 S3 后,我将其复制到 Redshift 并进行转换。通过附加的 Lambda 函数,这些过程也是 Step Function 的一部分。