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

Go 获取错误“;fork/exec/var/task/main:没有这样的文件或目录;在执行aws lambda函数时,go,amazon-s3,aws-lambda,handler,Go,Amazon S3,Aws Lambda,Handler,获取错误fork/exec/var/task/main:执行lambda函数时没有这样的文件或目录 我正在使用windows平台在Go中运行和构建代码 我已经完成了以下步骤来部署go aws lambda处理程序: 在windows平台上使用VSCode用go语言编写代码 使用以下命令生成项目:go Build main.go 将main.exe转换为main.zip 使用aws控制台帐户上载了处理程序名为main aws lambda Function的main.zip 已创建测试事件以测试l

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

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

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

  • 在windows平台上使用VSCode用go语言编写代码
  • 使用以下命令生成项目:go Build main.go
  • 将main.exe转换为main.zip
  • 使用aws控制台帐户上载了处理程序名为main aws lambda Function的main.zip
  • 已创建测试事件以测试lambda函数
  • 获取错误“fork/exec/var/task/main:在执行lambda函数时没有这样的文件或目录”
  • 生成命令

    go build main.go
    
    AWS控制台中的详细信息错误

    {
      "errorMessage": "fork/exec /var/task/main: no such file or directory",
      "errorType": "PathError"
    }
    
    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
    
    AWS控制台中的日志输出

    {
      "errorMessage": "fork/exec /var/task/main: no such file or directory",
      "errorType": "PathError"
    }
    
    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
    

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

    set GOOS=linux
    set GOARCH=amd64
    set CGO_ENABLED=0
    
    在此之后,构建项目并将zip文件上载到aws控制台lambda

    像这样

    GOOS=linux-GOARCH=amd64-CGO\u-ENABLED=0 go-build-o main.go


    参考链接:

    可能有两个原因:

  • 您没有在go build中使用GOOS=linux GOARCH=amd64,因此请尝试:

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

  • 您曾经使用golang alpine基础图像构建此程序的一些CI函数,因此尝试使用完整的golang图像


  • 在我的例子中,问题是默认将处理程序设置为“hello”函数

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


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

    按照这些步骤操作,您将不会收到此错误,我正在使用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
    
    上载此代码,并将处理程序名称更改为handler(您在上面创建的可执行文件的名称)


    让我知道这是否有帮助。

    在我的情况下,这与我的围棋设置有关

    当我使用Go版本管理器时,在编译我的项目之前,我必须运行以下命令来指定正确的Go路径

    gvm use go1.x.x
    

    继续编译,然后部署。

    我的案例很奇怪,但我会把它留在这里,以防有人需要它

    我在Docker容器中构建了可执行文件,然后使用
    Docker cp
    将文件放在本地目录中。然后我压缩了可执行文件并部署了它

    显然,
    Docker cp
    创建了一个类似符号链接的文件,而不是一个实际的文件,所以它根本不起作用


    我的解决方案是只使用
    sudo cp
    并将可执行文件复制为另一个文件,这创建了一个物理文件,并进行了部署。

    在我尴尬的情况下,我从外部压缩文件夹,因此我上载的zip中的路径是“folder/main”

    此错误与程序无关;这是一个配置问题。 请尝试在lambda控制台的go运行时设置下提供符合要求的go文件名-

    在我的例子中,我的go lambda编译文件是test,所以将处理程序配置为test,它对我有效


    虽然本例中没有问题,但我认为值得指出的是,可执行文件必须被称为“main”,而不仅仅是代码中的函数。在遵循上述说明时,我发现了这一点。是的,您是对的,可执行文件必须被称为“main”,而不仅仅是代码中的函数。现在可以在“运行时设置”下使用标准的serverless framework boiler代码找到这一点,这就解决了在AWS lambda函数中命名处理程序的错误。一旦遵循了上述步骤,将“处理程序”命名为一个重要步骤。