如何在Golang多模块项目中从SAM模板目录外执行invoke?
解决Golang多模块项目SAM local invoke找不到bootstrap的问题
1. 问题根源
当你用sam build -t tests/helloworld/template.yaml构建时,产物默认生成在当前工作目录的.sam/build下,但执行sam local invoke时,SAM会默认以模板所在的tests/helloworld/作为工作目录,导致无法找到上层目录的构建产物,进而缺失/var/task/bootstrap文件(Go Lambda运行时的入口文件)。
2. 可行解决方案
方案一:绑定构建目录到模板所在路径
执行build时,通过--build-dir参数指定构建产物输出到模板目录下,让invoke时能正确匹配路径:
sam build -t tests/helloworld/template.yaml --build-dir tests/helloworld/.sam/build
之后直接执行invoke:
sam local invoke -t tests/helloworld/template.yaml
方案二:直接使用build生成的模板文件
build完成后,.sam/build/目录下会生成一个包含正确代码路径的模板文件,直接用它执行invoke:
sam local invoke -t .sam/build/template.yaml
注:此方法需确保已执行过sam build -t tests/helloworld/template.yaml。
方案三:检查并修正SAM模板配置
确保模板中Go函数的配置符合要求:
CodeUri需填写相对于模板文件的应用模块路径(比如你的应用在根目录helloworld/,模板在tests/helloworld/,则CodeUri设为../../helloworld/)Runtime设为provided.al2,Handler设为bootstrapMetadata里的BuildMethod指定为go1.x
示例模板片段:
Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: CodeUri: ../../helloworld/ Handler: bootstrap Runtime: provided.al2 Metadata: BuildMethod: go1.x
方案四:验证bootstrap文件生成
build完成后,手动检查.sam/build/[你的函数名]/目录下是否存在bootstrap文件。如果没有,进入应用模块目录单独执行Go构建命令测试:
cd helloworld go build -o bootstrap main.go
确认能生成bootstrap后,再排查SAM构建配置是否有误。
内容的提问来源于stack exchange,提问作者Kuldeep Yadav
相关产品推荐
相关产品推荐

