【问题标题】:How to package executables in aws lambda function when using serverless framework?使用无服务器框架时如何在 aws lambda 函数中打包可执行文件?
【发布时间】:2019-01-28 13:50:45
【问题描述】:

我需要上传一个可执行文件(确切地说是 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);	
};

但我仍然收到错误“错误:/bin/bash: wkhtmltopdf: command not found” 如何让它在无服务器中工作?

【问题讨论】:

  • 你使用的是什么操作系统?
  • 您包含在 lambda zip 文件中的所有内容都部署在 lambda 执行中的 /var/task 中。通过这种方式,您可以在 zip 中添加二进制文件,并在调用路径 /var/task/ 的代码中检索它。请记住,您的二进制文件应该使用静态选项编译,以避免由于依赖关系而导致的错误。
  • 包含您自己的可执行文件很容易;只需将它们打包到您上传的 ZIP 文件中,然后在您从 Node.js 或您之前启动的其他进程中调用它们时引用它们(包括您创建的 ZIP 文件中的相对路径)。确保在函数代码的开头包含以下内容: process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT']
  • @Erndob Lambda 使用 Amazon Linux 我猜
  • 感谢您的建议。但是这些并不能帮助我在无服务器框架上工作

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


【解决方案1】:

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

【讨论】:

  • 感谢您的建议。我需要的是使用无服务器框架使其工作。当我从 aws 仪表板手动上传函数以及 exe 时,这很有效
  • 好的。我不太了解 Javascript 对 AWS 资源的支持,但对 Python 的支持 - Boto3 确实是一个很棒的 SDK,它在自动化任务方面帮助了我很多。如果考虑不同的选择,您也可以尝试一下。
  • 谢谢。我去看看
【解决方案2】:

我确实得到了一个工作版本。

这就是我所做的:

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('memorystream');


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

【讨论】:

  • 感谢您的回复。它能为您提供帮助吗? @Jonesie
  • 是的,我现在正在使用它。它运作良好。我唯一遇到的问题(我还没有解决)是特定 serverless.yml 中的所有 lambdas 都包括 wkhtmlpdf - 所以它们都在 16 mb 左右。
  • 好的,很好。我会试试这个。 @Jonesie
猜你喜欢
  • 2019-07-23
  • 2019-01-04
  • 2023-03-16
  • 2022-09-02
  • 2017-10-01
  • 2021-12-05
  • 2017-12-02
  • 2016-05-17
  • 2020-05-28
相关资源
最近更新 更多