运行AWS Golang Lambda时出现执行格式错误

40

我有一个Go应用程序,结构如下:

cmd
|
reports
|
main.go

main.go 导入了 internal/reports 包,并且只有一个函数 main(),该函数将调用委托给 aws-lambda-go/lambda.Start() 函数。

代码是通过运行以下命令进行构建(片段):

cd internal/reports && go build handler.go
cd ../..
go build -o reports ../cmd/reports/main.go && chmod +x reports && zip reports.zip reports

reports.zip上传到AWS Lambda,当按下Test按钮时,AWS Lambda会抛出一个错误:

Translated text:

reports.zip上传到AWS Lambda,当按下Test按钮时,AWS Lambda会抛出一个错误:

{
  "errorMessage": "fork/exec /var/task/reports: exec format error",
  "errorType": "PathError"
}

reports 被设置为 Lambda 的 Handler

此外,该代码是在 Ubuntu 14.04 机器上构建的,作为 aws/codebuild/ubuntu-base:14.04 Docker 镜像的一部分,在 AWS CodeBuild 上。尽管错误提示存在跨平台问题,但这里不应该有任何环境问题。

有什么想法吗?

2个回答

82

要构建的话需要使用GOARCH=amd64 GOOS=linux。 无论在哪里构建您的二进制文件,Lambda所运行的二进制文件都是在Amazon Linux上运行。

因此,请尝试使用以下构建命令。

GOARCH=amd64 GOOS=linux go build handler.go


在 Windows 10 中,只有在 "GOOS=" 的情况下才能正常运行 hmm 构建。然后我必须设置 "GOARCH=amd64 GOOS=linux" 才能使 build-lambda-zip.exe 正常工作。 - influent
运行 "go get -u golang.org/x/crypto/md4" 对我来说解决了问题,不确定为什么我必须这样做。 - influent
https://docs.aws.amazon.com/lambda/latest/dg/golang-package.html#golang-package-windows 给出了我在Windows上需要的细节,但是这个答案把我指向了那里。 - Eric D. Johnson
7
许多Amazon文档和在线步骤跳过或忽略了GOARCH=amd64这一部分。如果你使用的是新款Mac M1芯片,这是必需的。 - Dominic O'Connor

37

问题在于main包中未声明main()函数,这是Golang语言语言规范强制要求的。


1
谢谢,鉴于错误信息,这确实很难捕捉到。 - Eric LeBlanc
1
我完全错过了你的评论,浪费了好几个小时!谢谢你的分享。正是这个问题! - Zzeks
我有同样的问题,我也声明了main()函数。 - undefined

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