Go工作区下AWS SAM build provided.al2构建及文件拷贝问题
解决Go Workspace多Lambda项目SAM构建后的文件拷贝问题
问题背景
用go.work管理多Go语言Lambda项目,最初在函数目录编写Makefile时本地构建正常,但执行sam build时因找不到外部user模块报错。将go.work、template.yaml和Makefile移到项目根目录后构建成功,但需要确保构建产物(bootstrap)正确拷贝到SAM的构建目录。
解决方案
1. 调整根目录Makefile的构建逻辑
修改根目录的Makefile,针对每个Lambda函数,先进入对应函数目录完成构建,再将产物复制到SAM提供的$(ARTIFACTS_DIR)目录:
build-UserPutFunction: cd lambda/user/user_put && \ GOOS=linux GOARCH=amd64 go build -o bootstrap && \ cp bootstrap $(ARTIFACTS_DIR)/
- 通过
cd进入函数目录,保证构建上下文与本地构建一致 - 直接在
go build前设置环境变量(Linux/WSL环境适用,Windows环境可替换为set GOOS=linux && set GOARCH=amd64 && go build...) - 利用SAM自动注入的
$(ARTIFACTS_DIR)变量,将构建好的bootstrap复制到SAM指定的构建产物目录
2. 确保template.yaml配置正确
保持函数的CodeUri指向函数源码目录,并通过Metadata指定SAM使用根目录的Makefile构建:
UserPutFunction: Type: AWS::Serverless::Function Properties: CodeUri: lambda/user/user_put Handler: bootstrap Runtime: provided.al2 Metadata: BuildMethod: make
BuildMethod: make用于告知SAM调用根目录Makefile中对应build-<FunctionName>的构建目标
3. 验证go.work的模块包含
确保根目录的go.work正确包含所有需要的模块(包括Lambda函数外的共享模块):
go 1.21 use ( ./lambda/user/user_put ./internal/user # 替换为你的外部user模块实际路径 )
构建验证
执行sam build命令,SAM会自动调用根目录Makefile的对应构建目标,将bootstrap拷贝到正确的构建目录,之后即可正常进行部署或测试操作。
内容的提问来源于stack exchange,提问作者bokobaba
相关产品推荐
相关产品推荐

