部署Go语言AWS Lambda函数遇bootstrap找不到错误的技术问询
解决AWS Lambda自定义运行时找不到bootstrap的问题
问题原因
使用Runtime_PROVIDED_AL2()自定义运行时的Lambda函数,默认会在/var/task(即打包后的代码根目录)下寻找名为bootstrap的可执行文件。你的情况是bootstrap存在于子目录stock-scheduler/intraday/1min/中,且Handler字段在自定义运行时中不生效(Lambda会忽略该字段),因此Lambda无法找到启动文件。
解决方案
方案1:将bootstrap输出到代码根目录
修改构建命令,把编译后的二进制文件直接输出到src目录根路径:
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o src/bootstrap src/stock-scheduler/intraday/1min/bootstrap.go
然后调整CDK配置,Handler字段可以设为任意值(自定义运行时会忽略它):
IntradaySchedulerLfn := awslambda.NewFunction(stack, &name, &awslambda.FunctionProps{ FunctionName: jsii.String(name), Runtime: awslambda.Runtime_PROVIDED_AL2(), Code: awslambda.AssetCode_FromAsset(jsii.String("src"), nil), Handler: jsii.String("ignored"), // 自定义运行时忽略该字段 Timeout: awscdk.Duration_Seconds(jsii.Number(300)), Vpc: vpcDetails.VPC, SecurityGroups: &[]awsec2.ISecurityGroup{ vpcDetails.DefaultVPCSG, }, Environment: &map[string]*string{ "ENVIRONMENT": jsii.String("prod"), "ALPHAVANTAGE_API_KEY": jsii.String("89VZ0I4T4ZB424ED"), }, MemorySize: jsii.Number(256), LoggingFormat: awslambda.LoggingFormat_JSON, Tracing: awslambda.Tracing_ACTIVE, })
这样打包后bootstrap会位于/var/task/bootstrap,Lambda能直接找到并执行。
方案2:通过Command指定自定义bootstrap路径
如果不想改变二进制文件的输出位置,可以在CDK配置中添加Command属性,明确告诉Lambda执行子目录中的bootstrap:
IntradaySchedulerLfn := awslambda.NewFunction(stack, &name, &awslambda.FunctionProps{ FunctionName: jsii.String(name), Runtime: awslambda.Runtime_PROVIDED_AL2(), Code: awslambda.AssetCode_FromAsset(jsii.String("src"), nil), Handler: jsii.String("ignored"), Command: &[]*string{jsii.String("./stock-scheduler/intraday/1min/bootstrap")}, // 指定启动命令 Timeout: awscdk.Duration_Seconds(jsii.Number(300)), Vpc: vpcDetails.VPC, SecurityGroups: &[]awsec2.ISecurityGroup{ vpcDetails.DefaultVPCSG, }, Environment: &map[string]*string{ "ENVIRONMENT": jsii.String("prod"), "ALPHAVANTAGE_API_KEY": jsii.String("89VZ0I4T4ZB424ED"), }, MemorySize: jsii.Number(256), LoggingFormat: awslambda.LoggingFormat_JSON, Tracing: awslambda.Tracing_ACTIVE, })
此方法无需修改构建命令,Lambda会按照指定路径执行bootstrap,同时保留src/utils/下的共享代码。
补充说明
你之前修改Code路径到子目录能正常运行,是因为此时bootstrap位于打包后的根目录(/var/task/bootstrap),但这种方式会丢失src/utils/下的共享代码,不符合需求。
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

