lambda要求bootstrap文件名全小写无扩展名、权限755、位于zip顶层,且必须goos=linux交叉编译,运行时选provided.al2/al2023,入口调用lambda.start()。

bootstrap 文件名和权限必须严格匹配
Lambda 运行时在启动时硬编码查找根目录下的 bootstrap 文件,大小写、拼写、路径缺一不可。哪怕你编译出的是 main 或 bootstrap.bin,上传后都会报 fork/exec /var/task/bootstrap: no such file or directory——这不是文件真丢了,而是运行时根本没找到约定入口。
- 可执行文件必须命名为
bootstrap(全小写,无扩展名) - 必须设为可执行权限:
chmod 755 bootstrap - 必须放在 ZIP 包顶层,不能套在子目录里(如
dist/bootstrap就不行) - Windows 用户用 GUI 工具打包时容易丢权限,建议用命令行:
zip main.zip bootstrap
GOOS=linux 交叉编译是硬性前提
本地 macOS 或 Windows 上直接 go build 出来的二进制是 darwin/amd64 或 windows/amd64,Lambda 容器无法加载,会触发 exec format error。这不是配置问题,是架构不兼容的底层错误。
- 必须显式指定:
GOOS=linux GOARCH=amd64 go build -o bootstrap main.go(x86_64 架构) - 若用 Graviton2(ARM64),改用:
GOOS=linux GOARCH=arm64 go build -o bootstrap main.go - 加
-ldflags="-s -w"去符号表,避免超 50MB 部署包限制 - 含 cgo 的项目需同步设置
CGO_ENABLED=1和对应平台的CC_FOR_TARGET
lambda.Start() 是唯一合法入口,不能省略或替换
Go Lambda 不走传统 main() 函数,而是由 runtime 直接 exec 你的 bootstrap 二进制,并期望它内部调用 lambda.Start() 启动事件循环。漏掉这句,函数不会报错,只会卡死在冷启动阶段,日志全空,只看到 Task timed out。
- handler 签名必须是:
func(context.Context, TIn) (TOut, error)或func(context.Context, []byte) ([]byte, error) - 别写普通
main()然后自己起 goroutine 轮询——Lambda 不给你这个权限 - 测试时可用
lambda.StartHandler()模拟,但线上必须用lambda.Start(Handler) - 环境变量、超时、RequestID 等上下文信息必须从
context.Context里取,别用os.Getenv()
部署包格式与运行时选择要对齐
Go 函数只能使用 provided.al2 或 provided.al2023 这类自定义运行时,官方 go1.x 运行时已弃用。选错运行时类型,上传 ZIP 后函数直接无法触发,控制台报 “Invalid runtime” 或初始化失败。
- 创建/更新函数时,
--runtime参数必须设为provided.al2或provided.al2023 - ZIP 包内只需
bootstrap二进制,不要放go.mod、main.go或其他源码 - 若用 AWS CLI 部署:
aws lambda update-function-code --function-name myfunc --zip-file fileb://main.zip - 别在 handler 外部初始化 DB 连接或 SDK 客户端——冷启动时做一次即可,但记得复用,别 defer 关闭
ctx,否则超时后进程被杀,连错误日志都来不及刷出。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











