【问题标题】:How to pass value of NODE_EXTRA_CA_CERTS to AWS Lambda deployed with Serverless?如何将 NODE_EXTRA_CA_CERTS 的值传递给使用 Serverless 部署的 AWS Lambda?
【发布时间】:2020-06-12 00:52:27
【问题描述】:

我正在使用Serverless 部署节点AWS Lambda。由于运行此代码的机构的内部要求,我需要通过额外的证书。我能找到的唯一解决方案是将 NODE_EXTRA_CA_CERTS 作为 CLI 参数传递。使用典型的环境变量(例如,在 dotenv 中定义)不起作用,因为此时在 Node 中已经配置了证书。

我的额外证书位于项目根目录中的MyCerts.pem 中,我尝试运行的 Lambda 函数称为function1。使用 NODE_EXTRA_CA_CERTS=./MyCerts.pem npx serverless invoke local -f function1 -l 在本地运行 Lambda 可以正常工作。但是,一旦我使用 npx serverless deploy -v 部署到 AWS,我就找不到正确包含这些额外证书的方法,包括使用 NODE_EXTRA_CA_CERTS=./MyCerts.pem npx serverless invoke -f function1 -l 从 CLI 调用。

我已经尝试了所有我能想到的方法,但我不知所措。有人可以帮忙吗?

【问题讨论】:

  • 嘿,你找到解决办法了吗?
  • 有解决办法吗?

标签: node.js amazon-web-services aws-lambda ssl-certificate serverless


【解决方案1】:

我认为这在 AWS Lambda 中绝对是可能的。
dev.to [1] 上有一个与您的用例类似的示例。 但是,他们正在使用 .NET Core 和 AWS SAM,但应该很容易将解决方案适应无服务器和 Node.js。

基本上,你需要两个步骤:

  1. 创建一个 Lambda 层来保存您的附加证书文件 [2][3]
  2. 将环境变量 NODE_EXTRA_CA_CERTS 添加到您的 serverless.yml 并将路径指向您在 Lambda 层中上传的文件 [4]

参考文献

[1]https://dev.to/leading-edje/aws-lambda-layer-for-private-certificates-465j
[2]https://www.serverless.com/plugins/serverless-layers
[3]https://www.serverless.com/blog/publish-aws-lambda-layers-serverless-framework
[4]https://www.serverless.com/blog/serverless-v1.2.0

【讨论】:

    【解决方案2】:

    我认为NODE_EXTRA_CA_CERTS 不适用于 Lambda。我尝试将它设置为一个不存在的虚拟文件的环境变量。正如documentation 所述,它确实没有生成警告,所以我认为它被忽略了。

    如果文件丢失或格式错误,将使用 process.emitWarning() 发出(一次)消息,但任何错误都将被忽略。

    我认为是因为这个警告:

    当节点以 setuid root 运行或设置了 Linux 文件功能时,将忽略此环境变量。

    这里是another question,确认它不起作用。

    通过从 Lambda 函数启动另一个 node 进程,我能够让 Node.js 关注 NODE_EXTRA_CA_CERTS。第二个过程给了我正在寻找的警告:

    Warning: Ignoring extra certs from `hello.pem`, load failed: error:02001002:system library:fopen:No such file or directory
    

    我确信启动辅助进程来处理请求有很多缺点(并发性是我主要关心的问题),但您可以尝试这种解决方法。

    const ca_env = Object.assign({NODE_EXTRA_CA_CERTS: "hello.pem"}, process.env);;
    require("child_process").execSync('node -e "console.log(\'hello\')"', {env: ca_env});
    

    【讨论】:

    • 这是有趣的笔记!由于我还没有测试我的解决方案,所以我花时间创建了一个小型实验室:具有自签名证书和公共 IP 的 EC2 实例;我将自签名添加到 Lambda 包并添加了环境变量 NODE_EXTRA_CA_CERTS = /var/task/rootCA.crt。添加 env 变量后,我的 https 客户端能够进行调用。在我的情况下,node.js 正确拾取了环境变量。我猜您的情况下的警告没有打印出来,因为 Lambda 可能(可能)稍后开始记录 node.js 输出,并且很早就读取了 NODE_EXTRA_CA_CERTS。
    • 我还使用 bash 脚本中的 proc 文件系统检查了“/var/lang/bin/node”的运行进程状态:“cat /proc/$PPID/status”。 Lambda 的节点进程作为非特权用户运行 - 未设置 suid 位。此外,在使用“getcap /var/lang/bin/node”查询它们时,我没有收到任何 Linux 文件功能。我猜 node.js 中的“secure_getenv”安全措施会导致麻烦并且在文档中提到 - 正如您正确指出的那样 - 对于 AWS Lambda 来说应该不是问题。
    • 非常有趣。我想知道为什么这么多人会遇到问题,如果它真的有效的话。
    • 也许他们将变量设置为错误的路径并且没有得到错误日志。也许不同节点运行时的行为不一致? Idk...如果有人正在阅读这篇文章,请在此处回复。
    【解决方案3】:

    我也遇到了这个问题,并接受了 Martin Loper 的输入,我设置了环境变量 NODE_EXTRA_CA_CERTS,前缀为 /var/task/,然后是我的 lambda 代码库中证书实际所在的路径。例如如果我的 lambda 中有一个文件夹 certsmyCustomCA.pem,它会喜欢 /var/task/certs/myCustomCA.pem

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-15
      • 2018-11-08
      • 1970-01-01
      • 2016-08-24
      • 2021-08-04
      • 2019-12-20
      • 2019-12-22
      • 1970-01-01
      相关资源
      最近更新 更多