在AWS Lambda中使用Node.js运行dotnet core 1.0控制台应用程序时出现错误执行。

3
我正在尝试在AWS Lambda中运行一个dotnet core 1.0控制台应用程序。这只是我出于兴趣而做的事情,但是我遇到了一些问题。
我的dotnet core应用程序如下所示:
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,我找到了一些Node.js来执行我的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应用程序和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上构建了dotnet应用程序而不是Amazon Linux,但我真的不确定...有人可以帮帮我吗?
谢谢。

你最终解决了这个问题吗? - Eric J. Smith
3个回答

1
您可能遇到的问题是,您上传到 Lambda 的 zip 文件中的可执行文件没有被分配 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
            ]
        }
    }

1
我遇到了完全相同的错误。我怀疑这是因为二进制文件是在Ubuntu上编译的,而不是在Amazon Linux上。
我也设置了Amazon 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。我们可能需要等待依赖包的支持。


0

虽然我不能评论.NET Core,但我正在以同样的方式在Lambda中使用Golang,并且能够在Ubuntu上进行编译并在Lambda上运行。 我必须在编译之前设置这些参数,然后它就可以工作了: set GOOS=linux set GOARCH=amd64


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接