Python 层只是一个 ZIP 文件,它会在启动时解压到 Lambda 执行环境中。
因此,即使您可以修改该层中的文件,其他 Lambda 也不会看到该文件,无论它们是已经在运行还是在您更改后新启动。
但是您不能修改图层中的文件,因为 (1) 一切都归 root 所有,并且 (2) 它以只读方式安装。您可以通过如下 Lambda 函数看到这一点:
import os
def lambda_handler(event, context):
print("")
print("**** id ****")
os.system("id")
print("")
print("****")
os.system("df -kh")
print("")
print("****")
os.system("cat /etc/mtab")
当你运行它时,你会看到如下输出。该层将被解压缩到/opt/python。如您所见,/opt 是卷 /dev/vdc,它像所有其他卷一样以只读方式安装,除了 /tmp 和 - 令人惊讶的是 - /dev(虽然我怀疑你能够写在那里,因为我确定它是由 root 拥有的)。
**** id ****
uid=993(sbx_user1051) gid=990 groups=990
****
Filesystem Size Used Avail Use% Mounted on
/mnt/root-rw/opt/amazon/asc/worker/tasks/rtfs/python3.7-amzn-201803 9.8G 8.4G 1.4G 87% /
/dev/vdb 1.5G 14M 1.4G 1% /dev
/dev/vdd 526M 872K 514M 1% /tmp
/dev/root 9.8G 8.4G 1.4G 87% /var/rapid
/dev/vdc 1.4M 1.4M 0 100% /opt
****
/mnt/root-rw/opt/amazon/asc/worker/tasks/rtfs/python3.7-amzn-201803 / overlay ro,nosuid,nodev,relatime,lowerdir=/tmp/es446846401/0e8fe4685588891:/tmp/es446846401/728da5137110572 0 0
/dev/vdb /dev ext4 rw,nosuid,noexec,noatime,data=writeback 0 0
/dev/vdd /tmp ext4 rw,relatime,data=writeback 0 0
none /proc proc rw,nosuid,nodev,noexec,noatime 0 0
/dev/vdb /proc/sys/kernel/random/boot_id ext4 ro,nosuid,nodev,noatime,data=writeback 0 0
/dev/root /etc/passwd ext4 ro,nosuid,nodev,relatime,data=ordered 0 0
/dev/root /var/rapid ext4 ro,nosuid,nodev,relatime,data=ordered 0 0
/dev/vdb /etc/resolv.conf ext4 ro,nosuid,nodev,noatime,data=writeback 0 0
/dev/vdc /var/task squashfs ro,nosuid,nodev,relatime 0 0
/dev/vdc /opt squashfs ro,nosuid,nodev,relatime 0 0
那么,除此之外,如何解决您的真正问题,即向所有 Lambda 传播访问令牌,包括(我认为)当前正在运行的那些。
您可以挂载一个 EFS 文件系统并在那里写入文件。但是您仍然可以使用过期令牌来运行 Lambda,因此您仍然需要编写所有代码来刷新令牌。而且使用 EFS 来存储配置似乎有点过头了。
更好的解决方案取决于您的代币存在多长时间。
- 如果它们是长期存在的(大约几个月或几年),请将它们存储在 Parameter Store 或 Secrets Manager 中,在首次使用时检索并使用
@lru_cache 缓存值,并在它们到期前几天更新它们.
- 如果它们存活 30 分钟或更长时间,请创建一个模块来检索和缓存令牌。该模块应该位于一个层中,以便您的所有 Lambda 都可以调用它而不是自己实现逻辑,并且会公开一个函数来访问令牌。此函数应验证当前缓存的令牌(如果有),如果 (1) 已过期或 (2) 从未检索过,则检索新的。
- 如果它们只存活几分钟,则在每次使用时取回。您可能会在 Lambda 调用开始时检索并重新使用,但这取决于您的 Lambda 运行多长时间。