首发地址(欢迎大家访问):如何使用AWS Lambda构建一个云端工具(超详细)
1 前言
1.1 无服务器架构
无服务器架构(Serverless Computing)是一种云计算服务模型,它允许开发者构建和运行应用程序而无需直接管理底层服务器或基础设施。开发者无需显式地管理服务器。也就是不再需要担心服务器的配置、扩展或维护。相反,云服务提供商会为替你处理这些底层基础设施,你只需专注于编写代码。
Gartner最近的一份报告表明,到2020年,全球将有20%的企业部署无服务器架构。
这说明无服务器架构不只是一个流行语,而是一种众所周知的云计算趋势,并且已经在软件世界掀起一场革命。大型厂商(如亚马逊)已经在无服务器架构领域重资投入,追赶革命的浪潮1。
无服务器架构主要的两种类型:
FaaS(Functions as a Service):
- 将代码拆分成一个个独立的函数。
- 每个函数都是一个无状态的、短暂的执行单元。
- 函数只在有请求时才被触发执行,执行完毕后即被销毁。
- 典型应用场景: API网关后端、数据处理、事件驱动架构。
BaaS(Backend as a Service):
- 提供一组预构建的后端服务,如数据库、身份验证、推送通知等。
- 开发者可以通过 API 调用这些服务,而无需自己搭建后端。
- 典型应用场景: 移动应用后端、Web应用后端。
无服务器架构的优势:
成本效益高:
- 按需付费,只为使用的资源付费。
- 自动扩展,根据负载动态调整资源。
开发效率高:
- 无需管理服务器,专注于业务逻辑。
- 快速部署和迭代。
高可用性:
- 云服务提供商负责基础设施的可靠性。
弹性扩展:
- 自动应对流量峰值。
无服务器架构的高效、高可用特性属实很吸引我,我一直想弄一个在线的 Python 工具集;当然现在也都只是个想法,大概就是用 Python 写一些NLP工具、随机接口(随机 图片、随机一言等)或者其他任何相关的工具;
之前一直在苦恼没有硬件资源的支持,但如果用无服务器架构来实践的话,应该会有不错的效果;
1.2 本文目标
本文的目标比较简单,就是利用
无服务器架构
写一个随机图片的接口以及一个jieba分词的接口;能够在客户端调用,目标效果如下:
2 关于Amazon Lambda
2.1 简介
Amazon Lambda
是亚马逊云科技提供的核心服务之一,也是典型的无服务器架构
服务;使用 Lambda,基本就可以只管我们的代码了;Lambda 管理提供内存、CPU、网络和其他资源均衡的计算机群,以运行代码。
而且Amazon Lambda是有免费额度的,对于我个人或者说我这小流量网站来讲,免费额度就很吸引人;
所以本文的主要目标就需要结合它来实现了;
详细的介绍及特性描述参考官方文档:什么是 Amazon Lambda?
除了Amazon Lambda,亚马逊云科技还提供了很多其他的免费云产品,了解详情可以访问:亚马逊云科技
2.2 定价
Amazon Lambda是通过运行时间和请求数量来计费的,同时亚马逊云科技提供了一定的免费使用额度;
免费额度包括:每月 1000000 次免费请求和每月 40 万 GB-秒或 320 万秒的计算时间;
这个 GB-秒 其实就是计算时间和内存结合的度量单位,假设你分配了 1 GB 内存给你的Lambda函数,然后这个函数运行了 1 秒,那么你运行一次,就花了 1 GB-秒;
那么这个 320 万秒的时间,也就是你函数最长的运行时间,假如你函数分配的内存是 100 MB ,那么你运行 320 万秒其实才花 31 万多 GB-秒;即使没超过40 万 GB-秒,也超出了免费套餐;
但是这个额度,对于个人或者小需求的用户来讲,已经非常的宽裕了;
你也可以通过Amazon Lambda 定价计算器估算你的需求:
计算的项目是很详细的:
3 逻辑梳理
3.1 关键概念
在使用之前需要了解一些关键的概念,不然的话,后面的东西可能也是云里雾里的;
官方文档:了解关键的 Lambda 概念
简单总结一下:
函数(Function):Lambda 函数是用户上传的业务逻辑代码,可响应触发器执行,代码文件被称为部署程序包。
触发器(Trigger):触发器是 Lambda 执行的起点,定义 Lambda 被调用的事件源。事件源可以是 HTTP 请求(通过 API Gateway)、S3 存储事件、DynamoDB 数据变化等。
事件(Event):触发 Lambda 的具体数据。Lambda 在被调用时会获取事件数据,并将其作为输入传递给函数。
执行环境(Execution Environment):Lambda 的隔离运行环境,包含 OS、运行时、层等组件。每次触发,Lambda 会为每个函数实例创建隔离环境。
部署程序包(Deployment Package):用户上传的代码及其依赖项,以 ZIP 文件或容器镜像格式存储在 Lambda。
运行时(Runtime):Lambda 支持的编程语言环境(如 Python、Node.js),提供函数代码执行所需的语言依赖及生命周期管理。
层(Layer):用于将共享的代码库或依赖分离出来,以便不同 Lambda 函数共用。
并发(Concurrency):每个函数的并发执行次数。Lambda 自动扩展并发处理请求,但可以为函数设定最大并发数。
Qualifier:Lambda 函数的版本或别名,可在部署过程中创建,以支持不同的代码版本管理。
目标位置(Destination):Lambda 可以将执行的结果或错误消息发送到目标服务,如 SNS、SQS 或 EventBridge。
3.2 逻辑流程
以下是 Amazon Lambda 的逻辑架构图,展示了 Lambda 的执行流程,包含触发器、事件、执行环境及目标位置等关键组件:
触发阶段:
- 触发器引发事件(如 HTTP 请求、S3 文件更新),触发器向 Lambda 提供事件数据作为输入。
执行环境准备:
- Lambda 会为函数创建一个隔离的执行环境,包括初始化层、运行时及共享资源(如第三方依赖)。
代码部署和执行:
- Lambda 部署程序包进入执行环境,运行时加载程序包中的代码并开始执行。
- 函数代码通过层加载共用依赖,并通过运行时执行代码逻辑。
并发和伸缩管理:
- Lambda 会自动扩展处理多个并发请求,同时通过并发限制管理资源使用。
返回结果至目标位置:
- Lambda 执行结束后,返回结果或错误信息,并将结果发送至指定的目标位置(如 SNS、SQS)。
版本控制:
- Lambda 允许创建不同版本或别名(Qualifier),支持多版本的分发和管理,方便代码变更追踪和灰度发布。
3.3 本文案例流程架构
通过上面的梳理,我们基本确定,要使用Amazon Lambda的话,一定需要一个触发器来触发对应的函数;
我们本次的目标是弄一个API的服务,所以我们需要使用亚马逊云科技的另外一个服务 Amazon API Gateway来作为触发器
;
- Amazon API Gateway 简介
Amazon API Gateway 是一项亚马逊云科技服务,用于创建、发布、维护、监控和保护任意规模的 REST、HTTP 和 WebSocket API。API 开发人员可以创建能够访问 Amazon 或其他 Web 服务以及存储在 Amazon 云中的数据的 API。
Amazon API Gateway也是可以免费试用的:
我这里不做它过多的介绍,后续有机会的话,可以再详细的研究一下,可以查看官方文档了解更多;
它在这个案例中主要的作用就是来触发函数并提供 api 接口,由 Lambda 提供主要计算逻辑;
那么我们案例的流程架构如下:
4 开始实践
4.1 前置条件
- 你需要有一个亚马逊云科技的账户,如果没有注册的话,可以进入 亚马逊云科技 官网了解更多免费服务并注册;
4.2 创建一个 Lambda 函数
进入控制台后,选择Lambda服务
点击创建按钮
选择从头开始创作;
配置函数名称、运行时环境、主要架构;
这里有个默认执行角色的配置项;