AWS Lambda 常见问题

一般性问题

通过 AWS Lambda,无需预置或管理服务器即可运行代码。您只需按消耗的计算时间付费 – 代码未运行时不产生费用。借助 Lambda,您几乎可以为任何类型的应用程序或后端服务运行代码,而且全完全无需管理。只需上传您的代码,Lambda 会处理运行和扩展高可用性代码所需的一切工作。您可以将您的代码设置为自动从其他 AWS 服务触发,或者直接从任何 Web 或移动应用程序调用。

无服务器计算让您可以在不考虑服务器的情况下构建并运行应用程序和服务。使用无服务器计算,您的应用程序仍在服务器上运行,但所有服务器管理工作均由 AWS 负责。无服务器计算的核心是 AWS Lambda,这项服务可使您无需预置或管理服务器即可运行代码。

有关事件源的完整列表,请参阅我们的文档

Amazon Web Services 提供一组计算服务以满足各种需求。

Amazon EC2 具有范围广泛的实例类型,以及自定义操作系统、网络和安全设置以及整个软件堆栈的选项,可提供灵活性,从而让您能够将现有的应用程序轻松迁移到云中。使用 Amazon EC2,您将负责预置容量、监控服务器队列的运行状况和性能,并设计容错性和可扩展性。AWS Elastic Beanstalk 提供易用的服务,供您部署和扩展 Web 应用程序,您可以在其中保留对底层 EC2 实例的所有权和完整控制权。Amazon EC2 Container Service 是一项可扩展的管理服务,支持 Docker 容器,允许您轻松地在 Amazon EC2 实例的托管集群上运行分布式应用程序。

AWS Lambda 可用于依照对事件的响应轻松执行代码,如 Amazon S3 存储桶的更改、Amazon DynamoDB 表的更新或您的应用程序或设备生成的自定义事件。利用 Lambda,您不必预置您自己的实例;Lambda 会代您执行所有的运行和管理活动,包括容量预置、监控服务器队列运行状况、向底层计算资源应用安全补丁、部署您的代码、在前端运行 Web 服务以及监控和记录您的代码。AWS Lambda 为您的代码提供轻松的扩展和高可用性,从而无需您做额外努力。

AWS Lambda 提供了一种简单的方式来完成云中的许多活动。例如,您可以使用 AWS Lambda 构建以下内容:可以检索并转换 Amazon DynamoDB 中数据的移动后端,当对象上传到 Amazon S3 以后对其进行压缩或转换的处理程序,用于任意 Amazon Web Service 的 API 调用的审核和报告功能,使用 Amazon Kinesis 进行的流数据免服务器处理。

AWS Lambda 原生支持 Java、Go、PowerShell、Node.js、C#、Python 和 Ruby 代码,并提供 Runtime API,允许您使用任何其他编程语言来编写函数。有关使用 Node.jsPythonJavaRubyC#GoPowerShell 的信息,请参阅我们的文档。

不能。AWS Lambda 会代您运行计算基础设施,从而执行运行状况检查、应用安全补丁和执行其他例行维护。
每个 AWS Lambda 函数都运行在其自己的隔离环境中,有其自己的资源和文件系统视图。AWS Lambda 使用与 Amazon EC2 相同的技术在基础设施和执行级别上提供安全性和隔离。
AWS Lambda 在 Amazon S3 中存储代码并对其进行静态加密。AWS Lambda 在使用您的代码时执行额外的完整性检查。

AWS Lambda 函数

您在 AWS Lambda 上运行的代码以“Lambda 函数”上传。每个函数都有相关的配置信息,如其名称、描述、入口点和资源要求。代码必须以“无状态”样式编写,即应假设与底层计算基础设施无密切关系。本地文件系统访问、子过程和类似的项目可能不会超出请求的使用寿命,且任何持续状态都应存储在 Amazon S3、Amazon DynamoDB、Amazon EFS 或另一个可用 Internet 的存储服务中。Lambda 函数可包含库,甚至是本机库。

为了提高性能,AWS Lambda 可以选择保留您的函数实例,将其再用于服务后续请求,而不是创建一个新副本。要了解有关 Lambda 如何重复使用函数实例的更多信息,请访问我们的文档。您的代码不应假设此操作总是发生。

您可以为每个 Lambda 函数配置其自己的短暂存储(介于 512MB 与 10240MB 之间,以 1MB 为增量)。短暂存储在每个函数的 /tmp 目录中均可使用。

每个函数都能免费使用 512MB 的存储空间。使用超过 512MB 的短暂存储配置函数时,将会根据配置的存储量和函数运行的时间计费,以 1 毫秒为增量来计量。相比之下,在美国东部(俄亥俄)区域,AWS Fargate 短暂存储价格为每小时每 GB 0.000111 美元,或每月每 GB 0.08 美元。美国东部(俄亥俄)的 Amazon EBS gp3 存储卷定价为每月每 GB 0.08 美元。AWS Lambda 短暂存储定价为每秒每 GB 0.0000000309 美元,或每小时每 GB 0.000111 美元和每月每 GB 0.08 美元。要了解更多信息,请参阅 AWS Lambda 定价

您可以在函数创建或更新期间,使用 AWS Lambda 控制台、AWS Lambda API 或 AWS CloudFormation 模板为每个 Lambda 函数配置其自己的短暂存储(介于 512MB 与 10240MB 之间,以 1MB 为增量)。
符合。存储在短暂存储中的所有数据都使用 AWS 管理的密钥进行静态加密。

您可以使用 AWS CloudWatch Lambda Insight 指标来监控短暂存储使用量。要了解详情,请参阅 AWS CloudWatch Lambda Insights 文档

如果您的应用程序需要耐用的持久性存储,请考虑使用 Amazon S3 或 Amazon EFS。如果您的应用程序需要在单一函数调用中存储代码所需的数据,请考虑使用 AWS Lambda 短暂存储作为暂时性缓存。要详细了解,请参阅在 Web 应用程序中选择 AWS Lambda 数据存储选项

符合。但是,如果您的应用程序需要持久性存储,请考虑使用 Amazon EFS 或 Amazon S3。当您为函数启用预置并发时,函数的初始化代码会在分配期间和每隔几个小时运行一次,因为执行中的函数实例会被回收。您可以在实例处理请求后的日志和跟踪中查看初始化时间。但是,即使实例从不处理请求,也会对初始化计费。此预置并发初始化行为可能会影响您的函数与存储在短暂存储中的数据的交互方式,即使您的函数不处理请求也是如此。有关预置并发的详情,请参阅相关文档

您可以在函数创建或更新期间,使用 AWS Lambda 控制台、AWS Lambda API 或 AWS CloudFormation 模板为每个 Lambda 函数配置其自己的短暂存储(介于 512MB 与 10240MB 之间,以 1MB 为增量)。
符合。存储在短暂存储中的所有数据都使用 AWS 管理的密钥进行静态加密。

您可以使用 AWS CloudWatch Lambda Insight 指标来监控短暂存储使用量。要了解详情,请参阅 AWS CloudWatch Lambda Insights 文档

保持函数的无状态性可使 AWS Lambda 按需要尽可能多地启动函数副本,从而扩展到传入事件的速率。由于 AWS Lambda 的编程模式是无状态的,因此您的代码可以通过调用其他 Web 服务,如 Amazon S3 或 Amazon DynamoDB,来访问有状态的数据。
符合。AWS Lambda 可使您使用正常的语言和操作系统功能,如创建额外的线程和进程。分配至 Lambda 函数的资源,包括内存、执行时间、磁盘和网络使用,都必须通过其使用的所有线程/进程进行共享。可以使用任意 Amazon Linux 支持的语言启动进程。
Lambda 尝试尽可能不对正常的语言和操作系统活动施加限制,但有些活动仍被禁用:入站网络连接被 AWS Lambda 阻止;对于出站连接,只支持 TCP/IP 和 UDP/IP 套接字;ptrace(调试)系统调用受到限制。TCP 端口 25 流量同样受到阻止,这是一项反垃圾邮件措施。

