如果你正在使用AWS,这篇文章对你会有一些很好的帮助。
对无服务器体系结构感兴趣,那么你可能已经阅读了许多相互矛盾的文章,并且想知道无服务器体系结构是经济高效还是昂贵的。我想通过对网络抓取解决方案的分析来消除有关有效性问题的疑虑。
用例非常简单:在一天中的某些时候,我想运行一个Python脚本并抓取一个网站。该脚本的执行时间不到15分钟。这是一个重要的考虑因素,我们将在后面讨论。该项目可以被视为没有用户界面的标准提取,转换,加载过程,并且可以打包到一个自包含的函数或库中。
随后,我们需要一个环境来执行脚本。我们至少要考虑两个选项:本地(例如在本地计算机上,家庭中的Raspberry Pi服务器,数据中心中的虚拟机等等),或者可以将其部署到云中。乍一看,前一种选择可能会更具吸引力-您可以免费使用基础架构,为什么不使用它呢?本地托管解决方案的主要问题是可靠性-在断电,硬件或网络故障的情况下,您可以确保其可用性吗?此外,您的本地基础架构是否支持持续集成和持续部署(CI / CD)工具以消除任何手动干预?考虑到这两个限制,我将继续在云中而不是在本地分析解决方案。
让我们从三种基于云的方案的定价开始,并在下面进行详细介绍。
* AWS Lambda免费使用层包括每月100万个免费请求和每月40万GB-秒的计算时间。查看AWS Lambda定价。
实践一
第一种实践是最原始的选择,即AWS中虚拟机的一个实例(称为Amazon Elastic Cloud Compute或EC2)。但是,它肯定与任何无服务器架构都不相似,因此让我们将其视为参考点或基准。此选项类似于为您提供对实例的完全控制权的本地解决方案,但是您需要手动旋转实例,安装环境,设置调度程序以在特定时间执行脚本,并继续执行该操作。24×7。并且不要忘记安全性(设置VPC,路由表等)。此外,您将需要监视实例的运行状况,并可能运行手动更新。
实践二
第二个实践是对解决方案进行容器化并将其部署在Amazon Elastic Container Service(ECS)上。这样做的最大好处是平台独立性。拥有一个Docker文件(一个文本文件,其中包含您可以在命令行上调用以组装映像的所有命令)和环境副本,该脚本使您能够在AWS平台或其他地方在本地重用该解决方案。在AWS上运行它的一个巨大优势是,您可以与其他服务集成,例如AWS CodeCommit,AWS CodeBuild,AWS Batch等。您还可以从Amazon EC2 Spot实例等打折的计算资源中受益。
如上图所示,该架构由 Amazon CloudWatch,AWS Batch和 Amazon Elastic Container Registry (ECR)组成。CloudWatch允许您创建触发器(例如,将代码更新提交到代码存储库时启动作业)或计划的事件(例如,每小时执行一次脚本)。我们希望后者:根据计划执行作业。触发后,AWS Batch将从Amazon ECR获取预构建的Docker映像,并在预定义的环境中执行它。AWS Batch是一项免费服务,可让您配置任务执行所需的环境和资源。它依赖于ECS,ECS在执行时管理资源。您只需为执行任务期间消耗的计算资源付费。
您可能想知道预构建的Docker映像来自何处。它是从Amazon ECR中提取的,现在您有两个选择可以在其中存储Docker映像:
- 您可以在本地构建Docker映像并将其上传到Amazon ECR。
- 您只需将少量配置文件(例如Dockerfile,buildspec.yml等)提交到AWS CodeCommit(代码存储库)并在AWS平台上构建Docker映像即可。完整的CI / CD管道。在本地更新脚本文件并将更改提交到AWS CodeCommit上的代码存储库之后,将触发CloudWatch事件,并且AWS CodeBuild将构建新的Docker映像并将其提交到Amazon ECR。调度程序启动新任务时,它将使用更新的脚本文件获取新映像。如果您想进一步探索或者想要实际实现这种方法,请查看GitHub上的项目示例。
实践三
第三个实践基于AWS Lambda,它使您可以按需构建非常精简的基础架构,可以连续扩展,并且每月都有免费的免费套餐。Lambda的主要限制是执行时间不得超过15分钟。如果您的任务运行时间超过15分钟,则需要将其拆分为多个子任务并并行运行,否则您可以使用选项2。
默认情况下,Lambda允许您访问标准库(例如 Python Standard Library)。此外,您可以 构建自己的程序包 以支持功能的执行,也可以使用 Lambda Layers 来访问外部库,甚至是基于Linux的外部程序。
您可以通过Web控制台访问AWS Lambda,以创建新功能,更新Lambda代码或执行它。但是,如果您超越了“ Hello World”功能,则可能会意识到在线开发是不可持续的。例如,如果您想从函数访问外部库,则需要在本地对其进行存档,上传到Amazon Simple Storage Service(Amazon S3),然后将其链接到Lambda函数。
自动化Lambda函数开发的一种方法是使用 AWS Cloud Development Kit (AWS CDK),这是一个开放源代码软件开发框架,可以使用熟悉的编程语言来建模和配置您的云应用程序资源。最初,设置和学习可能会很费力;但是好处是值得的。举个例子,请看一下GitHub上的这个Python类,它创建一个Lambda函数,一个CloudWatch事件,IAM策略和Lambda层。
总而言之,AWS CDK允许您将基础架构作为代码,并且所有更改都将存储在代码存储库中。对于部署,AWS CDK会构建一个 AWS CloudFormation 模板,这是在AWS上对基础架构进行建模的标准方法。此外, AWS无服务器应用程序模型(SAM)允许您在本地测试和调试无服务器代码,这意味着您确实可以创建持续集成。
在GitHub上查看基于Lambda的网络抓取工具的示例。
结论
在这篇文章中,我们回顾了AWS云上用于Web爬虫的两种无服务器架构。此外,我们还探索了实施CI / CD管道的方法,以避免将来进行任何手动干预。
--END--