"Invalid ELF header" 在 AWS Lambda 上使用 libxmljs
"Invalid ELF header" using libxmljs on AWS Lambda
我有一个使用无服务器、express 和 libxmljs(将 JavaScript 绑定到 libxml)的超级基本 AWS Lambda 函数:
代码
serverless.xml:
service: xmltest
provider:
name: aws
runtime: nodejs10.x
stage: dev
region: us-east-1
functions:
app:
handler: index.handler
events:
- http: ANY /
- http: 'ANY {proxy+}'
plugins:
- serverless-offline
index.js:
const serverless = require('serverless-http');
const express = require('express');
const libxml = require("libxmljs");
const app = express();
app.use(express.json());
app.post('/lookup', async function (req, res) {
res.send({result: "hello world"});
});
module.exports.handler = serverless(app);
在本地工作但不在 AWS 上工作
当我在本地 运行:
$ curl -X POST http://localhost:3000/lookup -d {"example":123}
{"result":"hello world"}
当我 运行 在 AWS 上:
$ curl -X POST https://REDACTED.execute-api.us-east-1.amazonaws.com/dev/lookup -d {"example":123}
{"message": "Internal server error"}
CloudWatch 日志显示:
2019-06-05T12:46:43.280Z undefined ERROR Uncaught Exception
{
"errorType": "Error",
"errorMessage": "/var/task/node_modules/libxmljs/build/Release/xmljs.node: invalid ELF header",
"stack": [
"Error: /var/task/node_modules/libxmljs/build/Release/xmljs.node: invalid ELF header",
" at Object.Module._extensions..node (internal/modules/cjs/loader.js:730:18)",
" at Module.load (internal/modules/cjs/loader.js:600:32)",
" at tryModuleLoad (internal/modules/cjs/loader.js:539:12)",
" at Function.Module._load (internal/modules/cjs/loader.js:531:3)",
" at Module.require (internal/modules/cjs/loader.js:637:17)",
" at require (internal/modules/cjs/helpers.js:22:18)",
" at bindings (/var/task/node_modules/bindings/bindings.js:84:48)",
" at Object.<anonymous> (/var/task/node_modules/libxmljs/lib/bindings.js:1:99)",
" at Module._compile (internal/modules/cjs/loader.js:701:30)",
" at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)"
]
}
问题
如何在 AWS 上导入 libxmljs?
我看到一些相关问题,例如
所以我猜 libxmljs 中的某些东西是为不同于 Amazon Linux 的不同架构(我的本地机器是 macOS)构建的。但我不确定如何解决这个问题?
我用 运行 npm install
在 Linux 盒子上解决了问题,而不是 Mac。
在我的例子中,我设置了 AWS CodePipeline,它在 EC2 实例上运行所有构建脚本。也可以使用其他托管 CI 管道、Docker 容器等解决此问题。
我对 Pusher 也有同样的问题。看完@aaron-brager的回答后,我意识到了问题并尝试了这个。它对我有用。
#!/bin/bash
export PKG_DIR="python/lib/python3.6/site-packages/"
rm -rf ${PKG_DIR} && mkdir -p ${PKG_DIR}
docker run --rm -v $(pwd):/foo -w /foo lambci/lambda:build-python3.6 \
pip3 install -r requirements.txt -t ${PKG_DIR}