如何将 NODE_EXTRA_CA_CERTS 的值传递给使用 Serverless 部署的 AWS Lambda?

How to pass value of NODE_EXTRA_CA_CERTS to AWS Lambda deployed with Serverless?

我正在部署一个节点 AWS Lambda with Serverless. Due to the internal requirements of the institution in which this code will be run, I need to pass extra certificates. The only solution I've been able to find is to pass NODE_EXTRA_CA_CERTS as a CLI argument. Using typical environmental variables (defined, for example, in dotenv) 不起作用,因为此时在节点中已经配置了证书。

我的额外证书位于项目根目录的 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 调用

能想到的都试过了,还是一头雾水。有人可以帮忙吗?

我认为这在 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

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

A message will be emitted (once) with process.emitWarning() if the file is missing or malformed, but any errors are otherwise ignored.

我认为这是因为这个警告:

This environment variable is ignored when node runs as setuid root or has Linux file capabilities set.

这里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});

我 运行 也遇到了这个问题,并采纳了 Martin Loper 的意见,我设置了环境变量 NODE_EXTRA_CA_CERTS 前缀为 /var/task/ 然后是我的 lambda 代码库中证书所在的路径实际上位于。例如如果我的 lambda 中有一个文件夹 certs 并且 myCustomCA.pem.

,它会喜欢 /var/task/certs/myCustomCA.pem

我处理了同样的问题并通过在项目文件夹中上传证书解决了这个问题,然后节点应该能够使用 NODE_EXTRA_CA_CERTS

Lambda 层将证书存储在 /opt 文件夹中,我认为节点模块无权直接读取内容。

它使用前缀 /var/task/