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

问题描述 投票:0回答:2

我需要上传一个可执行文件(确切地说是 wkhtmltopdf)以及 aws lambda 中的函数代码。我正在使用无服务器框架。我尝试了不同的方法,但exe未上传。当代码被压缩并通过 aws 仪表板上传时,该功能运行良好。

下面是需要上传的函数的目录结构

节点模块 索引.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:找不到命令” 如何让它在无服务器中工作?

amazon-web-services aws-lambda wkhtmltopdf serverless-framework serverless
2个回答
2
投票

我确实得到了一个可以运行的版本。我遇到的唯一问题(我尚未解决)是该特定 serverless.yml 中的所有 lambda 都包含 wkhtmlpdf - 所以它们都在 16 mb 左右。

这就是我所做的:

  1. 创建了package.json并添加:

    “依赖项”:{
    "wkhtmltopdf": "^0.3.4",
    “内存流”:“^0.3.1”
    },

  2. 运行 ndm 安装

  3. 在目录中添加了WKhtmltopdf:

  4. 在 serverless.yml 中添加了此内容
    包装:
    包括:

    • wkhtmltopdf
  5. 在 lambda 中添加了这个:
    var wkhtmltopdf = require('wkhtmltopdf');
    var MemoryStream = require('内存流');


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.