Amplify CLI构建部署Golang运行时Lambda函数失败问题咨询
问题根因
Amplify CLI 默认函数构建流程是为 Node.js、Python 这类解释型语言设计的,不会自动执行Golang跨平台编译步骤,默认直接打包src目录下的源文件作为部署包,完全不符合Golang Lambda需要上传编译后Linux二进制的要求,才会触发两类启动错误。
操作步骤
给目标函数添加自定义构建配置
进入myfunction函数根目录(和go.mod、amplify.state同级),新建amplify.yml文件,写入以下配置:version: 1 frontend: phases: build: commands: - go mod tidy - cd src - GOARCH=amd64 GOOS=linux go build -o ../index index.go - cd .. artifacts: baseDirectory: . files: - index - custom-policies.json - "!src/**" - "!go.mod" - "!go.sum"配置里的
GOARCH=amd64 GOOS=linux是必须参数,保证在Mac环境下编译出Lambda Amazon Linux运行时兼容的二进制文件,和手动编译可正常运行的参数保持一致。修正Lambda运行时配置
打开目录下的tinkusercreate-cloudformation-template.json,找到对应Lambda资源的配置段:- 把
Handler字段值改为index,不要带.go后缀,Golang Lambda的handler就是编译生成的二进制文件名 - 确认
Runtime字段值为你使用的对应Golang运行时版本,比如go1.x - 不要修改其他权限、DynamoDB流触发相关的已有配置
- 把
构建校验
回到Amplify项目根目录执行:amplify function build myfunction构建完成后打开
dist/latest-build.zip检查:压缩包根目录必须存在名为index的无后缀二进制文件,不存在.go源码文件,就说明部署包符合Lambda要求。后续直接执行amplify push就会自动完成构建、部署流程,不需要手动打包上传。
报错对应说明
fork/exec /var/task/index.go: exec format error: PathError null:Handler配置成了
index.go,Lambda尝试直接执行Go源码文件,二进制格式不匹配fork/exec /var/task/index: no such file or directory: PathError null:Handler配置成了
index,但部署包内没有编译好的对应二进制文件,只有源码,找不到执行入口
内容的提问来源于stack exchange,提问作者spi-x-i

