AWS Lambda 与无服务器架构
无服务器架构是一种构建应用程序和服务的方法,无需管理基础设施。应用程序还是在服务器上运行,但所有服务器管理工作均由 AWS 来完成。无需再预置、扩展和维护服务器,就可以让你的应用程序、数据库和存储系统正常工作。
AWS Lambda 是 AWS 提供的一种无服务器计算服务,它可以让你运行任何类型的代码,来应对事件或 HTTP 请求。只要写好代码,然后上传到 Lambda,Lambda 就会给你分配和管理计算资源,按照你的代码跑了多久和用了多少资源来收钱。
在这篇文章里,会详细讲讲 AWS Lambda 是怎么工作的,有什么好处和坏处,以及怎么用 Lambda 和其他 AWS 服务来做无服务器架构的常见模式和用例。
AWS Lambda 的工作原理
要使用 AWS Lambda,你需要创建一个 Lambda 函数,即一段可在 Lambda 环境中运行的代码。你可以使用你喜欢的编程语言来编写 Lambda 函数,只要 Lambda 支持该语言的运行时。目前,Lambda 支持以下语言的运行时:
- Node.js
- Python
- Ruby
- Java
- Go
- .NET Core
- Custom Runtime
你还需要为你的 Lambda 函数指定一个处理程序,即在 Lambda 环境中启动你的代码的函数。处理程序的名称和格式取决于你使用的编程语言。例如,如果你使用 Python 编写 Lambda 函数,你可以将处理程序指定为 file_name.function_name,其中 file_name 是包含你的代码的文件的名称,而 function_name 是你的代码中定义的函数的名称。
你还可以为你的 Lambda 函数配置一些设置,例如:
- 内存大小:你可以为你的 Lambda 函数分配的内存量,从 128 MB 到 10240 MB。
- 超时时间:你的 Lambda 函数在终止之前可以运行的最长时间,从 1 秒到 900 秒。
- 角色:你的 Lambda 函数需要的 IAM 角色,以便访问其他 AWS 资源。
- 环境变量:你可以为你的 Lambda 函数定义的一组键值对,以便在你的代码中使用。
- 层:你可以为你的 Lambda 函数添加的一层或多层,以便重用代码或库。
你可以通过多种方式来触发你的 Lambda 函数,例如:
- 事件源:你可以配置你的 Lambda 函数以响应来自其他 AWS 服务的事件,例如 S3、DynamoDB、SNS、SQS 等。当这些服务产生一个事件时,它们会将事件数据发送到 Lambda,Lambda 会调用你的函数并将事件数据作为输入参数传递给你的函数。
- API Gateway:你可以使用 Amazon API Gateway 来创建一个 RESTful API,并将 API 的请求映射到你的 Lambda 函数。当 API 收到一个请求时,它会将请求数据发送到 Lambda,Lambda 会调用你的函数并将请求数据作为输入参数传递给你的函数。
- AWS SDK:你可以使用 AWS SDK 来直接调用你的 Lambda 函数,无需通过事件源或 API Gateway。你可以将任何数据作为输入参数传递给你的函数,并获取函数的返回值。
当你的 Lambda 函数被触发时,Lambda 会为你的函数分配一个计算实例,并在该实例上启动你的函数的运行时和处理程序。然后,Lambda 会将输入参数传递给你的处理程序,并执行你的代码。当你的代码执行完毕时,Lambda 会获取你的处理程序的返回值,并将其作为输出返回给调用者。最后,Lambda 会停止你的函数的运行时和处理程序,并释放计算实例。
如果你的 Lambda 函数被频繁触发,Lambda 会为你的函数重用计算实例,以提高性能和效率。这意味着你的函数的运行时和处理程序不会每次都被启动和停止,而是会保持在内存中,直到计算实例被回收或更换。这也意味着你的函数可以利用计算实例的状态,例如全局变量、缓存、连接池等,来加速你的代码的执行。但是,你不能依赖计算实例的状态,因为它可能随时变化或消失。
AWS Lambda 的优势
使用 AWS Lambda 有以下几个优势:
- 灵活性:你可以使用你喜欢的编程语言和工具来编写你的代码,并将其部署到 Lambda,无需考虑服务器的选择、配置和管理。
- 可扩展性:你无需预置或扩展你的服务器,Lambda 会根据你的函数的触发频率和并发量,自动为你分配和管理足够的计算资源,以满足你的需求。
- 可靠性:你无需担心你的服务器的故障、维护或更新,Lambda 会确保你的函数始终可用,并在发生错误时自动重试或恢复。
- 低成本:你无需为你的服务器付费,Lambda 会根据你的函数的执行时间和使用的资源量来收费,你只需为你实际使用的计算资源付费,而不是为你预置的计算资源付费。
AWS Lambda 的局限性
使用 AWS Lambda 也有以下几个局限性:
- 冷启动:当你的 Lambda 函数被首次触发或在一段时间内没有被触发时,Lambda 会为你的函数分配一个新的计算实例,并在该实例上启动你的函数的运行时和处理程序。这个过程可能需要一些时间,从几百毫秒到几秒不等,取决于你的函数的运行时和代码大小。这会导致你的函数的响应时间变慢,影响你的用户体验。这个问题被称为冷启动,你可以通过一些方法来缓解或避免,例如使用预热技术、优化你的代码和依赖项、选择合适的内存大小等。
- 超时时间:你的 Lambda 函数在终止之前可以运行的最长时间是 900 秒,如果你的函数需要运行更长的时间,你可能需要将你的任务分解为多个函数,或者使用其他 AWS 服务,例如 ECS、Fargate 或 Batch。
- 资源限制:你的 Lambda 函数可以使用的计算资源是有限的,例如内存、CPU、磁盘空间、网络带宽、文件描述符等。如果你的函数需要更多的资源,你可能需要优化你的代码或使用其他 AWS 服务,例如 EC2、ECS、Fargate 或 Batch。
- 依赖管理:你的 Lambda 函数可能需要使用一些外部的库或框架,你需要将这些依赖项打包到你的函数的部署包中,并上传到 Lambda。这可能会增加你的函数的代码大小和复杂性,以及你的部署和更新