Lambda 执行
当 Lambda 代表您运行函数时,它将管理运行代码所需的底层系统的预置和配置工作。这使您的开发人员可以专注于业务逻辑和编写代码,而不是管理底层系统。
Lambda 服务分为控制层面 和数据层面。每个层面在服务中有不同的用途。控制层面提供管理 API(例如,CreateFunction
、UpdateFunctionCode
、PublishLayerVersion
等等),并管理与所有 AWS 服务的集成。与 Lambda 控制层面的通信在传输过程中受到 TLS 的保护。存储在 Lambda 控制层面中的所有客户数据都通过使用 AWS KMS 进行静态加密,旨在防止未经授权的泄露或篡改。
数据层面是 Lambda 的调用 API,用于触发 Lambda 函数的调用。调用 Lambda 函数时,数据层面会将 AWS Lambda 工件(或简称为工件,一种 Amazon EC2
Lambda 执行环境
每个调用都由 Lambda 的调用服务路由到能够处理请求的工件上的一个执行环境。除了通过数据层面,客户和其他用户无法直接发起与执行环境的入站/进入网络通信。这有助于确保与执行环境的通信经过身份验证和授权。
执行环境是为特定函数版本预留的,不能在函数版本、函数或 AWS 账户之间重用。这意味着,单个可能具有两个不同版本的函数会导致至少两个独一无二的执行环境。
每个执行环境一次只能用于一个并发调用,并且出于性能考虑,它们可以在同一函数版本的多个调用之间重用。根据许多因素(例如,调用速率、函数配置等),给定函数版本可能存在一个或多个执行环境。通过这种方法,Lambda 能够为其客户提供函数版本级别隔离。
Lambda 目前不隔离在函数版本的执行环境中发生的调用。这意味着,一个调用可能会留下可能影响下一次调用的状态(例如,写入 /tmp 的文件或内存中数据)。如果您想确保一个调用不会影响另一个调用,Lambda 建议您创建其他不同的函数。例如,您可以为更容易出错的复杂解析操作创建不同的函数,并重用不执行安全敏感操作的函数。Lambda 目前对客户可以创建的函数数量没有限制。有关限制的更多信息,请参阅 Lambda 配额页面。
执行环境由 Lambda 持续监控和管理,而创建或销毁执行环境的原因可能有很多,包括但不限于:
客户可以通过在其函数配置上配置预置并发来管理某个函数版本存在的预置执行环境的数量。配置为执行此操作后,Lambda 将创建、管理所配置数量的执行环境并确保它们始终存在。这确保了客户能够更好地控制其无服务器应用程序在任何规模下的启动性能。
除了通过预置并发配置外,客户无法确定地控制 Lambda 为响应调用而创建或管理的执行环境的数量。
执行角色
还必须为每个 Lambda 函数配置执行角色,执行角色是 Lambda 服务在执行与函数相关的控制层面和数据层面操作时代入的 IAM 角色。Lambda 服务代入此角色以提取临时安全凭证,这些凭证随后在函数调用期间可作为环境变量使用。出于性能方面的考虑,Lambda 服务将缓存这些凭证,并可能在使用相同执行角色的不同执行环境中重用它们。
为确保遵守最低权限原则,Lambda 建议每个函数拥有自己唯一的角色,并配置其所需的最低权限集。
Lambda 服务还可以代入执行角色来执行某些控制层面操作(例如,与为 VPC 函数创建和配置弹性网络接口 (ENI)、向 Amazon CloudWatch Application Insights
有关此主题的更多信息,请参阅 AWS Lambda 执行角色文档页面。
Lambda MicroVM 和工件
Lambda 将在名为 AWS Lambda 工件 的 Amazon EC2 实例的机群上创建其执行环境。工件是裸机
作为责任共担模式的一部分,Lambda 负责维护工件的安全配置、控制和补丁级别。Lambda 团队使用 Amazon Inspector

图 3 – AWS Lambda 工件的隔离模式
工件的最长租赁期限为 14 小时。当工件接近最长租赁时间时,不再向它发送进一步的调用,MVM 正常终止,底层工件实例终止。Lambda 持续监控其机群生命周期内的生命周期活动并发出有关此类活动的告警。
所有与工件的数据层面通信都通过使用伽罗瓦/计数器模式的高级加密标准 (AES-GCM) 进行加密。除了通过数据层面操作外,客户无法直接与工件进行交互,因为在 Lambda 服务账户中,工件托管在由 Lambda 管理的网络隔离 Amazon VPC 中。
当工件需要创建新的执行环境时,它会获得访问客户函数构件的限时授权。这些构件专门针对 Lambda 的执行环境和工件进行了优化。使用 ZIP 格式上载的函数代码经过一次优化,然后使用 AWS 托管式密钥和 AES-GCM 以加密格式存储。
使用容器镜像格式上载到 Lambda 的函数也进行了优化。容器镜像首先从其原始源下载,优化为不同的区块,然后使用经过身份验证的融合加密方法存储为加密块,该加密方法结合使用 AES-CTR