执行 aws-lambda 函数时出现错误“fork/exec /var/task/main: no such file or directory”

Poo*_*att 24 amazon-s3 handler go aws-lambda

获取错误 fork/exec /var/task/main: 执行 lambda 函数时没有这样的文件或目录。

我正在使用 Windows 平台在 Go 中运行和构建代码。

我已完成以下步骤来部署 go aws-lambda 处理程序:

  1. windows平台用VSCode用go语言编写代码
  2. 使用以下命令构建项目:go build main.go
  3. 将 main.exe 转换为 main.zip
  4. 使用 aws 控制台帐户上传带有处理程序名称 main aws-lambda 函数的 main.zip
  5. 创建测试事件来测试 lambda 函数
  6. 出现错误“fork/exec /var/task/main:执行 lambda 函数时没有这样的文件或目录”
package main

import (
    "fmt"

    "github.com/aws/aws-lambda-go/lambda"
)

// Request represents the requested object
type Request struct {
    ID    int    `json:"ID"`
    Value string `json:"Value"`
}

// Response represents the Response object
type Response struct {
    Message string `json:"Message"`
    Ok      bool   `json:"Ok"`
}

// Handler represents the Handler of lambda
func Handler(request Request) (Response, error) {
    return Response{
        Message: fmt.Sprint("Process Request Id %f", request.ID),
        Ok:      true,
    }, nil
}

func main() {
    lambda.Start(Handler)
}
Run Code Online (Sandbox Code Playgroud)

构建命令

go build main.go
Run Code Online (Sandbox Code Playgroud)

AWS 控制台中的详细错误

{
  "errorMessage": "fork/exec /var/task/main: no such file or directory",
  "errorType": "PathError"
}
Run Code Online (Sandbox Code Playgroud)

AWS 控制台中的日志输出

START RequestId: 9ef206ed-5538-407a-acf0-06673bacf2d7 Version: $LATEST
fork/exec /var/task/main: no such file or directory: PathError
null
END RequestId: 9ef206ed-5538-407a-acf0-06673bacf2d7
REPORT RequestId: 9ef206ed-5538-407a-acf0-06673bacf2d7  Duration: 0.64 ms   Billed Duration: 100 ms Memory Size: 512 MB Max Memory Used: 31 MB  Init Duration: 1.49 ms
Run Code Online (Sandbox Code Playgroud)

小智 18

在我的情况下,问题是默认设置为“ hello ”函数的处理程序。

需要通过 AWS Lambda 视图面板 -> 基本设置 -> 编辑将其更改为“ main ”。

AWS Lambda 函数

  • 现在可以在“运行时设置”下找到它 (2认同)
  • 为什么在 F 中新 Lambda 函数的默认处理程序设置为“hello”?即使是基本教程也让您将所有内容命名为“main”! (2认同)

Poo*_*att 14

在命令提示符下运行以下命令

set GOOS=linux
set GOARCH=amd64
set CGO_ENABLED=0
Run Code Online (Sandbox Code Playgroud)

在此之后,构建您的项目并将 zip 文件上传到 aws 控制台 lambda

像这样

GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o main main.go

参考链接:https : //github.com/aws/aws-lambda-go

  • 虽然在这个例子中这不是问题,但我认为可能值得指出的是,可执行文件必须被称为“main”,而不仅仅是代码中的函数。当我按照上面的说明进行操作时,我发现了这一点。 (7认同)

Wis*_*ter 8

有两个原因可能发生:

  1. 没有在 go build 中使用GOOS=linux GOARCH=amd64,所以试试:

    GOOS=linux GOARCH=amd64 go build -o main main.go

  2. 您曾经使用 golang-alpine 基础映像构建此程序的一些 CI 功能,因此请尝试使用完整的 golang 映像。


小智 7

最近我遇到了类似的问题,我解决了它。正如错误所说,它正在查找具有句柄名称的可执行文件,因此您应该将可执行文件命名为与处理程序相同的名称。

按照以下步骤操作,您将不会收到此错误,我正在使用 PowerShell

> go.exe get -u github.com/aws/aws-lambda-go/cmd/build-lambda-zip # If you do not this have utility earlier
> $env:GOOS = "linux"
> $env:GOARCH = "amd64"
> $env:CGO_ENABLED = "0"
> go build -o .\Handler .\main.go # considering your are in the same directory where your main.go or handler code is present
> ~\Go\Bin\build-lambda-zip.exe -o .\Handler.zip .\Handler
Run Code Online (Sandbox Code Playgroud)

上传此代码,并将处理程序名称更改为 Handler(您在上面创建的可执行文件的名称) 在此处输入图片说明

如果这有帮助,请告诉我。