如果您正在使用 Node.js 或 Python,则可以使用 AWS Lambda 控制台中的代码编辑器来编写函数代码,该编辑器支持编写和测试函数,并在类似 IDE 的稳健环境中查看函数执行的结果。前往控制台以开始

您也可以将代码(以及任何依赖库)打包为 ZIP 并使用 AWS Lambda 控制台从您的本地环境上传或指定 ZIP 文件所在的 Amazon S3 位置。上传的内容必须不大于 50MB (压缩过的)。您可以使用 AWS Eclipse 插件以 Java 编写和部署 Lambda 函数。您可以使用 Visual Studio 插件以 C# 和 Node.js 制作和部署 Lambda 函数。

您可以将代码(以及任何依赖库)打包为 ZIP 并使用 AWS CLI 从您的本地环境上传或指定 ZIP 文件所在的 Amazon S3 位置。上传的内容必须不大于 50MB (压缩过的)。请访问 Lambda 入门指南以开始使用。

符合。使用 AWS Lambda 控制台、命令行界面或软件开发工具包,即可轻松创建和修改环境变量。要了解有关环境变量的更多信息,请参阅该文档

对于敏感信息(如数据库密码),我们建议您使用 AWS Key Management Service 进行客户端加密,并将生成的值作为加密文字存储在您的环境变量中。您需要在 AWS Lambda 函数代码中包含逻辑才能解密这些值。

您可以使用 Lambda API 或控制台调整和保护与您的 Lambda 函数相关联的资源。要了解更多信息,请参阅文档

可以,您可以将任何代码(框架、软件开发工具包、库等)打包为 Lambda Layer,并在多个函数之间轻松进行管理和共享。

AWS Lambda 会通过 Amazon CloudWatch 报告实时指标,代您自动监控 Lambda 函数,指标包括请求总数、账户级别和函数级别并发使用情况、延迟、出错率和请求调用。通过 Amazon CloudWatch 控制台或 AWS Lambda 控制台,可以查看每一个 Lambda 函数的统计信息。您还可以在您的 Lambda 函数中调用第三方监控 API。
 

请访问排查 CloudWatch 指标问题了解更多信息。使用 Lambda 的内建指标会依照 AWS Lambda 的标准费率计费。

AWS Lambda 与 Amazon CloudWatch logs 自动集成,对每个 Lambda 函数创建一个日志组并提供基本的应用程序生命周期事件日志条目,包括记录该函数每次使用时所消耗的资源。您可以轻松将额外的日志语句插入到代码中。您还可以在 Lambda 函数中调用第三方日志记录 API。请访问排查 Lambda 函数问题了解更多信息。将按照 Amazon CloudWatch 日志费率计费。

您不必扩展 Lambda 函数,AWS Lambda 会代您自动执行扩展。每当接收到您的函数的事件通知时,AWS Lambda 会在其计算队列中快速定位空闲容量并运行您的代码。由于您的代码是无状态的,AWS Lambda 可以在需要时尽可能多地启动实例副本,而不会发生冗长的部署和配置延迟。函数的扩展方面没有基本限制。AWS Lambda 将动态分配容量以匹配传入事件的速率。

在 AWS Lambda 资源模型中,您可以选择用于函数的内存量,这会分配等比例的 CPU 计算能力和其他资源。例如,选择 256MB 的内存时,分配至您的 Lambda 函数的 CPU 功率约是请求 128MB 内存时的两倍,并且是选择 512MB 内存时的一半。要了解更多信息,请参阅我们的功能配置文档

您可以将内存从 128MB 设置为 10,240MB。

运行内存或计算密集型工作负载的客户现在可以使用更多内存执行其功能。更大的内存功能可帮助多线程应用程序更快地运行,使其成为数据和计算密集型应用程序(如机器学习、批处理和 ETL 作业、财务建模、基因组学、HPC 和媒体处理)的理想选择。
AWS Lambda 函数可以配置为每次执行最长运行 15 分钟。您可以将超时设置为 1 秒到 15 分钟之间的任何值。

AWS Lambda 按使用量收费。请参阅 AWS Lambda 定价页面,了解详细信息。

符合。除了节省 Amazon EC2 和 AWS Fargate 成本之外,您还可以使用 Compute Savings Plans 节省 AWS Lambda 成本。Compute Savings Plans 可提供高达 17% 的持续时间、预置并发和持续时间(预置并发)折扣。Compute Savings Plans 不会在 Lambda 账单中提供请求折扣。但是,Compute Savings Plans 承付额将按常规费率应用至请求。

符合。默认情况下,每个 AWS Lambda 函数拥有单一的当前版本的代码。Lambda 函数客户端可调用特定的版本或获取最新的实施。请阅读我们有关 Lambda 函数版本控制的文档。

部署时间根据代码大小的不同而不同,但 AWS Lambda 函数一般在上传后几秒钟内就能做好调用准备。
符合。您可以在其中包含自己的代码库的副本(包括 AWS 软件开发工具包),以使用除 AWS Lambda 所提供的默认版本之外的版本。

AWS Lambda 为超过特定阈值的每月按需函数持续时间,提供优惠的定价层。分层定价适用于在 x86 和 Arm 架构上运行的函数。Lambda 定价层适用于账户内,同一区域中采用相同架构(分别为 x86 或 Arm)所运行函数的每月累积按需持续时间。如果您在 AWS Organizations 中使用整合计费,则定价层将适用于跨组织的所有账户,在相同区域,采用相同架构运行的函数的每月累计持续时间。例如,如果您在美国东部(俄亥俄州)区域运行 x86 Lambda 函数,您将为在该区域前 60 亿 GB 秒/月的每 GB 秒支付 0.0000166667 美元,为后 90 亿 GB 秒/月的每 GB 秒支付 0.0000150000 美元,并为每月超过 150 亿 GB 秒/月的每 GB 秒支付 0.0000133334 美元。请求、预配置并发和预配置并发持续时间的定价保持不变。有关更多信息,请参阅 AWS Lambda 定价

符合。属于您每小时节省计划承诺内的 Lambda 使用量是按适用的 CSP 费率和折扣计费。此承诺未涵盖的剩余使用量将按照您的每月累计函数持续时间所属级别对应的费率进行计费。

使用 AWS Lambda 处理 AWS 事件

事件源是 AWS 服务或开发人员创建的应用程序,用于生成可触发 AWS Lambda 函数使其运行的事件。有些服务通过直接调用云函数(例如 Amazon S3)向 Lambda 发布这些事件。Lambda 也可以在未向 Lambda 发布事件的其他服务中轮询资源。例如,Lambda 可以从 Amazon Kinesis 流或 Amazon SQS 队列中轮询记录,然后针对获得的每条消息执行 Lambda 函数。通过登录到 Amazon S3 并使用 S3 桶通知,就可将 AWS CloudTrail 等其他很多服务用作触发 AWS Lambda 函数的事件源

有关事件源的完整列表,请参阅我们的文档

事件以事件输入参数的形式传输到 Lambda 函数中。对于事件在其中批量到达的事件源,如 Amazon SQS、Amazon Kinesis 和 Amazon DynamoDB Streams,根据您请求的批量大小,事件参数可能在单次调用中就包含多个事件。要了解 Amazon S3 事件通知的更多信息,请访问配置 Amazon S3 事件通知。要了解有关 Amazon DynamoDB Streams 的更多信息,请访问 DynamoDB 流开发人员指南。要了解有关使用 Amazon SNS 调用 Lambda 函数的更多信息,请访问 Amazon SNS 开发人员指南。有关 Amazon Cognito 事件的更多信息,请访问 Amazon Cognito。有关 AWS CloudTrail 日志和跨 AWS 服务审计 API 调用的更多信息,请参阅 AWS CloudTrail

