AWS Lambda 常见问题
一般性问题
全部打开有关事件源的完整列表,请参阅我们的文档。
每个 AWS Lambda 函数都运行在其自己的隔离环境中,有其自己的资源和文件系统视图。AWS Lambda 使用与 Amazon EC2 相同的技术在基础设施和执行级别上提供安全性和隔离。 要了解更多信息,请访问文档。
AWS Lambda 在 Amazon S3 中存储代码并对其进行静态加密。AWS Lambda 在使用您的代码时执行额外的完整性检查。对于敏感信息(如数据库密码),我们建议您使用 AWS Key Management Service 进行客户端加密,并将生成的值作为加密文字存储在您的环境变量中。您需要在 AWS Lambda 函数代码中包含逻辑才能解密这些值。 要了解更多信息,请访问文档。
-
保持函数的无状态性可使 AWS Lambda 按需要尽可能多地启动函数副本,从而扩展到传入事件的速率。由于 AWS Lambda 的编程模式是无状态的,因此您的代码可以通过调用其他 Web 服务,如 Amazon S3 或 Amazon DynamoDB,来访问有状态的数据。
可以。使用 AWS Lambda 控制台、命令行界面或软件开发工具包,即可轻松创建和修改环境变量。要了解有关环境变量的更多信息,请参阅该文档。
对于敏感信息(如数据库密码),我们建议您使用 AWS Key Management Service 进行客户端加密,并将生成的值作为加密文字存储在您的环境变量中。您需要在 AWS Lambda 函数代码中包含逻辑才能解密这些值。
可以,您可以将任何代码(框架、软件开发工具包、库等)打包为 Lambda Layer,并在多个函数之间轻松进行管理和共享。
AWS Lambda 会通过 Amazon CloudWatch 报告实时指标,代您自动监控 Lambda 函数,指标包括请求总数、账户级别和函数级别并发使用情况、延迟、出错率和请求调用。通过 Amazon CloudWatch 控制台或 AWS Lambda 控制台,可以查看每一个 Lambda 函数的统计信息。您还可以在 Lambda 函数中调用第三方监控 API。
请访问排查 CloudWatch 指标问题了解更多信息。使用 Lambda 的内建指标会依照 AWS Lambda 的标准费率计费。
在 AWS Lambda 资源模型中,您可以选择用于函数的内存量,这会分配等比例的 CPU 计算能力和其他资源。例如,选择 256MB 的内存时,分配至您的 Lambda 函数的 CPU 功率约是请求 128MB 内存时的两倍,并且是选择 512MB 内存时的一半。要了解更多信息,请参阅我们的功能配置文档。
您可以将内存从 128MB 设置为 10240MB。
-
AWS Lambda 函数可以配置为每次执行最长运行 15 分钟。您可以将超时设置为 1 秒到 15 分钟之间的任何值。
AWS Lambda 按使用量收费。请参阅 AWS Lambda 定价页面,以了解详细信息。
可以。默认情况下,每个 AWS Lambda 函数拥有一个当前版本的代码。Lambda 函数客户端可调用特定的版本或获取最新的实施。请阅读我们有关 Lambda 函数版本控制的文档。
AWS Lambda 提供灵活的部署选项:将函数打包并部署为 .zip 文件存档,然后直接通过控制台、CLI 或 SDK 上传,或者将其部署为容器镜像。两种方法都提供相同的执行环境、可扩展性和操作简便性,让您能够灵活选择最适合您工作流程的方法。
使用 AWS Lambda 处理 AWS 事件
全部打开-
事件源是 AWS 服务或开发人员创建的应用程序,用于生成可触发 AWS Lambda 函数使其运行的事件。有些服务通过直接调用云函数(例如 Amazon S3)向 Lambda 发布这些事件。Lambda 也可以在未向 Lambda 发布事件的其他服务中轮询资源。例如,Lambda 可以从 Amazon Kinesis 流或 Amazon SQS 队列中轮询记录,然后针对获得的每条消息执行 Lambda 函数。通过登录到 Amazon S3 并使用 S3 桶通知,就可将 AWS CloudTrail 等其他很多服务用作触发 AWS Lambda 函数的事件源
您可以通过 AWS Lambda 的调用 API 使用自定义事件调用 Lambda 函数。只有该函数的所有者或获得该所有者授权的另一个 AWS 账户才能调用该函数。请访问《Lambda 开发人员指南》了解更多信息。
-
通过使用 Amazon API Gateway 定义自定义的 RESTful API,您可以通过 HTTPS 调用 Lambda 函数。这为您的函数提供了终端节点,这些函数可以响应 GET、PUT 和 POST 等 REST 调用。了解有关通过 Amazon API Gateway 使用 AWS Lambda 的更多信息。
AWS Lambda SnapStart
全部打开Lambda SnapStart 是一种简单的函数级配置功能,可以使用 Lambda API、AWS 管理控制台、AWS 命令行界面(CLI)、AWS SDK、AWS 云开发工具包(CDK)、AWS CloudFormation 和 AWS 无服务器应用程序模型(SAM)对新的和现有的函数进行配置。当您配置 Lambda SnapStart 时,此后发布的每个函数版本都将受益于 Lambda SnapStart 带来的启动性能改进。要了解有关 Lambda SnapStart 的更多信息,请参阅此文档。
Lambda SnapStart 是一种性能优化,通过减少一次性初始化代码执行过程中产生的可变延迟,帮助您将函数的启动时间提速。虽然 Lambda SnapStart 可以减少启动延迟,但这是一种尽力而为的优化,并不能保证消除冷启动。如果您的应用程序有严格的延迟要求,并且需要两位数毫秒的启动时间,我们建议您使用 PC。
Lambda SnapStart 支持多种运行时,包括 Java 11(及更高版本)、Python 3.12(及更高版本)和 .NET 8(及更高版本)。未来版本的运行时在发布后也将受到支持。有关 Lambda 支持的所有运行时,请参阅 Lambda 运行时文档。
-
不可以。Lambda SnapStart 和 PC 不能在同一函数上同时启用。
可以。您可以配置 Lambda SnapStart 函数来访问虚拟私有云(VPC)中的资源。有关如何使用 VPC 配置函数的更多信息,请参阅 Lambda 文档。
是的,您需要为函数版本处于活动状态期间的快照缓存付费,3 小时起付,之后按毫秒收费。价格取决于您为函数分配的内存量。每次 Lambda 通过恢复快照来恢复执行环境时,也会向您收费,具体价格取决于您为函数分配的内存量。要了解有关 SnapStart 定价的更多信息,请访问 AWS Lambda 定价。
SnapStart 定价不适用于受支持的 Java 托管运行时,该运行时只能缓存最多 14 天的快照。
预置并发
全部打开预配置并发使您能够更好地控制无服务器应用程序的性能。启用后,预配置并发将使函数保持初始化状态,并准备好在两位数毫秒内进行响应。
您可以通过 AWS 管理控制台、Lambda API、AWS CLI 和 AWS CloudFormation 在函数上配置并发。利用预配置并发功能的最简单方法是使用 AWS Auto Scaling。您可以使用 Application Auto Scaling 来配置计划,或者让 Auto Scaling 随着需求的变化自动实时调整预配置并发量。有关预配置并发的更多信息,请参阅文档。
预配置并发添加了“预配置并发”的定价维度,用于使函数保持初始化状态。启用后,您需要为配置的并发量以及配置所用的时间付费。如果在配置了预配置并发的情况下执行函数,您还需要为请求和执行持续时间付费。要了解有关预配置并发定价的更多信息,请参阅 AWS Lambda 定价。
-
预配置并发是构建延迟敏感型应用程序(例如 Web 或移动后端、同步调用的 API 和交互式微服务)的理想选择。您可以根据应用程序的独特需求轻松配置适当的并发量。您可以在需求量高时增加并发量,或在需求减少时降低并发量,或者完全关闭它。
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 事件关联,进行全局调用。有关如何更新函数属性的更多信息,请参阅此处。
可扩展性和可用性
全部打开-
AWS Lambda 旨在通过复制和冗余来向服务本身和其操作的 Lambda 函数提供高可用性。二者皆无维护窗口期或计划停机时间。
-
可以。当您更新 Lambda 函数时,会有一个短暂的时间段,通常不到 1 分钟,在这期间请求将由旧版本函数或新版本函数实现。
超过最大并发执行限制数量时,同步调用的 AWS Lambda 函数会返回一条节流错误信息(429 错误代码)。异步调用的 Lambda 函数能够承受一定范围内的流量突增,持续时间约为 15 至 30 分钟。一旦超过此限制,后续传入的事件将因达到限制而被拒绝。如果调用的 Lambda 函数是用于响应 Amazon S3 事件,则被 AWS Lambda 拒绝的事件可能被 S3 保留 24 小时并在此期间反复重试。Amazon Kinesis Streams 和 Amazon DynamoDB 流中的事件会反复重试,直到 Lambda 函数成功或数据过期。Amazon Kinesis 和 Amazon DynamoDB Streams 会将数据保留 24 小时。
默认的最大并发执行限制数量适用于账户级别。但是,您也可以对单个函数设置限制(请访问此处了解有关预留并发的信息)。
每个同步调用的 Lambda 函数可以以每 10 秒钟最多可同时执行 1000 次的速度进行扩展。虽然 Lambda 的扩展速率适用于大多数用例,但它特别适合那些流量突发可预测或不可预测的用例。例如,对于绑定 SLA 的数据处理,可预测且快速的扩展才能满足处理需求。同样,提供突发新闻文章或闪购活动可能会在短时间内带来不可预测的流量水平。Lambda 的扩展速率无需额外的配置或工具,即可为这类用例提供便利。此外,并发扩展限制是函数级限制,这意味着您账户中的每个函数都独立于其他函数进行扩展。
-
如遇故障,进行同步调用的 Lambda 函数会返回异常信息。异步调用的 Lambda 函数将至少重试 3 次。Amazon Kinesis Streams 和 Amazon DynamoDB 流中的事件会反复重试,直到 Lambda 函数成功或数据过期。Kinesis 和 DynamoDB 流会至少保留数据 24 个小时。
当超过策略针对异步调用规定的重试次数时,您可以配置一个放置此事件的“死信队列”(DLQ);如果尚未配置 DLQ,此事件可能会被拒绝。当超过策略针对基于流的调用规定的重试次数时,数据可能已失效,因此已被拒绝。
-
您可以将 Amazon SQS 队列或 Amazon SNS 主题配置为您的死信队列。
安全性与访问控制
全部打开您可以使用 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 定价页面。
CloudWatch Application Signals 是一款应用程序性能监控(APM)解决方案,它使开发人员和操作员能够轻松监控使用 Lambda 构建的无服务器应用程序的运行状况和性能。Application Signals 提供了预先构建的标准化控制面板,用来显示关键应用程序指标、相关轨迹以及 Lambda 函数与其依赖项的交互,无需开发人员执行任何手动检测或代码更改。
CloudWatch Logs Live Tail 是一项交互式日志流式传输和分析功能,您可以通过它实时查看日志,从而更轻松地开发 Lambda 函数和对其进行故障排查。这样,开发人员就可以快速、实时测试和验证代码或配置变更,从而加快使用 Lambda 构建应用程序时的“创作-测试-部署”周期(也称为“内部开发循环”)。Live Tail 体验还使操作员和 DevOps 团队能够更高效地检测和调试 Lambda 函数代码中的故障和关键错误,因此缩短了排查 Lambda 函数错误时的平均恢复时间(MTTR)。
AWS Lambda 耐用函数
全部打开如果您希望在 Lambda 熟悉的编程模型中构建逻辑,并支持本地测试、IDE 集成以及您偏好的编程语言,请使用 Lambda 耐用函数。当您需要可视化工作流程设计、跨团队可见性、220 多种原生服务集成或零维护的基础设施时,请使用 AWS Step Functions。许多应用程序通过将两者结合使用而受益匪浅。
AWS Lambda 耐用函数目前支持 JavaScript、TypeScript、Python 和 Java。详细了解受支持的运行时。
要了解最新的可用性,请访问按区域探索 AWS 功能页面。
可以。虽然每次调用的超时仍为 15 分钟,但 Lambda 耐用函数可以通过定时器、回调和轮询条件等等待功能,在多次调用之间暂停和恢复。当您异步调用耐用函数时,其执行超时最长可达一年,从而支持诸如人工审批工作流程、定时提醒以及多日处理管道等使用案例。对于按需函数,在暂停期间不收取计算费用。
执行超时(最长 1 年)决定执行操作的持续时间。保留期(最长 90 天)决定在执行进入终端状态后,历史记录和检查点数据的保留时间。保留不会影响正在运行的执行。请参阅耐用函数配置。
您可以将每个工作单元封装在一个支持自动重试的步骤中。如果某个步骤在重试后仍失败,您的处理程序代码可以捕获该错误并执行补救措施,例如退款或取消预订。由于每个已完成的步骤(包括补救措施)都有检查点,因此在重试时,已成功完成的工作不会被重复执行。此模式可帮助您构建可靠的多步骤流程(例如订单履行或支付工作流程),而无需编写自定义重试和状态跟踪逻辑。
执行状态存储在完全托管的内部状态存储中。每个检查点操作(例如步骤或回调)最多可存储 256KB 的数据。此限制适用于该操作返回的数据。在单次操作中处理的数据(例如读取和写入大型 S3 对象)不计入此限制。如果某个操作需要返回较大的结果,则可以在 SDK 中配置自定义序列化器,将有效载荷卸载到 Amazon S3 或 Amazon DynamoDB,并仅通过检查点传递引用。
Lambda 耐用函数与标准 Lambda 函数使用相同的账户级并发池。在等待期间,并发槽会被释放,因此成千上万的执行可以在不占用并发资源的情况下进行等待。了解有关 AWS Lambda 配额的更多信息。
您可以使用支持的编程语言的耐用执行 SDK,在本地测试耐用函数,而无需使用 AWS 凭证。AWS SAM CLI 还支持本地调用、回调以及耐用执行管理,从而直接在部署前进行开发和调试。了解有关测试耐用函数的更多信息。