您可以在 aws lambda 层中添加文本文件吗?

Can you add text files in an aws lambda layer?

我正在考虑使用机密管理器或参数存储,但是如果 jwt 过期,那么我必须复制/粘贴方法来处理我所有 lambda 函数中过期的 jwt,我认为这会很低效.

我接下来想到的是使用 lambda 层。我正在编写的大多数函数已经需要所述 lambda 层,因此我认为这将是跨多个 lambda 函数共享 jwt 的最有效方式。

我的问题是,如果我有一个 lambda 层,其目录包含我的 jwt 的文本文件,我的所有 lambda 函数是否都能够从该层内的所述文本文件读取和写入,并且它们是否会保留更新所有使用同一层的 lambda 函数?

Python 层只是一个 ZIP 文件,启动时会解压到 Lambda 执行环境中。

因此,即使您可以修改该层中的文件,其他 Lambda 也不会看到它,无论它们是已经 运行ning 还是在您更改后新启动的。

但是您不能修改图层中的文件,因为 (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 文件系统并在其中写入文件。但是您仍然可能以使用过期令牌的 运行ning Lambda 结束,因此您仍然需要编写所有代码来刷新令牌。使用 EFS 来存储配置似乎有点矫枉过正。

更好的解决方案取决于您的令牌的寿命。

  • 如果它们是长期存在的(按月或年的顺序),将它们存储在 Parameter Store 或 Secrets Manager 中,在首次使用时检索并使用 @lru_cache 缓存值,并多次更新它们过期前几天。
  • 如果他们活了 30 分钟或更长时间,创建一个模块来检索和缓存令牌。这个模块应该位于一个层中,以便您的所有 Lambda 都可以调用它而不是自己实现逻辑,并且将公开一个函数来访问令牌。此函数应验证当前缓存的令牌(如果有),并在 (1) 已过期或 (2) 从未检索到时检索一个新令牌。
  • 如果它们只能存活几分钟,则在每次使用时取回。您可能会在 Lambda 调用开始时进行检索并重新使用,但这取决于您的 Lambda 运行s.
  • 的长度。