从AWS lambda中的nodejs执行dotnet core 1.0控制台应用程序时出错

时间:2016-04-20 15:28:05

标签: .net node.js amazon-web-services asp.net-core aws-lambda

我正在尝试在AWS lambda中运行dotnet核心1.0控制台应用程序。这只是我为了兴趣而做的事情,但是我遇到了一些问题。

我的dotnet核心应用程序如下所示:

using System;

namespace ConsoleApplication
{
    public class Program
    {
        public static int Main(string[] args)
        {
            Console.WriteLine("Hello from dotnet!");
            return 0;
        }
    }
}

我使用以下方法在Ubuntu 14.04上编译了dotnet应用程序:

dotnet build --native --output out --framework dnxcore50

这给了我一个可以在Linux上运行的本机应用程序。这一切都有效!

从这里开始,我想知道是否可以在AWS lambda中运行。由于lambda不支持dotnet,我发现一些nodejs来执行我的dotnet应用程序:

var exec = require('child_process').exec;
exports.handler = function(event, context) {
    console.log('Hello from nodejs!');
    child = exec("./hwapp", function(error) {
        context.done(error, 'done');
    });
    child.stdout.on('data', console.log);
    child.stderr.on('data', console.error);
};

我通过上传包含我的dotnet core 1.0 app和nodejs文件 - index.js的zip文件创建了一个Lambda函数。当我测试lambda函数时,我收到如下错误:

{
  "errorMessage": "Command failed: /bin/sh -c ./hwapp\n",
  "errorType": "Error",
  "stackTrace": [
    "",
    "ChildProcess.exithandler (child_process.js:213:12)",
    "emitTwo (events.js:87:13)",
    "ChildProcess.emit (events.js:172:7)",
    "maybeClose (internal/child_process.js:821:16)",
    "Process.ChildProcess._handle.onexit (internal/child_process.js:211:5)"
  ]
}

我尝试了很多不同的东西,但是我被困住了。我认为可能是因为在Ubuntu而不是亚马逊Linux上构建了dotnet应用程序,但我真的不确定......有人可以帮助我吗?

感谢。

3 个答案:

答案 0 :(得分:1)

我有完全相同的错误。我怀疑这是因为二进制文件是在Ubuntu上编译的,而不是在Amazon Linux上编译的。

我还设置了亚马逊Linux,AWS Lambda(基于Red Hat)实际运行。但是,构建不成功。这是我收到的错误消息:

[ec2-user@ip-172-31-35-226 helloworld]$ sudo dotnet build
Project helloworld (.NETCoreApp,Version=v1.0) will be compiled because expected outputs are missing
Compiling helloworld for .NETCoreApp,Version=v1.0
/home/ec2-user/helloworld/project.json(7,31): error NU1002: The dependency Microsoft.CodeAnalysis.Common 1.2.0-beta1-20160202-02 does not support framework .NETCoreApp,Version=v1.0.
/home/ec2-user/helloworld/project.json(7,31): error NU1002: The dependency Microsoft.CodeAnalysis.CSharp 1.2.0-beta1-20160202-02 does not support framework .NETCoreApp,Version=v1.0.
/home/ec2-user/helloworld/project.json(7,31): warning NU1007: Dependency specified was Microsoft.NETCore.App >= 1.0.0-rc2-002673 but ended up with Microsoft.NETCore.App 1.0.0-rc2-23910.

Compilation failed.
    1 Warning(s)
    2 Error(s)

Time elapsed 00:00:00.0318055

[ec2-user@ip-172-31-35-226 helloworld]$

消息说在撰写本答案时(2016-5-6),有些依赖项还不支持RHEL。我们可能要等到依赖包支持。

答案 1 :(得分:1)

您可能还遇到了一个问题,即zip上传到lambda的可执行文件未分配linux执行权限。未经此许可,您将无法生成子进程并执行它。

不幸的是,使用Windows上提供的标准zip实用程序很难分配。因此,如果您在Windows机器上构建部署zip,您可能会考虑使用grunt / grunt-contrib-compress和类似于以下内容的grunt配置:

 compress: {
        main: {
            options: {
                archive: 'dist/lambda.zip'
            },
            files: [
                ...
                {src: 'pathToExecutable', mode: 777} //this mode sets the execute flag
            ]
        }
    }

答案 2 :(得分:0)

虽然我无法对.net核心发表评论,但我在lambda中以同样的方式使用golang,并且能够在ubuntu上编译它并在lambda上运行它就好了。我必须在编译之前设置这些参数,然后它才能工作: 设置GOOS = linux 设置GOARCH = amd64