您可以从 AWS Lambda 控制台中选择一个函数并将其与 Amazon S3 存储桶中的通知关联起来。或者,您可以使用 Amazon S3 控制台并配置存储桶的通知以发送到您的 AWS Lambda 函数。还可通过 AWS 开发工具包和 CLI 实现这一功能。
通过将 Lambda 函数订阅到与 DynamoDB 表格相关联的 DynamoDB 流,您可以对 DynamoDB 表格更新触发 Lambda 函数。您可以使用 Amazon DynamoDB 控制台、AWS Lambda 控制台或 Lambda 的 registerEventSource API 将 DynamoDB 流与 Lambda 函数关联起来。
您可以从 AWS Lambda 控制台中选择一个 Lambda 函数并将其与属于相同账户的 Amazon Kinesis 流进行关联。还可通过 AWS 开发工具包和 CLI 实现这一功能。
发送到您的 AWS Lambda 函数的 Amazon Kinesis 和 DynamoDB 流记录将根据分片进行严格序列化。这意味着,如果您将两个记录放在同一个分片中,则 Lambda 保证将首先通过第一条记录来调用您的 Lambda 函数,然后再通过第二条记录来调用。如果第一条记录的调用超时,或者遇到任何其他错误,则 Lambda 将重试直至其成功(或者记录达到其 24 小时过期时间),然后才会对下一条记录采取操作。无法保证不同分片之间记录的排序,并且每个分片的处理是平行进行的。

AWS Lambda 允许您在短时间内(最多不超过 15 分钟),在单个逻辑分区(如一个分片)上对 Amazon Kinesis 或 Amazon DynamoDB Streams 中的数据执行基于时间的聚合(如计数、最大值、总和、平均值等)。这使您可以选择为基于事件的应用程序轻松设置简单的分析,而不会增加架构的复杂性,因为您的业务和分析逻辑可以位于同一个函数中。Lambda 允许根据事件时间戳,在最多 15 分钟的滚动窗口内进行聚合。Amazon Kinesis Data Analytics 允许您构建更复杂的分析应用程序,以支持灵活的处理选择和强大的容错能力,只需进行一次精确的处理,而不会重复,并且可以跨多个逻辑分区对整个数据流执行分析。借助 KDA,您可以使用事件时间或处理时间分析多种类型的聚合窗口(滚动窗口、交错窗口、滑动窗口、会话窗口)中的数据。
 

  AWS Lambda Amazon KDA
滚动窗口
交错窗口
滑动窗口
会话窗口
丰富
联合输入表和参考表
拆分输入流
一次处理
最大时间窗口 15 分钟 没有限制
聚合范围 分区/分片
时间语义 事件时间 事件时间、处理时间
您可以从 AWS Lambda 控制台中选择一个 Lambda 函数并将其与 Amazon SNS 主题进行关联。还可通过 AWS 开发工具包和 CLI 实现这一功能。
在 Amazon SES 控制台中,您可以设置接收规则,以使 Amazon SES 将消息交付到 AWS Lambda 函数。还可通过 AWS 软件开发工具包和 CLI 实现这一功能。

首先应配置警报,使其发送 Amazon SNS 通知。然后从 AWS Lambda 控制台中选择一个 Lambda 函数并将其与 Amazon SNS 主题进行关联。请参阅 Amazon CloudWatch 开发人员指南,了解有关设置 Amazon CloudWatch 警报的更多信息。

您可以从 AWS Lambda 控制台中选择一个函数,当与 Amazon Cognito 身份池关联的任何数据集进行同步时,触发这个函数。还可通过 AWS 开发工具包和 CLI 实现这一功能。请访问 Amazon Cognito,了解关于使用 Amazon Cognito 在用户设备间共享和同步数据的更多信息。

您可以通过 AWS Lambda 的调用 API 使用自定义事件调用 Lambda 函数。只有该函数的所有者或获得该所有者授权的另一个 AWS 账户才能调用该函数。请访问《Lambda 开发人员指南》了解更多信息。

AWS Lambda 经过专门设计,可在数毫秒内处理事件。当 Lambda 函数创建、更新后,或如果它最近未被使用,延迟都将立即升高。

上传需要 AWS Lambda 执行的代码,然后使用 AWS 移动软件开发工具包中的 AWS Lambda 软件开发工具包从移动应用程序中对其进行调用。您可以进行直接(同步)调用来检索或实时查看数据,也可以进行异步调用。您还可以使用 Amazon API Gateway 定义自定义 API,并通过兼容 REST 的任何客户端调用您的 Lambda 函数。要了解有关 AWS Mobile SDK 的更多信息,请访问 AWS Mobile SDK 页面。要了解有关 Amazon API Gateway 的更多信息,请访问 Amazon API Gateway 页面。

通过使用 Amazon API Gateway 定义自定义的 RESTful API,您可以通过 HTTPS 调用 Lambda 函数。这为您的函数提供了终端节点,这些函数可以响应 GET、PUT 和 POST 等 REST 调用。了解有关通过 Amazon API Gateway 使用 AWS Lambda 的更多信息
当通过 AWS 移动软件开发工具包进行调用时,AWS Lambda 函数能自动通过“context”对象获得发起调用的设备和应用程序的深入洞见。
当应用程序使用 Amazon Cognito 身份时,最终用户可以使用各种公共登录供应商(包括 Amazon、Facebook、Google)及其他 OpenID Connect 兼容服务来对其进行验证。之后用户身份会自动加密并以 Amazon Cognito id 的形式呈送给 Lambda 函数,同时允许其访问 Amazon Cognito 中的用户数据,或作为密钥储存和检索 Amazon DynamoDB 或其他 web 服务中的数据。
AWS Lambda 与 Alexa 技能套件集成,后者是一个自助 API、工具、文档和代码示例集合,让您能够为 Alexa 轻松创建以语音为主的能力(或“技能”)。您只需为要创建的新 Alexa 技能上传 Lambda 函数代码,AWS Lambda 将完成剩余工作,包括执行代码以响应 Alexa 语音交互,并代表您自动管理计算资源。有关更多详细信息,请阅读 Alexa Skills Kit 文档。
对于 Amazon S3 存储桶通知和自定义事件,AWS Lambda 会在您的代码发生错误条件或您超出服务或资源限制时尝试执行您的函数三次。对于 AWS Lambda 代您轮询的有序事件源,如 Amazon DynamoDB 流和 Amazon Kinesis Streams,Lambda 将在发生开发人员代码错误时继续尝试执行,直到该数据过期为止。您可以通过 Amazon Kinesis 和 Amazon DynamoDB 控制台以及 AWS Lambda 为您的函数生成的 Amazon CloudWatch 指标监控进展情况。您还可以根据出错率或执行节流的频率来设置 Amazon CloudWatch 警报。

使用 AWS Lambda 构建应用程序

基于 Lambda 的应用程序(也称为无服务器应用程序)由通过事件触发的函数组成。典型的无服务器应用程序包含一个或多个通过事件(如向 Amazon S3 上传对象、Amazon SNS 通知或 API 操作)触发的函数。这些函数既可独立运行,也能利用其他资源(如 DynamoDB 表或 Amazon S3 存储桶)。最基本的无服务器应用程序仅包含一个函数。
您可以使用 AWS 无服务器应用程序模型 (AWS SAM) 部署和管理无服务器应用程序。AWS SAM 是一项规范,其中规定了在 AWS 上表达无服务器应用程序的规则。该规范当前与 AWS CloudFormation 使用的语法相同,因此本身就在 AWS CloudFormation 中作为一组资源类型(被称作“无服务器资源”)受支持。得力于这些资源,AWS 客户能够更轻松地使用 CloudFormation 通过现有 CloudFormation API 配置和部署无服务器应用程序。

