Set*_*ine 6 node.js aws-lambda
当我在本地运行该函数时,NodeJS 11.7.0它可以工作,当我在AWS Lambda NodeJS 8.10其中运行它时,它可以工作,但我最近尝试运行它AWS Lambda NodeJS 10.x并在 Cloud Watch 中获得此响应和此错误。
关于如何纠正这个问题的任何想法?
回复
{
"success": false,
"error": "Error: Could not find openssl on your system on this path: openssl"
}
Run Code Online (Sandbox Code Playgroud)
云监视错误
ERROR (node:8) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
Run Code Online (Sandbox Code Playgroud)
功能
...
const util = require('util');
const pem = require('pem');
...
return new Promise((fulfill) => {
require('./certs').get(req, res, () => {
return fulfill();
});
}).then(() => {
const createCSR = util.promisify(pem.createCSR);
//This seems to be where the issue is coming from
return createCSR({
keyBitsize: 1024,
hash: HASH,
commonName: id.toString(),
country: 'US',
state: 'Maryland',
organization: 'ABC', //Obfuscated
organizationUnit: 'XYZ', //Obfuscated
});
}).then(({ csr, clientKey }) => {
...
}).then(async ({ certificate, clientKey }) => {
...
}, (err) => {
return res.status(404).json({
success: false,
error: err,
});
});
...
Run Code Online (Sandbox Code Playgroud)
我试过
"pem": "^1.14.3",和"pem": "^1.14.2",
我尝试了@Kris White 记录的答案,但我无法让它发挥作用。每次执行都会导致错误Could not find openssl on your system on this path: /opt/openssl。我尝试了几种不同的路径和方法,但没有一个效果很好。我完全有可能只是没有正确复制 OpenSSL 可执行文件。
由于我需要一个有效的解决方案,我使用了@Wilfred Dittmer 提供的答案。因为我没有使用 Docker,所以我稍微修改了它。我启动了一个 Amazon Linux 2 服务器,在其上构建了 OpenSSL,将包传输到我的本地机器,并通过 Serverless 进行部署。
创建一个以create-openssl-zip.sh以下内容命名的文件。该脚本将创建 Lambda 层 OpenSSL 包。
#!/bin/bash -x
# This file should be copied to and run inside the /tmp folder
yum update -y
yum install autoconf bison gcc gcc-c++ libcurl-devel libxml2-devel -y
curl -sL http://www.openssl.org/source/openssl-1.1.1d.tar.gz | tar -xvz
cd openssl-1.1.1d
./config --prefix=/tmp/nodejs/openssl --openssldir=/tmp/nodejs/openssl && make && make install
cd /tmp
rm -rf nodejs/openssl/share nodejs/openssl/include
zip -r lambda-layer-openssl.zip nodejs
rm -rf nodejs openssl-1.1.1d
Run Code Online (Sandbox Code Playgroud)
然后,按照以下步骤操作:
curl -F "file=@create-openssl-zip.sh" https://file.iocurl您的开发机器上没有安装,您也可以使用 File.io 网站手动上传脚本。https://file.io/a1B2c3tmp通过运行导航到目录cd /tmp。curl {FILE_IO_URL} --output create-openssl-zip.sh。
FILE_IO_URL为从 File.io 返回并在步骤 3 中复制的 URL。sudo bash ./create-openssl-zip.sh。脚本可能需要一段时间才能完成。您可能需要确认一个或多个软件包安装提示。curl -F "file=@lambda-layer-openssl.zip" https://file.io.curl {FILE_IO_URL} --output lambda-layer-openssl.zip.
FILE_IO_URL为从 File.io 返回并在步骤 13 中复制的 URL。curl您的开发机器上没有安装该文件,您也可以通过将复制的 URL 粘贴到您喜欢的浏览器的地址栏中来手动下载该文件。build-lambda-layer-opensslEC2 实例,因为不再需要它。为了完整起见,这是我的serverless.yml文件的一部分:
functions:
functionName:
# ...
layers:
- { Ref: OpensslLambdaLayer }
layers:
openssl:
name: ${self:provider.stage}-openssl
description: Contains openssl command line utility for lambdas that need it
package:
artifact: 'path\to\lambda-layer-openssl.zip'
compatibleRuntimes:
- nodejs10.x
- nodejs12.x
retain: false
Run Code Online (Sandbox Code Playgroud)
...这是我在代码文件中配置 PEM 的方式:
import * as pem from 'pem';
process.env.LD_LIBRARY_PATH = '/opt/nodejs/openssl/lib';
pem.config({
pathOpenSSL: '/opt/nodejs/openssl/bin/openssl',
});
// other code...
Run Code Online (Sandbox Code Playgroud)
我就此事联系了 AWS Support,结果发现 openssl 库仍在 Node10x 映像上,只是不在命令行实用程序上。然而,从标准 AMI 中获取它并将其用作 Lambda 层非常容易。
脚步:
process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT'] + ':/opt';
Run Code Online (Sandbox Code Playgroud)
该层将已为您解压缩,并且由于您事先将其设置为可执行,因此它应该可以正常工作。底层的 openssl 库就在那里,所以只需复制 cli 就可以了。
PEM NPM 文档说:
设置 openssl 位置 在某些系统中,openssl 可执行文件可能无法以默认名称使用,或者未包含在 $PATH 中。在这种情况下,您可以在加载 pem 模块后将可执行文件的位置定义为一次性操作:
所以我认为它无法在系统中找到 OpenSSL 路径,您可以尝试以编程方式配置它:
var pem = require('pem')
pem.config({
pathOpenSSL: '/usr/local/bin/openssl'
})
Run Code Online (Sandbox Code Playgroud)
由于您正在使用 AWS Lambda,因此只需尝试打印process.env.path您就会了解 OpenSSL 是否包含在路径环境变量中。
您还可以通过运行以下代码来检查“OpenSSL”
const exec = require('child_process').exec;
exec('which openssl',function(err,stdopt,stderr){
console.log(err ? err : stdopt);
})
Run Code Online (Sandbox Code Playgroud)
更新
正如 @hoangdv 在他的回答中提到的,openssl 似乎已在 node10.x 运行时被删除,我认为他是对的。此外,我们对文件系统具有只读访问权限,因此我们无能为力。
@Seth McClaine,你可以尝试node-forgenpm 模块。在此基础上构建的模块之一是“ https://github.com/jfromaniello/selfsigned ”,这将使您的任务更轻松
| 归档时间: |
|
| 查看次数: |
2548 次 |
| 最近记录: |