【问题标题】:What is the best way to save credentials in lambda?在 lambda 中保存凭据的最佳方法是什么?
【发布时间】:2020-11-03 13:57:49
【问题描述】:

我需要访问 lambda 函数的一些凭据,一种方法是将它们放入环境变量中。

但是,这些凭据的值在 lambda 控制台中是可见的。我正在考虑将它们放在秘密管理器或参数存储中,并将密钥作为 env 放在 lambda 中。然后在运行时加载 lambda 中的值。

但是,这种方法是安全的,但会产生一些延迟。我不确定它会产生多少延迟。有没有更好的解决方案?

【问题讨论】:

  • 需要什么凭据?
  • 凭证可以是数据库密码、auth2 密码等

标签: amazon-web-services aws-lambda aws-secrets-manager aws-systems-manager


【解决方案1】:

Lambda 变量实际上已经是encrypted,解密后的值会从控制台显示,但如果用户没有密钥权限,他们将无法看到它们。

正如您所建议的,您有以下解决方案:

使用这两种解决方案的好处是,您可以在您正在使用的 version 之外以及同时跨多个 Lambda 函数更改它们。

您尝试到达这些服务端点的延迟也会增加,这会导致时间略有增加。您可以通过使用 Lambda within a VPC 并在服务中使用VPC endpoints 来减少这种延迟(这将允许通过使用公共互联网进行直接私人通信),但它仍然会比环境变量更长。

这个选择最终适合您,如果您确实需要重用变量并且可以忍受轻微的延迟,那么请使用机密管理器或系统管理器参数存储。否则管理KMS permissions,以便不是每个用户都可以访问获取解密。

【讨论】:

  • 我建议在参数存储中使用 Secrets Manager 或 SecureString。解决对这些服务的调用增加的延迟的一种方法是从函数的“根”进行调用,因此在您的 Lambda 处理程序之外 - 这样调用仅在创建 lambda 实例时进行,并且您可以将其存储为后续调用的变量。这样您只会在第一次调用时获得延迟“命中”(取决于调用 Lambda 的频率以及它的有效性)
  • 如果我从root 进行调用,保存的变量是否可用于下一次 lambda 调用?我认为 lambda 是无状态的,它不共享内存。
  • 对于the user does not have permission for the key,如何创建策略来阻止用户读取密钥?这里的key是指环境变量吗?
  • 这是您的 Lambda 用于每个环境变量的 KMS 密钥,更多信息在这里:aws.amazon.com/premiumsupport/knowledge-center/…
  • > 如果我从根调用,保存的变量是否可用于下一个 lambda 调用?是的,Lambda 仅在冷启动时初始化函数“上下文”。您在处理程序之外创建的初始化值将用于下一次调用。通常,您还将在那里初始化任何客户端或数据库连接,例如,如果此密钥用于数据库访问,您将读取密钥,初始化数据库连接,并将数据库连接保存在上下文中,但不保存密钥。
猜你喜欢
  • 2012-09-11
  • 2015-07-13
  • 2018-06-16
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多