您可以使用 AWS Serverless Application Repository 从 AWS 社区的开发人员、公司和合作伙伴发布的无服务器应用程序集合中进行选择。找到应用程序后,您可以直接从 Lambda 控制台配置和部署该应用程序。

您可以使用 AWS CodePipeline 和 AWS CodeDeploy 自动执行无服务器应用程序的发布过程。CodePipeline 是一项持续交付服务,借助该服务,您能够为发布无服务器应用程序所需的步骤构建模型、使之可视化并自动执行这些步骤。CodeDeploy 为基于 Lambda 的应用程序提供了部署自动化引擎。您可以使用 CodeDeploy 根据既定最佳实践方法 (如 Canary 和线性部署) 编排部署,帮助您建立必要的防护以验证新部署的代码是否安全、稳定并已经准备好完全发布到生产环境。
 

要了解有关无服务器 CI/CD 的更多信息,请参阅我们的文档

首先,请访问 AWS Lambda 控制台,并下载我们的蓝图之一。您下载的文件将包含一份 AWS SAM 文件(定义了您应用程序中的 AWS 资源)和一份 .ZIP 文件(包含您函数的代码)。然后,您可以使用 AWS CloudFormation 命令打包和部署刚下载的无服务器应用程序。有关更多详细信息,请访问我们的文档

您可以使用 AWS Step Functions 以特定顺序来协调一系列 AWS Lambda 函数。您可以按顺序调用多个 Lambda 函数,然后将一个函数的输出传递到另一个函数,也可以进行并行调用,Step Functions 将在执行期间为您保持状态。

您可以启用 Lambda 函数利用 AWS X-Ray 进行跟踪的功能,方式为将 X-Ray 的权限添加到 Lambda 函数的执行角色,然后将函数的“跟踪模式”更改为“激活”。 针对 Lambda 函数启用 X-Ray 之后,AWS Lambda 会将调用函数产生的 Lambda 服务开销方面的跟踪信息发送到 X-Ray。这样,您就能了解 Lambda 服务开销、函数启动时间和函数执行时间等信息。此外,您还可以将 X-Ray 开发工具包纳入 Lambda 部署程序包中,以便创建自己的跟踪段、为跟踪添加注释或者查看从 Lambda 函数进行的下游调用的跟踪段。X-Ray 开发工具包目前支持 Node.js 和 Java。请访问对基于 Lambda 的应用程序进行故障排除了解更多信息。我们会按 AWS X-Ray 的费率收取费用。

符合。您可以构建高度可扩展、安全、基于 Lambda 的无服务器应用程序,这些应用程序使用 Amazon RDS 代理(一种高度可用的数据库代理)连接到关系数据库,该代理可管理与关系数据库的数千个并发连接。当前,RDS 代理支持 MySQL 和 Aurora 数据库。您可以通过 Amazon RDS 控制台或 AWS Lambda 控制台开始使用 RDS 代理。使用 RDS 代理中完全托管的连接池的无服务器应用程序将根据 RDS 代理定价进行计费。

该规范在 Apache 2.0 下是开源性质的,允许您及他人采用构建、部署、监控和管理工具以及通过商业版许可证将 AWS SAM 融合到这些工具中。您可以在此处访问 GitHub 上的 AWS SAM 存储库。

容器映像支持

AWS Lambda 现在让您能够将函数打包并部署为容器映射。客户可以利用容器工具的灵活性和熟悉度,以及 AWS Lambda 的敏捷性和操作简单性来构建应用程序。
您可以从 AWS 提供的 Lambda 基本映像开始,也可以使用首选的社区或私有企业映像之一。然后,只需使用 Docker CLI 生成映像,上传到 Amazon ECR,再使用所有熟悉的 Lambda 接口和工具(例如 AWS 管理控制台、AWS CLI、AWS SDK、AWS SAM 和 AWS CloudFormation)创建函数。
除了 Lambda 提供的映像外,您还可以将第三方 Linux 基础映像(如 Alpine 或 Debian)部署到 Lambda。AWS Lambda 将支持基于以下映像清单格式的所有映像:Docker Image Manifest V2 Schema 2(与 Docker 1.10 及更高版本一起使用)或 Open Container Initiative (OCI) Spec(v1.0 及更高版本)。Lambda 支持最大 10GB 的映像。
AWS Lambda 提供了客户可以扩展的各种基础映像,客户还可以使用其首选的基于 Linux 的映像,大小不超过 10GB。
您可以使用任何容器工具,只要它支持以下容器映像清单格式之一:Docker Image Manifest V2 Schema 2(与 Docker 1.10 及更高版本一起使用)或 Open Container Initiative (OCI) Specifications(v1.0 及更高版本)。例如,您可以使用本机容器工具(即 docker run、docker compose、Buildah 和 Packer)将您的函数定义为容器映像并部署到 Lambda。
除 Lambda 层和代码签名外,所有现有的 AWS Lambda 功能都可以与部署为容器映像的函数一起使用。部署后,AWS Lambda 会将映像视为不可变。客户可以在构建过程中使用容器层来包含依赖项。
目前不提供。您的映像一旦部署到 AWS Lambda,将是不可更改的。该服务不会对映像进行修补或更新。但是,AWS Lambda 将为所有基于 Lambda 托管环境的受支持运行时发布精选基本映像。这些发布的映像将与 AWS Lambda 托管运行时的更新一起进行修补和更新。您可以从 DockerHub 或 Amazon ECR Public 中提取并使用最新的基本映像,重新构建您的容器映像,并通过 Amazon ECR 部署到 AWS Lambda。这样,您可以在将映像部署到生产中之前,构建和测试更新的映像和运行时系统

使用 ZIP 存档创建的函数与使用容器映像创建的函数之间有三个主要区别:

  1. 使用 ZIP 存档创建的函数解压缩后的最大代码包大小为 250 MB,而使用容器映像创建的函数的最大映像大小为 10 GB。 
  2. Lambda 使用 Amazon ECR 作为定义为容器映像的函数的底层代码存储,因此当底层映像从 ECR 中删除时,函数可能无法调用。 
  3. ZIP 函数会自动打补丁,以获得最新的运行时安全性和漏洞修复。定义为容器映像的函数是不可更改的,客户要对其函数中打包的组件负责。客户可以利用 AWS 提供的基础映像,AWS 会使用最新可用的补丁定期更新这些映像,以确保安全性和进行漏洞修复。
没有 - AWS Lambda 确保打包为容器映像的函数的性能配置文件与打包为 ZIP 存档的函数相同,包括通常亚秒级的启动时间。

将函数打包为容器映像并部署到 AWS Lambda 中无需额外付费。当您调用您部署为容器映像的函数时,您需要为请求和执行时间支付常规价格。要了解更多信息,请访问 AWS Lambda 定价。 在 Amazon ECR 中存储容器映像存储将按标准 ECR 价格收取费用。要了解更多信息,请访问 Amazon ECR 定价

Lambda Runtime Interface Emulator 是 Lambda Runtime API 的代理,它允许客户在本地测试打包为容器映像的 Lambda 函数。它是一个轻量级的 Web 服务器,可以将 HTTP 请求转换为 JSON 事件,并模拟 Lambda Runtime API。它允许您使用熟悉的工具,例如 cURL 和 Docker CLI(当测试打包为容器映像的函数时),在本地测试您的函数。它还简化了在其他计算服务上运行应用程序的过程。您可以在容器映像中包括 Lambda Runtime Interface Emulator,使其以原生方式接受 HTTP 请求,而不是部署到 Lambda 所需的 JSON 事件。该组件不会模拟 Lambda 的协调器或安全和身份验证配置。Runtime Interface Emulator 在 GitHub 上开源。在本地计算机上下载并安装 Runtime Interface Emulator,即可开始使用。

