在 Lambda 内存中缓存 JWKS 与临时缓存
Cache JWKS in Lambda memory vs in temp
我目前正在使用 the Auth0 JWKS library 为我的 Lambda 自定义授权函数检索 JWKS 密钥。
如 this issue on the JWKS library 中所述,显然 JWKS 中为 public 密钥 ID 内置的缓存不适用于 lambda 函数,因此他们建议将密钥写入 tmp 文件。
cache=true
不起作用的原因是什么?
据我所知,应该没有什么区别会阻止内存缓存与 lambda 函数一起使用,但允许 tmp
文件夹上的基于文件的缓存是合适的解决方案。
据我所知,唯一会发生的问题是容器限速 JWKS API 的生成,而不是使用已创建容器的内存进行缓存的行为。
在这种情况下,在 Lambda 中外部存储此令牌的最佳模式是什么?
有很多选项可以解决这个问题。都有不同的优点和缺点。
首先,将密钥存储在内存或磁盘上 (/tmp
) 在持久性方面具有相同的结果。两者都可用于调用 同一 Lambda 实例。
我建议将密钥存储在内存中,因为内存访问比从文件读取快得多(在每次请求时)。
以下是解决此问题的其他选项:
- 将密钥存储在 S3 中并在初始化期间下载。
- 将密钥存储在 EFS 卷上,将该卷装载到您的 Lambda 实例中,在初始化期间从卷中加载密钥。
- 在初始化期间从API下载密钥。
- 使用 Lambdas 部署包打包密钥,并在初始化期间从磁盘加载它们。
- 将密钥存储在 AWS SSM 参数存储中并在初始化期间加载它们。
您可能已经注意到,“初始化期间”阶段是所有这些解决方案中最重要的部分。您不想对每个请求都这样做。
选项 1 和 2 需要您构建的其他一些“应用程序”定期下载密钥并将它们存储在 S3 或 EFS 卷上。这是额外的努力,但在某些情况下对于更复杂的设置来说可能是个好主意。
选项 3 基本上是您目前已经在做的,并且可能是简单用例的简单性和合理工程之间的最佳权衡。如前所述,您应该将密钥存储在内存中。
选项 4 是一个有效的“hack”,它是获取 Lambda 密钥的最简单方法。我从不建议这样做,因为突然更改密钥将需要重新部署 Lambda,同时无法对请求进行身份验证,从而导致停机。
选项 5 可以作为选项 3 的有效替代方案,但需要由另一个应用程序(如选项 1 和 2)进行相同的密钥管理。因此它不一定适合一个简单的授权方。
我目前正在使用 the Auth0 JWKS library 为我的 Lambda 自定义授权函数检索 JWKS 密钥。
如 this issue on the JWKS library 中所述,显然 JWKS 中为 public 密钥 ID 内置的缓存不适用于 lambda 函数,因此他们建议将密钥写入 tmp 文件。
cache=true
不起作用的原因是什么?
据我所知,应该没有什么区别会阻止内存缓存与 lambda 函数一起使用,但允许 tmp
文件夹上的基于文件的缓存是合适的解决方案。
据我所知,唯一会发生的问题是容器限速 JWKS API 的生成,而不是使用已创建容器的内存进行缓存的行为。
在这种情况下,在 Lambda 中外部存储此令牌的最佳模式是什么?
有很多选项可以解决这个问题。都有不同的优点和缺点。
首先,将密钥存储在内存或磁盘上 (/tmp
) 在持久性方面具有相同的结果。两者都可用于调用 同一 Lambda 实例。
我建议将密钥存储在内存中,因为内存访问比从文件读取快得多(在每次请求时)。
以下是解决此问题的其他选项:
- 将密钥存储在 S3 中并在初始化期间下载。
- 将密钥存储在 EFS 卷上,将该卷装载到您的 Lambda 实例中,在初始化期间从卷中加载密钥。
- 在初始化期间从API下载密钥。
- 使用 Lambdas 部署包打包密钥,并在初始化期间从磁盘加载它们。
- 将密钥存储在 AWS SSM 参数存储中并在初始化期间加载它们。
您可能已经注意到,“初始化期间”阶段是所有这些解决方案中最重要的部分。您不想对每个请求都这样做。
选项 1 和 2 需要您构建的其他一些“应用程序”定期下载密钥并将它们存储在 S3 或 EFS 卷上。这是额外的努力,但在某些情况下对于更复杂的设置来说可能是个好主意。
选项 3 基本上是您目前已经在做的,并且可能是简单用例的简单性和合理工程之间的最佳权衡。如前所述,您应该将密钥存储在内存中。
选项 4 是一个有效的“hack”,它是获取 Lambda 密钥的最简单方法。我从不建议这样做,因为突然更改密钥将需要重新部署 Lambda,同时无法对请求进行身份验证,从而导致停机。
选项 5 可以作为选项 3 的有效替代方案,但需要由另一个应用程序(如选项 1 和 2)进行相同的密钥管理。因此它不一定适合一个简单的授权方。