amazon-web-services - 如何打包或安装整个程序以在AWS Lambda函数中运行

标签 amazon-web-services scrapy aws-lambda

如果是完全错误地使用Lambda的情况,请告诉我。

我想将Scrapy安装到Lambda函数中并调用该函数以开始爬网。我的第一个问题是如何安装它,以便所有路径都正确。我使用要压缩的目录作为根目录安装了该程序,因此zip包含所有源文件和可执行文件。我的工作基于this文章。它说在函数的开头包含一行,“process”变量从何而来?我试过了,

var process = require('child_process');
var exec = process.exec;
process.env['PATH'] = process.env['PATH'] + ':' + 
process.env['LAMBDA_TASK_ROOT']

但是我得到了错误
"errorMessage": "Cannot read property 'PATH' of undefined",
"errorType": "TypeError",

我需要包含所有库文件,还是仅包含/usr/lib中的可执行文件?如何包含文章说我需要的那一行代码?

编辑:
我尝试将代码移到child_process.exec中,并收到错误
"errorMessage": "Command failed: /bin/sh: process.env[PATH]: command not found\n/bin/sh: scrapy: command not found\n"

这是我目前的全部功能
console.log("STARTING");
var process = require('child_process');
var exec = process.exec;

exports.handler = function(event, context) {    
    //Run a fixed Python command.
    exec("process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT']; scrapy crawl backpage2", function(error, stdout) {
        console.log('Scrapy returned: ' + stdout + '.');
        context.done(error, stdout);
    });

};

最佳答案

您绝对可以从Lambda中的Node代码执行任意进程。例如,我们这样做是为了运行一个处理玩家转弯的游戏服务器。我不确定您要使用Scrapy到底要完成什么,但是请记住,您现在整个Lambda调用最多只能在AWS上生存60秒!但是,如果您满意,这是一个完全有效的示例,说明了我们如何从Lambda执行我们自己的任意linux进程。 (在我们的例子中,它是一个已编译的二进制文件-只要您有可以在它们使用的Linux镜像上运行的东西就没关系)。

var child_process = require('child_process');
var path = require('path');

exports.handler = function (event, context) {
    // If timeout is provided in context, get it. Otherwise, assume 60 seconds
    var timeout = (context.getRemainingTimeInMillis && (context.getRemainingTimeInMillis() - 1000)) || 60000;
    // The task root is the directory with the code package.
    var taskRoot = process.env['LAMBDA_TASK_ROOT'] || __dirname;
    // The command to execute.
    var command;

    // Set up environment variables
    process.env.HOME = '/tmp'; // <-- for naive processes that assume $HOME always works! You might not need this.

    // On linux the executable is in task root / __dirname, whichever was defined
    process.env.PATH += ':' + taskRoot;
    command = 'bash -c "cp -R /var/task/YOUR_THING /tmp/; cd /tmp; ./YOUR_THING ARG1 ARG2 ETC"'

    child_process.exec(command, {
        timeout: timeout,
        env: process.env
    }, function (error, stdout, stderr) {
        console.log(stdout);
        console.log(stderr);
        context.done(null, {exit: true, stdout: stdout, stderr: stderr});
    });
};

关于amazon-web-services - 如何打包或安装整个程序以在AWS Lambda函数中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31749223/

相关文章:

python - 无法在带有 Airflow 的 Jinja 模板中使用 Python 变量

swift - 亚马逊签名创建

Python Scrapy FormRequest 回调没有发生

javascript - Scrapy-Selenium 纽约时报问题

amazon-web-services - 获取现有 lambda 的 AWS cloudformation

amazon-web-services - 亚马逊 lambda 适合网页抓取吗?

python - 如何从亚马逊产品页面中提取 asin

python - AWS lambda ,Python : Call Shell script from Lambda or Linux command

python - AWS : Running Rekognition on DeepLens device

amazon-web-services - 如何在 cloudformation 脚本的目标组资源中包含 lambda 函数版本?