正在运行的 Lambda 服务中的 Lambda Runtime API 接受 JSON 事件并返回响应。Lambda Runtime Interface Emulator 允许打包成容器映像的函数在本地测试期间使用 cURL 等工具接受 HTTP 请求,并通过相同的接口在本地将它们呈现到函数中。它允许您使用 docker run 或 docker-compose up 命令在本地测试您的 lambda 应用程序。
您可以使用该模拟器来测试您的函数代码是否与 Lambda 环境兼容,是否成功运行并提供预期的输出。例如,您可以模拟来自不同事件源的测试事件。您还可以使用它根据 Lambda Extensions API 测试容器映像中内置的扩展和代理。

客户可以将 Runtime Interface Emulator 添加为容器映像的接入点,也可以将其打包为 Sidecar,以确保容器映像现在接受 HTTP 请求而不是 JSON 事件。这简化了在其他计算服务上运行其容器映像所需的更改。客户将负责确保他们遵循所选环境的所有安全性、性能和并发最佳实践。RIE 已预先打包到 AWS Lambda 提供的映像中,并在 AWS SAM CLI 中默认可用。基础映像提供商可以使用文档为其基础映像提供相同的体验。

如果满足以下要求,则可以将容器化应用程序部署到 AWS Lambda:

  1. 容器映像必须实施 Lambda 运行时 API。我们对一组软件包(运行时界面客户端 (RIC))进行了开源,这些软件包实施 Lambda 运行时 API,让您可以无缝扩展您的首选基础映像,以与 Lambda 兼容。
  2. 容器映像必须能够在只读文件系统上运行。您的函数代码可以访问 512 MB 的可写/tmp 目录存储。如果使用的映像需要可写的根目录,请将其配置为写入 /tmp 目录。
  3. 默认的 Lambda 用户可以读取执行函数代码所需的文件。Lambda 定义了具有最低权限的默认 Linux 用户,该用户遵循安全最佳实践。您需要验证您的应用程序代码不依赖于其他 Linux 用户限制执行的文件。
  4. 它是基于 Linux 的容器映像。

AWS Lambda SnapStart

适用于 Java 函数的 AWS Lambda SnapStart 可使函数启动性能提高多达 10 倍。对于按需函数,初始化阶段(指 AWS Lambda 加载函数代码并初始化外部依赖项的阶段)是导致启动延迟的最大贡献因素,并且会在第一次调用时发生。使用 Lambda SnapStart 后,Lambda 在发布函数版本时会提前初始化一次性初始化函数代码,而不是在首次调用函数时才初始化。然后,Lambda 会拍摄快照并缓存初始化执行环境的内存和磁盘状态。当您调用函数时,并且随着函数纵向扩展时,Lambda 会从缓存快照恢复函数,而不是从头初始化函数。

Lambda SnapStart 是一种简单的函数级配置功能,可以使用 Lambda API、AWS 管理控制台、AWS 命令行界面 (CLI)、AWS SDK、AWS 云开发工具包(CDK)、AWS CloudFormation 和 AWS 无服务器应用程序模型 (SAM) 为新的和现有的 Java 功能进行配置。当您配置 Lambda SnapStart 时,此后发布的每个函数版本都将受益于 Lambda SnapStart 带来的启动性能改进。要了解有关 Lambda SnapStart 的更多信息,请参阅此文档

Lambda SnapStart 是一种性能优化,通过减少一次性初始化代码执行过程中产生的可变延迟,帮助您将 Java 函数的启动时间提速最高 10 倍。Lambda SnapStart 可在应用程序或客户的所有函数中广泛运作,无额外费用。当客户使用 Lambda SnapStart 发布函数版本时,函数的代码会提前初始化,而不是在第一次调用时初始化。Lambda 随后会对初始化的执行环境拍摄快照,并将其保存在分层缓存中,以实现低延迟访问。当首先调用函数,然后扩展函数时,Lambda 会从缓存快照恢复函数,而不是从头开始初始化,从而降低启动延迟。虽然 Lambda SnapStart 可以减少启动延迟,但这是一种尽力而为的优化,并不能保证消除冷启动。如果您的应用程序有严格的延迟要求,并且需要两位数毫秒的启动时间,我们建议您使用 PC。

Lambda SnapStart 支持 Java 11 运行时。未来版本的 Java 在发布后也将受到支持。有关 Lambda 支持的所有运行时,请参阅 Lambda 运行时文档

不可以。Lambda SnapStart 和 PC 不能在同一函数上同时启用。

符合。您可以配置 Lambda SnapStart 函数来访问虚拟私有云(VPC)中的资源。有关如何使用 VPC 配置函数的更多信息,请参阅 Lambda 文档

不可以。您目前只能为 x86 架构上运行的函数配置 Lambda SnapStart。
不可以。您目前无法使用 Amazon EFS 启用 Lambda SnapStart。
不可能。您目前不可以使用更大的超过 512 MB 的短暂存储 (/tmp) 启用 Lambda SnapStart。

符合。如果您认为您的代码状态是唯一的,那么您需要评估代码对快照操作(如克隆和恢复)的恢复能力。要了解有关 Lambda SnapStart 唯一性注意事项的更多信息,请参阅有关了解使用 Lambda SnapStart 的 VM 快照唯一性的文档博客

符合。您可以在创建快照(设置检查点)之前和使用运行时挂钩恢复快照之后实施自己的软件逻辑。要了解更多信息,请参阅 Lambda SnapStart 文档

不会。启用 Lambda SnapStart 没有额外的成本。我们将根据当前的 Lambda 定价以及您函数的请求数量和执行代码的持续时间向您收费。持续时间收费适用于在函数和运行时挂钩的处理程序中运行的代码以及在处理程序外部声明的初始化代码。请注意,AWS Lambda 可能会定期使用安全补丁回收执行环境,并重新运行初始化代码。有关更多详细信息,请参阅 Lambda 编程模型文档

使用 Lambda SnapStart 后,只要发布的版本继续接收调用,Lambda 就会为最后三个发布的函数版本保留初始化执行环境的快照。如果与已发布的函数版本关联的快照保持非活动状态超过 14 天,则该快照将过期。

快照默认使用 Lambda 服务拥有和管理的客户唯一的 AWS Key Management Service (KMS) 密钥进行加密。客户还可以使用客户拥有和管理的 KMS 密钥加密快照。

Lambda SnapStart 允许的最大初始化持续时间将与您为函数配置的执行超时持续时间相一致。函数的最大可配置执行超时限制为 15 分钟。

预置并发

预配置并发使您能够更好地控制无服务器应用程序的性能。启用后,预配置并发将使函数保持初始化状态,并准备好在两位数毫秒内进行响应。

您可以通过 AWS 管理控制台、Lambda API、AWS CLI 和 AWS CloudFormation 在函数上配置并发。利用预配置并发功能的最简单方法是使用 AWS Auto Scaling。您可以使用 Application Auto Scaling 来配置计划,或者让 Auto Scaling 随着需求的变化自动实时调整预配置并发量。有关预配置并发的更多信息,请参阅文档

您无需对代码进行任何更改即可使用预配置并发。它可以与所有现有函数和运行时无缝地协同工作。使用预配置并发时,Lambda 的调用和执行模型没有任何变化。

预配置并发添加了“预配置并发”的定价维度,用于使函数保持初始化状态。启用后,您需要为配置的并发量以及配置所用的时间付费。如果在配置了预配置并发的情况下执行函数,您还需要为请求和执行持续时间付费。要了解有关预配置并发定价的更多信息,请参阅 AWS Lambda 定价

