使用无服务器框架时如何在aws lambda函数中打包可执行文件?
How to package executables in aws lambda function when using serverless framework?
我需要上传一个可执行文件(准确地说是 wkhtmltopdf)以及我在 aws lambda 中的函数代码。我正在使用无服务器框架。我尝试了不同的方法,但未上传 exe。当通过 aws 仪表板压缩和上传代码时,该功能运行良好。
下面是需要上传的函数的目录结构
node_modules
index.js
wkhtmltopdf
这是我的serverless.yml
service: consult-payment-api
frameworkVersion: ">=1.1.0 <2.0.0"
package:
individually: true
provider:
name: aws
region: us-west-2
runtime: nodejs8.10
stage: dev
timeout: 300
functions:
UserPackageCharge:
handler: payment/module/chargePackage.create
package:
include:
- packages/wkhtmltopdf
events:
- http:
path: payment/module/package
method: post
cors:
origin: '*'
headers:
- Content-Type
- X-Amz-Date
- Authorization
- X-Api-Key
- X-Amz-Security-Token
- X-Amz-User-Agent
- My-Custom-Header
这是我的index.js(处理程序)
var wkhtmltopdf = require('wkhtmltopdf');
var MemoryStream = require('memorystream');
process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT'];
exports.handler = function(event, context) {
var memStream = new MemoryStream();
var html_utf8 = new Buffer(event.html_base64, 'base64').toString('utf8');
wkhtmltopdf(html_utf8, event.options, function(code, signal) { context.done(null, { pdf_base64: memStream.read().toString('base64') }); }).pipe(memStream);
};
但我仍然得到错误 'Error: /bin/bash: wkhtmltopdf: command not found'
如何让它在无服务器中工作?
好吧,我可以建议 Python,因为这是我最近在我的项目中实施的。我将我所有的 lambda 脚本和依赖项 python 脚本放在一个 zip 中,并将它们放在我的堡垒服务器上。为了使这些更易于执行和上传,我实施了 cattle+click cli,以确保选择正确版本的 zips,然后将其上传到 s3 存储桶位置。当基于 s3 事件触发 lambda 时,它会在存储库中查找所需的参数文件或输入文件(这只是一个 s3 存储桶)。
我确实得到了一个可用的版本。
这是我所做的:
1) 创建了一个 package.json 并添加了:
"dependencies":{
"wkhtmltopdf": "^0.3.4",
"memorystream": "^0.3.1"
},
2) 运行 ndm 安装
3) 在目录中添加了WKhtmltopdf:
4) 在 serverless.yml
中添加了这个
包裹:
包括:
- wkhtmltopdf
5) 在 lambda 中添加:
var wkhtmltopdf = require('wkhtmltopdf');
var MemoryStream = require('memorystream');
就是这样。希望对你有帮助。
我需要上传一个可执行文件(准确地说是 wkhtmltopdf)以及我在 aws lambda 中的函数代码。我正在使用无服务器框架。我尝试了不同的方法,但未上传 exe。当通过 aws 仪表板压缩和上传代码时,该功能运行良好。
下面是需要上传的函数的目录结构
node_modules index.js wkhtmltopdf
这是我的serverless.yml
service: consult-payment-api
frameworkVersion: ">=1.1.0 <2.0.0"
package:
individually: true
provider:
name: aws
region: us-west-2
runtime: nodejs8.10
stage: dev
timeout: 300
functions:
UserPackageCharge:
handler: payment/module/chargePackage.create
package:
include:
- packages/wkhtmltopdf
events:
- http:
path: payment/module/package
method: post
cors:
origin: '*'
headers:
- Content-Type
- X-Amz-Date
- Authorization
- X-Api-Key
- X-Amz-Security-Token
- X-Amz-User-Agent
- My-Custom-Header
这是我的index.js(处理程序)
var wkhtmltopdf = require('wkhtmltopdf');
var MemoryStream = require('memorystream');
process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT'];
exports.handler = function(event, context) {
var memStream = new MemoryStream();
var html_utf8 = new Buffer(event.html_base64, 'base64').toString('utf8');
wkhtmltopdf(html_utf8, event.options, function(code, signal) { context.done(null, { pdf_base64: memStream.read().toString('base64') }); }).pipe(memStream);
};
但我仍然得到错误 'Error: /bin/bash: wkhtmltopdf: command not found' 如何让它在无服务器中工作?
好吧,我可以建议 Python,因为这是我最近在我的项目中实施的。我将我所有的 lambda 脚本和依赖项 python 脚本放在一个 zip 中,并将它们放在我的堡垒服务器上。为了使这些更易于执行和上传,我实施了 cattle+click cli,以确保选择正确版本的 zips,然后将其上传到 s3 存储桶位置。当基于 s3 事件触发 lambda 时,它会在存储库中查找所需的参数文件或输入文件(这只是一个 s3 存储桶)。
我确实得到了一个可用的版本。
这是我所做的:
1) 创建了一个 package.json 并添加了:
"dependencies":{
"wkhtmltopdf": "^0.3.4",
"memorystream": "^0.3.1"
},
2) 运行 ndm 安装
3) 在目录中添加了WKhtmltopdf:
4) 在 serverless.yml
中添加了这个
包裹:
包括:
- wkhtmltopdf
5) 在 lambda 中添加:
var wkhtmltopdf = require('wkhtmltopdf');
var MemoryStream = require('memorystream');
就是这样。希望对你有帮助。