【问题标题】:How to execute an exe file from AWS lambda如何从 AWS lambda 执行 exe 文件
【发布时间】:2019-08-07 05:47:38
【问题描述】:

我编写了一个 lambda 函数,它执行另一个名为 abc.exe 的 exe 文件。

现在我创建了一个 lambda 函数的 zip 并将其上传到 aws。我不确定将“abc.exe”放在哪里

我尝试将它放在同一个 zip 中,但出现以下错误:

exec: "abc": $PATH 中找不到可执行文件:

这是我的 lambda 函数代码:

func HandleLambdaEvent(request Request) (Response, error) {

    fmt.Println("Input", request.Input)
    fmt.Println("Output", request.Output)

    cmd := exec.Command("abc", "-v", "--lambda", request.Input, "--out", request.Output)
    var out bytes.Buffer
    var stderr bytes.Buffer
    cmd.Stdout = &out
    cmd.Stderr = &stderr
    err := cmd.Run()

    if err != nil {
        fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
        return Response{Message: fmt.Sprintf(stderr.String())}, nil
    }
    fmt.Println("Result: " + out.String())

    return Response{Message: fmt.Sprintf(" %s and %s are input and output", request.Input, request.Output)}, nil
}

更新:

试验一:

我将 abc.exe 上传到 s3,然后在我的 HandleLambdaEvent 函数中将其下载到 tmp/ 文件夹。接下来当我在成功下载后尝试访问它时,它显示以下错误:

fork/exec /tmp/abc: 没有这样的文件或目录:

下载 abc.exe 的代码:

file, err2 := os.Create("tmp/abc.exe")
    if err2 != nil {
        fmt.Println("Unable to create file %q, %v", err2)
    }

    defer file.Close()


    sess, _ := session.NewSession(&aws.Config{
        Region: aws.String(region)},
    )

    downloader := s3manager.NewDownloader(sess)

    numBytes, err2 := downloader.Download(file,
        &s3.GetObjectInput{
            Bucket: aws.String(bucket),
            Key:    aws.String("abc.exe"),
        })
    if err2 != nil {
        fmt.Println("Unable to download item %q, %v", fileName, err2)
    }

    fmt.Println("Downloaded", file.Name(), numBytes, "bytes")
    file.Close()

【问题讨论】:

  • 我对 Lambda 几乎一无所知,但您确定您甚至 可以 执行外部二进制文件吗?这对我来说似乎违反直觉,就像它违反了 Lambda 的观点。
  • .exe 文件是什么类型的文件?它是 Windows 应用吗?
  • @Flimzy 我也不确定。这对我来说也是反复试验。但是要检查 lambda 是否可以执行二进制文件,首先我需要一种从 lambda 访问它的方法:)
  • 总的来说,我怀疑你的方向是正确的,但最直接的问题是.exe 在 Linux 中从未被暗示。完整的文件名,例如exec.Command("abc.exe", ... 将是必需的。

标签: amazon-web-services go aws-lambda aws-sdk


【解决方案1】:

你确定你甚至可以执行外部二进制文件吗?这对我来说似乎违反直觉,就像它违反了 Lambda 的观点

完全可以接受。查看 AWS Compute 博客上的 Running Arbitrary Executables in AWS Lambda

我不确定将“abc.exe”放在哪里

在 Lambda 上运行可执行文件将它们打包到您上传的 ZIP 文件中。然后做类似的事情

exec.Command(path.Join(os.GetEnv("LAMBDA_TASK_ROOT"), "abc.exe"))

.exe 文件是什么类型的文件?它是 Windows 应用吗?

您将无法在 Lambda 上运行 Windows 应用程序。链接的博客文章说:如果您编译自己的二进制文件,请确保它们是静态链接的或为匹配的 Amazon Linux 版本构建的

【讨论】:

  • Lambda 函数可用的环境变量docs.aws.amazon.com/lambda/latest/dg/…
  • 如何使用命令行参数运行可执行文件?我在 python 中做类似的事情,并且能够通过 subprocess.Popen(args) where args = "./abc.exe" 运行可执行文件。我可以在 args 列表中添加另一个元素吗?
猜你喜欢
  • 2018-09-01
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 2023-04-04
  • 1970-01-01
  • 2010-12-27
相关资源
最近更新 更多