使用无服务器框架时,如何在AWS Lambda函数中打包可执行文件?

时间:2018-08-22 10:08:33

标签: amazon-web-services aws-lambda wkhtmltopdf serverless-framework serverless

我需要在aws lambda中上传可执行文件(确切地说是wkhtmltopdf)以及功能代码。我正在使用无服务器框架。我尝试了不同的方法,但是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);	
};

但是我仍然收到错误“错误:/ bin / bash:wkhtmltopdf:找不到命令” 如何在无服务器的环境下工作?

2 个答案:

答案 0 :(得分:2)

我确实可以使用一个版本。

这就是我所做的:

1)创建一个package.json并添加:

  “依赖项”:{
    “ wkhtmltopdf”:“ ^ 0.3.4”,
    “ memorystream”:“ ^ 0.3.1”
  },

2)运行ndm install

3)在目录中添加了WKhtmltopdf:
enter image description here

4)在serverless.yml中添加了它
包装:
  包括:
    -wkhtmltopdf

5)在lambda中添加了此代码:
var wkhtmltopdf = require('wkhtmltopdf');
var MemoryStream = require('memorystream');


就是这样希望对您有所帮助。

答案 1 :(得分:0)

我可以建议使用Python,因为这是我最近在项目中实现的。我将所有的lambda脚本和依赖项python脚本放在一个zip中,并将它们放在堡垒服务器上。为了使这些文件更易于执行和上传,我实现了cow + click cli,以确保获得正确版本的zip,然后将其上传到s3存储桶位置。当基于s3事件触发lambda时,它将在存储库中查找所需的参数文件或输入文件(仅是s3存储桶)。