预配置并发是构建延迟敏感型应用程序(例如 Web 或移动后端、同步调用的 API 和交互式微服务)的理想选择。您可以根据应用程序的独特需求轻松配置适当的并发量。您可以在需求量高时增加并发量,或在需求减少时降低并发量,或者完全关闭它。
如果函数的并发达到配置的并发量,则该函数的后续调用将具有常规 Lambda 函数的延迟和缩放特性。您可以将函数限制为仅扩展到配置的并发量。这样做可以防止函数超出配置的并发量。当需求超过预期数量时,此机制可以防止应用程序发生意外变化。

由 Graviton 2 处理器提供支持的 AWS Lambda 函数

AWS Lambda 能让您在 x86 架构或 Arm 架构的处理器上运行您的函数。AWS Graviton2 处理器由 Amazon Web Services 使用 64 位 Arm Neoverse 内核定制而成,为您的云工作负载提供更好的性价比。客户同样能够获得 AWS Lambda 所带来的益处,例如在无需预置或管理服务器的情况下运行代码、弹性伸缩、高可用性,以及按实际用量支付资源费用。
由 Graviton2 提供支持的 AWS Lambda 采用由 AWS 设计的 Arm 处理器架构,致力于性价比提升 34%(相较于在 x86 处理器上运行的函数),并适用于多种无服务器工作负载,例如 Web 和移动后端、数据以及流式传输处理。Graviton2 函数拥有更低的延迟、性价比提升高达 19%、成本可降低 20%,且拥有 AWS 中当前最高的能效,能够为任务关键型无服务器应用程序提供支持。客户能够配置现有及新函数,以搭配 Graviton2 处理器。他们能够将在 Graviton2 上运行的函数部署为 zip 格式文件或容器镜像。
您可以通过将函数的架构标志设置为“arm64”,从而借助 AWS 管理控制台、AWS Lambda API、AWS CLI 和 AWS CloudFormation 来配置函数,使其在 Graviton2 上运行。
基于 x86 的函数与基于 Arm 的函数操作之间没有区别。只需将您的代码通过 AWS 管理控制台、zip 格式文件或容器镜像上载,随后 AWS Lambda 将在触发时自动运行您的代码,而无需您进行预置或管理基础设施。
应用程序可以同时包含在两种架构上运行的函数。AWS Lambda 使您可以更换函数当前版本的架构(“x86_64”或“arm64”)。当您创建了函数的特定版本后,架构将无法更改。

Python、Java 及 Node 等解释语言通常不需要重新编译,除非您的代码参考库使用的架构包含特别组件。在这种情况下,您需要针对 arm64 提供库。有关更多详细信息,请参阅 AWS Graviton 入门页面。非解释语言将需要您编译代码以适用于 arm64。但更多的现代编译者将生成适用于 arm64 的编译后代码,您需要将其部署到基于 arm 的环境进行测试。要了解有关使用 Graviton2 支持的 Lambda 函数的详情,请参阅文档

不支持。每个函数版本只能使用单一容器镜像。
可以。您可以针对“x86_64”或“arm64”可兼容架构创建层及扩展。适用于函数与层的默认架构为“x86_64”。

在启动时,客户可以使用 Python、Node.js、Java、Ruby、Net Core、Custom Runtime (provided.al2) 和 OCI Base 镜像。要了解更多信息,请参阅 AWS Lambda 运行时系统

AWS Graviton2 处理器支持的 AWS Lambda 函数相较基于 x86 的 Lambda 函数价格低 20%。Lambda 免费套餐适用于由基于 x86 和 Arm 架构支持的 AWS Lambda 函数。

需要根据工作负载的情况具体分析,我们建议客户先行测试自己的函数,以确定可能带来的性价比提升。为此,我们建议使用 AWS Lambda Power Tuning 工具。我们建议先从 Web 和移动后端、数据以及流式传输处理开始,以测试您的工作负载,了解是否存在提升性价比的可能。

Amazon EFS for AWS Lambda

借助 Amazon Elastic File System (Amazon EFS) for AWS Lambda,客户可以使用完全托管的弹性 NFS 文件系统以几乎任意规模安全地读取、写入持久和存储大量数据,该系统可以按需扩展,而无需进行预置或容量管理。此前,开发人员在其函数中添加了代码,将数据从 S3 或数据库下载到本地临时存储,限值为 512MB。使用 EFS for Lambda,开发人员不需要编写代码就可以将数据下载到临时存储中进行处理。

开发人员可以使用控制台、CLI 或 SDK 通过 EFS 接入点轻松地将现有 EFS 文件系统连接到 Lambda 函数。首次调用该函数时,文件系统将自动安装并可供函数代码使用。有关更多信息,请参阅本文档。

可以。Amazon EFS 的安装目标与 VPC 中的子网相关。需要配置 AWS Lambda 函数才能访问该 VPC。
EFS for Lambda 非常适合于构建机器学习应用程序或加载大型参考文件或模型、处理或备份大量数据、托管 Web 内容或开发内部构建系统。客户还可以使用 EFS for Lambda 在有状态的微服务架构中、在 Step Functions 工作流中或在无服务器应用程序与基于实例或容器的应用程序之间共享文件时保持调用之间的状态。
可以。动态数据加密是按照行业标准传输层安全性 (TLS) 1.2 来加密 AWS Lambda 函数和 Amazon EFS 文件系统之间发送的数据。
客户可以预置 Amazon EFS 以加密静态数据。数据在静态时以透明的方式加密,在读取时以透明的方式解密,因此您无需修改应用程序。加密密钥由 AWS Key Management Service (KMS) 托管,无需构建和维护安全的密钥管理基础设施。

使用 Amazon EFS for AWS Lambda 不收取额外费用。客户为 AWS Lambda 和 Amazon EFS 支付标准价格。在同一可用区中使用 Lambda 和 EFS 时,不向客户收取数据传输费用。但是,如果他们使用 VPC 对等连接进行跨账户访问,则将产生数据传输费用。要了解更多信息,请参阅定价

不可以。每个 Lambda 函数将能够访问一个 EFS 文件系统。
可以。Amazon EFS 支持 Lambda 函数、ECS 和 Fargate 容器以及 EC2 实例。您可以共享同一文件系统,并使用 IAM 策略和访问点来控制有权访问的每个函数、容器或实例。 

Lambda 函数 URL

符合。您可以使用函数 URL、可使用浏览器、curl 及任何 HTTP 客户端调用的内置 HTTPS 终端节点配置 Lambda 函数。函数 URL 是开始构建 HTTPS 可访问函数的简单方法。

您可以通过 AWS 管理控制台、AWS Lambda API、AWS CLI、AWS CloudFormation 和 AWS Serverless Application Model 配置函数 URL。可以在函数的 $LATEST 非限定版本或任何函数别名上启用函数 URL。要了解有关配置函数 URL 的更多信息,请参阅文档

默认情况下,Lambda 函数 URL 受 IAM 授权保护。您可以选择禁用 IAM 授权以创建公有终端节点,或者如果您计划实施自定义授权作为函数业务逻辑的一部分。
您可以轻松从 Web 浏览器调用函数,方法是导航到 Lambda URL、使用 HTTP 库从客户端应用程序的代码或使用 curl 从命令行进行调用。

符合。可以在函数或函数别名上启用 Lambda 函数 URL。如果未指定别名,则默认情况下 URL 将指向 $LATEST。函数 URL 不能针对单独的函数版本。

