Я тестирую функции aws iot, используя безсерверный фреймворк. Таким образом, для одного случая использования я не должен был анализировать сертификаты x509, которые iot устройства регистрируют в aws от aws lambdas, я увидел пакет npm с именем x509
, чтобы сделать это легко. Это нативный пакет, поэтому я собираю его в 64-битной версии Ubuntu, чтобы сделать его совместимым со средой aws.
Проблема в том, что веб-пакет не идентифицирует этот пакет npm даже после импорта моего пакета.
Ошибка, которую он говорит,
$ sls package
Serverless: Bundling with Webpack... Time: 245ms Built at: 05/05/2018 11:04:55 AM
Asset Size Chunks Chunk Names
jitr/index.js 11.9 KiB 0 [emitted] jitr/index jitr/build/Release/x509.node 44.2 KiB [emitted] Entrypoint jitr/index = jitr/index.js [0] ./jitr/index.js 7.39 KiB {0} [built] [1] external "aws-sdk" 42 bytes {0} [built] [2] ./jitr/node_modules/x509/index.js 1.29 KiB {0} [built] [3] external "fs" 42 bytes {0} [built]
ERROR in ./jitr/node_modules/x509/index.js Module not found: Error: Can't resolve './build/Release/x509' in '/home/serverless/jitr/node_modules/x509' @ ./jitr/node_modules/x509/index.js 1:11-42 @ ./jitr/index.js
Error --------------------------------------------------
Webpack compilation error, see above
For debugging logs, run again after setting the "SLS_DEBUG=*" environment variable.
Get Support --------------------------------------------
Docs: docs.serverless.com
Bugs: github.com/serverless/serverless/issues
Forums: forum.serverless.com
Chat: gitter.im/serverless/serverless
Your Environment Information -----------------------------
OS: linux
Node Version: 8.10.0
Serverless Version: 1.26.1
Моя структура dir пакета,
- myproject
-- webpack.config.js
-- serverless.yml
-- jitr
--- index.js <- Here I'm importing x509
--- node_modules
---- x509
----- index.js <- First line: var x509 = require('./build/Release/x509')
----- build/Release/x509.node
Файл конфигурации моего веб-пакета
const path = require("path");
const slsw = require("serverless-webpack");
const nodeExternals = require("webpack-node-externals");
const CopyWebpackPlugin = require("copy-webpack-plugin");
module.exports = {
entry: slsw.lib.entries,
target: "node",
output: {
libraryTarget: "commonjs2",
path: path.resolve(__dirname, ".webpack"),
filename: "[name].js"
},
module: {
rules: [
{
test: /\.json$/,
loader: "json-loader"
},
{
test: /\.node$/,
loader: "node-loader"
}
]
},
mode: "none",
externals: [
nodeExternals({
whitelist: ["x509"]
})
],
plugins: [
new CopyWebpackPlugin([
{
from: "jitr/node_modules/x509/build/Release/x509.node",
to: "jitr/build/Release/x509.node",
toType: "file"
}
])
]
};
Что может быть не так? Я искал дополнительные этапы отладки при выполнении команды webpack, но здесь я использую безсерверный плагин с именем serverless-webpack
для упаковки и развертывания лямбд.
У Aws lambda есть доступ к необработанной команде openssl
, если ничего не работает, я должен использовать эту команду из nodejs для выполнения этих действий.