Lambda 隔离技术
Lambda 使用各种开源和专有隔离技术来保护工件和执行环境。每个执行环境都包含以下各项的专用副本:
-
特定函数版本的代码
-
为您的函数版本选择的任何 AWS Lambda 层
-
所选函数运行时(例如 Java 11、NodeJS 12、Python 3.8 等)或函数的自定义运行时
-
可写入的 /tmp 目录
-
基于 Amazon Linux 2
的最小 Linux 用户空间
执行环境使用 Linux 内核中内置的几种类似容器的技术以及 AWS 专有的隔离技术相互隔离。这些技术包括:
-
cgroups
– 用于限制函数对 CPU 和内存的访问。 -
namespaces
– 每个执行环境都在专用的命名空间中运行。我们通过拥有唯一的组进程 ID、用户 ID、网络接口以及其他由 Linux 内核管理的资源来实现这一点。 -
seccomp-bpf
– 限制可以在执行环境中使用的系统调用 (syscall)。 -
chroot
– 提供针对底层文件系统的限定访问。 -
Firecracker 配置 – 用于限制块储存设备和网络设备吞吐量的速率。
-
Firecracker 安全功能 – 有关 Firecracker 的当前安全设计的更多信息,请参阅 Firecracker 的最新设计文档
。
这些机制与 AWS 专有的隔离技术一起,在执行环境之间提供了强大的隔离。
存储和状态
执行环境始终不会在不同的函数版本或客户之间重用,但可以在同一函数版本的多个调用之间重用单个环境。这意味着数据和状态可以在调用之间保留。作为正常执行环境生命周期管理的一部分,数据和/或状态可能会持续存在数小时,然后才会被销毁。出于性能方面的考虑,函数可以利用此行为,通过在调用之间保留和重用本地缓存或长寿命连接来提高效率。在执行环境中,这些多次调用由单个进程处理,因此,如果调用发生在重用的执行环境中,则任何进程范围的状态(例如 Java 中的静态状态)都可以供将来的调用重用。
每个 Lambda 执行环境还包括一个可写入的文件系统(位于 /tmp
)。此存储无法跨执行环境访问或共享。与进程状态一样,写入 /tmp
的文件将在执行环境的生命周期内保留。这允许在多个调用间分摊昂贵的传输操作,例如下载机器学习 (ML) 模型。不希望在两次调用之间保留数据的函数不应写入 /tmp,或者应在调用之间从 /tmp 中删除其文件。/tmp
目录由 Amazon EC2 实例存储提供支持,并进行静态加密。
希望将数据保留到执行环境之外的文件系统的客户应考虑使用 Lambda 与 Amazon Elastic File System
如果客户不希望在调用之间保留数据或状态,Lambda 建议他们不要使用执行上下文或执行环境来存储数据或状态。如果客户希望主动防止在调用之间泄漏数据或状态,Lambda 建议他们为每个状态创建不同的函数。Lambda 不建议客户在执行环境中使用或存储安全敏感状态,因为该状态可能会在调用之间发生变化。我们建议改为在每次调用时重新计算状态。