【问题标题】:call python from nodejs on AWS lambda - permission denied从 AWS lambda 上的 nodejs 调用 python - 权限被拒绝
【发布时间】:2015-08-14 16:50:45
【问题描述】:

我可以使用以下函数从 AWS Lambda 上的 nodejs 调用我的 python。但是,因为我需要特定的 python 库,所以我在 env 目录中创建了一个virutalenv。我把所有东西都拉上拉链,然后推到 Lambda。但是当我尝试从虚拟目录调用 python 时,我得到一个 Permission Denied 错误。

我在调用 python 之前尝试修改 Lambda 上的 chmod 权限,但得到了 Operation Not Permitted。我怎样才能让它运行?

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)"
  ]
}

【问题讨论】:

    标签: python linux node.js amazon-web-services aws-lambda


    【解决方案1】:

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

    注意,这个虚拟环境是在 windows 中创建的。我还尝试在 Linux 中使用 env/bin/python district.py,但没有任何帮助。

    env/bin/python 是正确的命令。如果仍然出现 Permission Denied 错误,则表示文件 python 缺少可执行位。

    在 AWS Lamba 运行环境中,您不能更改文件的权限,也不能更改用户,因此您必须设置可执行位(或您需要的任何其他权限位)创建 .zip 存档时

    总结一下:

    1. 在 Linux 机器上,使用 Linux 可执行文件。
    2. 在创建存档之前设置可执行文件的可执行位。

    【讨论】:

    • 谢谢。第 1 点对我来说应该是显而易见的。第二点我尝试过,但也许我做错了? chmod +x env/bin/python我得到这个错误:chmod: changing permissions of env/bin/python: Operation not permitted
    • 如果我尝试 sudo chmod +x env/bin/python 我得到 sudo: command not found
    • 不允许操作:您使用的是什么文件系统?显然不是默认的 Linux 文件系统(ext2、ext3 或 ext4)。 sudo: command not found: 你使用的是什么发行版?并非所有发行版都安装和配置了 sudo。您可能想改用su
    • 更正:即使您没有编辑文件的权限,chmod 也可能会失败并显示“不允许操作”。那么ls -l env/bin/python 说了什么?
    • 输出:-rw-rw-r-- 1 slicer 497 5120 Aug 13 15:30 env/bin/python\n
    【解决方案2】:

    试试这个:

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

    亚马逊有一个在 Lambda 中使用 Python 的教程here

    【讨论】:

    • 试图调用 virtualenv python 环境。此代码确实可以调用安装在 AWS linux 实例上的 python,但试图找到一种合理的方式来安装 python 库依赖项
    猜你喜欢
    • 1970-01-01
    • 2021-09-30
    • 2017-09-18
    • 2020-12-07
    • 2022-06-17
    • 1970-01-01
    • 2023-03-06
    • 2016-07-03
    • 2021-07-30
    相关资源
    最近更新 更多