函数 URL 目前不支持自定义域名。您可以将自定义域与函数 URL 一起使用,方法是通过创建 Amazon CloudFront 分配和 CNAME 来将自定义域映射到 CloudFront 分配名称。然后,将要路由到函数 URL 的 CloudFront 分配域名映射为源。
是,函数 URL 可用于调用 VPC 中的 Lambda 函数。

使用函数 URL 不产生任何额外费用。您只需支付 AWS Lambda 的标准价格。要了解更多信息,请参阅 AWS Lambda 定价

Lambda@Edge

使用 Lambda@Edge,您可以在全球的 AWS 站点运行代码,而无需预置或管理服务器,从而以最低的网络延迟响应最终用户。您只需将 Node.js 或 Python 代码上传到 AWS Lambda,然后配置要触发的函数,用于响应 Amazon CloudFront 请求(即,发出查看器请求、向原点转发请求或从原点接收到请求时以及刚好在响应最终用户之前)。当收到内容请求后,代码即可开始在全球的 AWS 站点执行,并按照全球的 CloudFront 请求量进行扩展。有关更多信息,请参阅我们的文档

要使用 Lambda@Edge,您仅需将代码上传到 AWS Lambda,然后关联要触发的函数版本,用于响应 Amazon CloudFront 请求。您的代码必须符合 Lambda@Edge 服务限制。目前,Lambda@Edge 支持使用 Node.js 和 Python 进行 CloudFront 事件的全局调用。有关更多信息,请参阅我们的文档

Lambda@Edge 针对最终查看器在全球范围内分布的延迟敏感型使用案例进行了优化。您可以在 CloudFront 边缘站点、函数和请求中查看制定决策所需的全部信息。这意味着,对于那些您需要决定如何基于用户特征(例如,位置、客户端设备等)提供内容的使用案例,您现在可以从距离用户较近的位置执行和处理,而无需重新路由到集中式服务器。

如果函数满足 Lambda@Edge 服务要求和限制,则可以将现有的 Lambda 函数与 CloudFront 事件关联,进行全局调用。有关如何更新函数属性的更多信息,请参阅此处

在响应以下 Amazon CloudFront 事件时,会自动触发您的函数:

  • 查看器请求 – 当 Internet 上的最终用户或设备向 CloudFront 发出 HTTP(S) 请求,且请求到达离该用户最近的边缘站点时,将触发此事件。
  • 查看者响应 – 当边缘站点处的 CloudFront 服务器已准备好响应发出请求的最终用户或设备时,将触发此事件。
  • 来源请求 – 当 CloudFront 边缘服务器尚未将所请求的对象置入其缓存,且查看器请求已准备好发送给后端来源 Web 服务器(如 Amazon EC2、Application Load Balancer 或 Amazon S3)时,将触发此事件。
  • 来源响应 – 当边缘站点处的 CloudFront 服务器收到后端来源 Web 服务器的响应时,将触发此事件。

区别在于 API Gateway 和 Lambda 是区域性服务。使用 Lambda@EdgeAmazon CloudFront,您可以根据最终查看器所在的位置跨多个 AWS 位置执行逻辑。

可扩展性和可用性

AWS Lambda 旨在通过复制和冗余来向服务本身和其操作的 Lambda 函数提供高可用性。二者皆无维护窗口期或计划停机时间。
符合。当您更新 Lambda 函数时,会有短暂的窗口期,通常不到 1 分钟,在这期间请求将由旧版本函数或新版本函数实现。

没有,AWS Lambda 采用的设计可以支持大量函数实例并行运行。但是,AWS Lambda 对每个区域的每个账户的并发执行次数具有默认安全限制(请访问此处了解有关默认安全限制数量的信息)。您还可以控制各个 AWS Lambda 函数的最大并发执行数量,并可以使用这项功能为关键函数保留一部分账户并发限制或限制下游资源流量速率。

如果您想提交提高并发执行限制数量的请求,则可以使用服务限额提交。

超过最大并发执行限制数量时,同步调用的 AWS Lambda 函数会返回一条节流错误信息(429 错误代码)。异步调用的 Lambda 函数能够承受一定范围内的流量突增,持续时间约为 15 至 30 分钟。一旦超过此限制,后续传入的事件将因达到限制而被拒绝。如果调用的 Lambda 函数是用于响应 Amazon S3 事件,则被 AWS Lambda 拒绝的事件可能被 S3 保留 24 小时并在此期间反复重试。Amazon Kinesis Streams 和 Amazon DynamoDB 流中的事件会反复重试,直到 Lambda 函数成功或数据过期。Amazon Kinesis 和 Amazon DynamoDB 流会将数据保留 24 小时。

默认的最大并发执行限制数量适用于账户级别。但是,您也可以对单个函数设置限制(请访问此处了解有关预留并发的信息)。

每个同步调用的 Lambda 函数可以以每 10 秒钟最多可同时执行 1000 次的速度进行扩展。虽然 Lambda 的扩展速率适用于大多数用例,但它特别适合那些流量突发可预测或不可预测的用例。例如,对于绑定 SLA 的数据处理,可预测且快速的扩展才能满足处理需求。同样,提供突发新闻文章或闪购活动可能会在短时间内带来不可预测的流量水平。Lambda 的扩展速率无需额外的配置或工具,即可为这类用例提供便利。此外,并发扩展限制是函数级限制,这意味着您账户中的每个函数都独立于其他函数进行扩展。

如遇故障,进行同步调用的 Lambda 函数会返回异常信息。异步调用的 Lambda 函数将至少重试 3 次。Amazon Kinesis Streams 和 Amazon DynamoDB 流中的事件会反复重试,直到 Lambda 函数成功或数据过期。Kinesis Streams 和 DynamoDB Streams 会至少保留数据 24 个小时。
您可以将 Amazon SQS 队列或 Amazon SNS 主题配置为您的死信队列。

当超过策略针对异步调用规定的重试次数时,您可以配置一个放置此事件的“死信队列”(DLQ);如果尚未配置 DLQ,此事件可能会被拒绝。当超过策略针对基于流的调用规定的重试次数时,数据可能已失效,因此已被拒绝。

安全性与访问控制

您可以使用 IAM 角色授予 Lambda 函数相应的权限,以访问其他资源。AWS Lambda 在执行您的 Lambda 函数的同时承担该角色,因此您可以对该服务可使用的 AWS 资源保持完整、安全的控制。请访问设置 AWS Lambda 了解有关角色的更多信息。

当您配置 Amazon S3 存储桶向 AWS Lambda 函数发送消息时,将创建一条资源策略规则用于权限授予。请访问 Lambda 开发人员指南,了解有关 Lambda 函数的资源策略和访问控制的更多信息。

对访问控制的管理通过 Lambda 函数的角色实现。分配给 Lambda 函数的角色同时决定了 AWS Lambda 可以代表其进行轮询的资源。请访问《Lambda 开发人员指南》了解更多信息。

您可以用 Lambda 函数的角色或队列本身的资源策略设置来进行访问控制。 如果两种方式同时存在,那么系统会应用限制性更高的权限设置。

您可以通过在函数配置中指定子网和安全组来启用 Lambda 函数对 VPC 中资源的访问。在默认配置下,配置为可访问特定 VPC 中资源的 Lambda 函数将无法访问互联网。要为这些功能授予互联网权限,请使用互联网网关。默认情况下,Lambda 函数通过 IPv4 与双堆栈 VPC 中的资源进行通信。您可以将函数配置为通过 IPv6 访问双栈 VPC 中的资源。有关使用 VPC 配置的 Lambda 函数的更多详细信息,请参阅使用 VPC 的 Lambda 私有联网

AWS Lambda 的代码签名提供了信任和完整性控件,使您可以验证只有来自经批准的开发人员的未经修改的代码才会部署在您的 Lambda 函数中。您可以使用完全托管代码签名服务 AWS Signer 对代码构件进行数字签名,并配置 Lambda 函数以在部署时验证签名。AWS Lambda 的代码签名目前仅适用于打包为 ZIP 存档的函数。

