2015-08-14 53 views
3

我可以使用以下函数从AWS Lambda上的nodejs调用我的python。但是,因为我需要特定的python库,我在env目录中创建了一个virutalenv。我压缩了所有东西,并推送到Lambda。但是,当我尝试从虚拟目录调用python时,我得到了一个Permission Denied错误。从AWS lambda上的nodejs调用python - 权限被拒绝

我试图在调用python之前修改Lambda上的chmod权限,但得到了操作不允许的权限。我怎样才能让它运行?

console.log('Loading event'); 

var exec = require('child_process').exec; 

exports.handler = function(event, context) { 

    exec('env/bin/python district.py \'' + JSON.stringify(event) + '\'', function(error, stdout) { 
     var obj = stdout.toString(); 
     context.done(error, obj); 
    }); 
}; 

这里的错误:

{ 
    "errorMessage": "Command failed: /bin/sh: env/bin/python: Permission denied\n", 
    "errorType": "Error", 
    "stackTrace": [ 
    "", 
    "ChildProcess.exithandler (child_process.js:658:15)", 
    "ChildProcess.emit (events.js:98:17)", 
    "maybeClose (child_process.js:766:16)", 
    "Process.ChildProcess._handle.onexit (child_process.js:833:5)" 
    ] 
} 

回答

0

错误最可能的信号是python.exe没有设置可执行位。但是,请注意,即使您设置了x位,它也将不起作用:.exe文件是Windows可执行文件,它们不起作用。

Note, this virtual env was created in windows. I also attempted from Linux in the i.e. env/bin/python district.py with no help.

env/bin/python是正确的命令。如果仍然收到“权限被拒绝”错误,则表示文件python缺少可执行位。

在AWS兰巴运行环境,你不能改变文件的权限,也无法改变用户,因此创建的.zip时,必须设置可执行位(或任何其他许可位需要)档案

综上所述:

  1. 在Linux计算机上,使用Linux的可执行文件。
  2. 在创建归档之前设置可执行文件的可执行位。
+0

谢谢。点#1应该对我来说很明显。第二点我尝试过但也许我做错了? 'chmod + x env/bin/python'我得到这个错误:'chmod:改变env/bin/python的权限:不允许操作' – xcalx9

+0

如果我尝试'sudo chmod + x env/bin/python'我得到* * sudo:命令未找到** – xcalx9

+0

**不允许的操作:**您使用的是什么文件系统?显然不是默认的Linux文件系统(ext2,ext3或ext4)。 ** sudo:命令未找到:**您使用的是什么分配?并非所有的发行版都安装并配置了sudo。你可能想用'su'代替。 –

0

尝试了这一点:

exec('python district.py "'+ JSON.stringify(event) +'"', function(error, stdout) { 
    console.log('Python returned: ' + stdout + '.'); 
    context.done(error, stdout); 
}); 

亚马逊有一个教程在LAMBDA使用Python here

+0

试图调用virtualenv python envrionment。此代码确实可以调用安装在AWS Linux实例上的python,但试图找到合理的方法来安装python库依赖项 – xcalx9