首页 > 解决方案 > 预配置 EC2 上的 AWS 系统设计

问题描述

我有一个 AWS 工作流程,如下所示:
API 调用 -> Lambda 函数(Paramiko 远程连接)-> EC2 -> 输出

基本上,我有一个 API 调用,它触发了一个 lambda 函数。在 lambda 函数中,我使用 Python Paramiko 远程连接到预配置的 EC2 实例,在 ec2 实例上运行一些命令,然后返回输出。我对这种设计有两个主要关注点:1.) 延迟和 2.) 可扩展性。

对于延迟:
当我调用 API 时,需要 8-9 秒才能运行,但如果我直接在 EC2 实例上运行作业,则需要 1-2 秒。ssh_client.connect()ssh_client.exec_command()导致运行时间显着增加吗?此外,我正在 t2-micro ubuntu 18.04 免费层 EC2 实例上实现此功能。使用付费版本会导致运行时间不同吗?

对于可扩展性:
我确信 AWS 对此有解决方案,但假设有多个同时进行的 API 调用。我确信我不能只有 1 个可用的 EC2 实例来运行该作业。我是否应该预先配置多个 EC2 实例并使用负载均衡器?我可以使用哪些 AWS 功能来扩展此系统?

如果有什么不清楚的,请询问,我会详细说明。

标签: amazon-web-servicesamazon-ec2

解决方案


在 EC2 实例上运行命令的更“云友好”的方法不是使用 Paramiko,而是使用AWS Systems Manager Run Command,它使用代理在 instance 上运行命令。它甚至可以在多个实例以及安装了代理的本地计算机上运行命令。

另一种设计选择是将“作业”消息推送到 Amazon SQS 队列。工作实例可以轮询 SQS 队列请求工作。当他们收到消息时,他们可以执行工作。这更像是一个异步模型,因为主系统不会“等待”作业完成,因此它需要一个返回路径来提供结果(例如另一个 SQS 队列)。但是,它具有高度可扩展性且更具弹性,不需要负载平衡器。这是一种常见的设计模式。


推荐阅读