您可以通过 AWS Signer 控制台、Signer API、SAM CLI 或 AWS CLI 使用签名配置文件创建数字签名的代码构件。要了解更多信息,请参阅 AWS Signer 文档

您可以通过 AWS 管理控制台、Lambda API、AWS CLI、AWS CloudFormation 和 AWS SAM 创建代码签名配置来启用代码签名。代码签名配置可帮助您指定经批准的签名配置文件,并配置在签名检查失败时是警告还是拒绝部署。代码签名配置可以附加到单个 Lambda 函数,以启用代码签名功能。此类函数现在会在部署时开始验证签名。

AWS Lambda 可在部署时执行以下签名检查:

• 签名损坏 - 如果代码构件在签名后被更改,则会发生这种情况。
• 签名不匹配 - 如果代码构件由未经批准的签名配置文件签名,则会发生这种情况。
• 过期签名 - 如果签名超过了配置的有效期,则会发生这种情况。
• 撤销签名 - 如果签名配置文件拥有者撤销了签名作业,则会发生这种情况。

要了解更多信息,请参阅 AWS Lambda 文档

是,您可以通过将代码签名配置附加到函数中,为现有函数启用代码签名。您可以使用 AWS Lambda 控制台、Lambda API、AWS CLI、AWS CloudFormation 和 AWS SAM 进行此操作。

使用 AWS Lambda 的代码签名时,不需要额外的费用。您只需支付 AWS Lambda 的标准价格。要了解更多信息,请参阅定价

高级日志记录控制

为了在默认情况下为您提供简化和增强的日志记录体验,AWS Lambda 提供了高级日志记录控制,例如能够以 JSON 结构化格式原生捕获 Lambda 函数日志、在不进行任何代码更改的情况下控制 Lambda 函数日志的日志级别筛选,以及自定义 Lambda 将日志发送到的 Amazon CloudWatch 日志组。

您可以采用 JSON 结构化格式捕获 Lambda 函数日志,而不必使用自己的日志记录库。JSON 结构化日志使搜索、筛选和分析大量日志条目变得更加容易。您无需更改任何代码即可控制 Lambda 函数日志的日志级别筛选,这使您能够在调试和排查错误时选择 Lambda 函数所需的日志记录粒度级别,而无需筛选大量日志。您还可以设置 Lambda 将日志发送到哪个 Amazon CloudWatch 日志组,从而更轻松地将来自应用程序内多个函数的日志聚合到一处。然后,您可以在应用程序级别将安全、治理和保留策略应用于日志,而不是单独应用于每个功能。

您可以使用 AWS Lambda API、AWS Lambda 控制台、AWS CLI、AWS 无服务器应用程序模型(SAM)和 AWS CloudFormation 为 Lambda 函数指定高级日志记录控制。要了解更多信息,请访问高级日志记录控制的发布博文Lambda 开发人员指南

是的,您可以使用自己的日志记录库生成 JSON 结构化格式的 Lambda 日志。为了确保您的日志记录库与 Lambda 的原生 JSON 结构化日志记录功能无缝协作,Lambda 不会对您的函数生成的任何已进行 JSON 编码的日志进行双重编码。您还可以使用 Powertools for AWS Lambda 库以 JSON 结构化格式捕获 Lambda 日志。

在 Lambda 上使用高级日志记录控制不收取额外费用。您仍然需要为 Amazon CloudWatch Logs 摄取和存储的 Lambda 日志付费。有关日志定价详细信息,请参阅 CloudWatch 定价页面

以 Java 编写的 AWS Lambda 函数

您可以使用 Maven 或 Gradle 等标准工具编译 Lambda 函数。构建过程应模拟编译任何 Java 代码的同一构建过程,这取决于 AWS 开发工具包。在源文件上运行您的 Java 编译器工具并在类路径上包含 AWS 开发工具包 1.9 或更高版本,以延续依赖性。有关更多详细信息,请参阅我们的文档

Lambda 提供 openjdk 1.8 的 Amazon Linux 版本。

以 Node.js 编写的 AWS Lambda 函数

符合。您可以使用 NPM 资源包和自定义的资源包。单击此处了解更多信息。

符合。Lambda 的内建沙盒可以让您运行批处理(“shell”)脚本、其他语言运行时、实用程序例程和可执行文件。单击此处了解更多信息。

符合。您上传的 ZIP 文件可以包含任何静态连接的本机模块,动态连接的模块同样如此,动态模块用指向您的 Lambda 函数根目录的根路径编译。单击此处了解更多信息。

符合。您可以使用 Node.js 的 child_process 命令来执行您在函数中包含的二进制文件或任何向函数开放的 Amazon Linux 中的可执行文件。另外,还有多个打包命令行二进制代码的 NPM 程序包,如 node-ffmpeg。单击此处了解更多信息。

要部署以 Node.js 编写的 Lambda 函数,仅需将您的 Javascript 代码和依赖库打包为 ZIP。您可以从您的本地环境上传 ZIP,或指定 ZIP 文件所在的 Amazon S3 位置。有关更多详细信息,请参阅我们的文档

以 Python 编写的 AWS Lambda 函数

符合。您可以使用 pip 安装所需的任意 Python 程序包。

以 C# 编写的 AWS Lambda 函数

您可以使用 Visual Studio IDE 通过在“Solution Explorer”中选择“Publish to AWS Lambda”来创建 C# Lambda 函数。或者,您还可以在安装 [# Lambda CLI 工具补丁] 的 dotnet CLI 上直接运行“dotnet lambda publish”命令,这将会创建 C# 源代码的 ZIP、所有的 NuGet 依赖项以及您自己发布的 DLL 程序集,并使用运行时参数“dotnetcore1.0”自动将其上传到 AWS Lambda。

以 PowerShell 编写的 AWS Lambda 函数

PowerShell Lambda 部署包是一个 ZIP 文件,其中包含 PowerShell 脚本、PowerShell 脚本所需的 PowerShell 模块以及托管 PowerShell Core 所需的程序集。然后,您可以使用可从 PowerShell 库安装的 AWSLambdaPSCore PowerShell 模块来创建 PowerShell Lambda 部署包。

以 Go 编写的 AWS Lambda 函数

通过 AWS CLI 或 Lambda 控制台以 ZIP 文件的形式上传 Go 可执行项目并选择 go1.x 运行时。通过 Lambda,您可以使用 Go 的原生工具构建并打包代码。有关更多详细信息,请参阅我们的文档。 

以 Ruby 编写的 AWS Lambda 函数

要部署以 Ruby 编写的 Lambda 函数,请将您的 Ruby 代码和 Gem 打包为 ZIP。您可以从您的本地环境上传 ZIP,或指定 ZIP 文件所在的 Amazon S3 位置。

其他主题

您可以单击此处查看受支持的版本列表。

不能。AWS Lambda 向该服务的所有用户提供单一版本的操作系统和托管语言运行时。您可以在 Lambda 中使用您自己的语言运行时

AWS Lambda 与 AWS CloudTrail 集成。AWS CloudTrail 可以记录日志文件并将其提供给 Amazon S3 存储桶,用于说明账户的 API 使用情况。

您可以使用 Amazon Step Functions 来协调多个 Lambda 函数之间的调用。您可以按顺序调用多个 Lambda 函数,然后将一个函数的输出传递到另一个函数,也可以进行并行调用。请参阅我们的文档了解更多详细信息。

是,AWS Lambda 支持高级矢量扩展 2 (AVX2) 指令集。要了解有关如何针对此指令集编译应用程序代码以提高性能的更多信息,请访问《AWS Lambda 开发人员文档》。