Golang调用AWS Lambda时传递2个参数的正确实现方法
Go调用AWS Lambda传递多参数的正确实现
InvokeInput的Payload字段仅接受单份JSON序列化后的字节数组,你之前尝试的新增多Payload字段、拼接序列化字节数组的方式都不符合Lambda的参数传递规范,正确的做法是将所有参数封装到同一个复合结构中,再整体做JSON序列化。
1. 调用端实现步骤
- 首先定义参数封装结构体,也可以直接使用
map[string]interface{},自定义结构体更便于后续维护:
type LambdaSearchParams struct { SearchValue string `json:"search_value"` SearchField string `json:"search_field"` }
- 修改原调用逻辑,将两个参数封装后再序列化:
func (s *resourceService) GetProjectByField(ctx context.Context, searchValue string, searchField string) projectStruct { // 封装两个参数到统一结构体 params := LambdaSearchParams{ SearchValue: searchValue, SearchField: searchField, } // 整体序列化参数 payload, err := json.Marshal(params) if err != nil { panic(err.Error()) } util.Logger.Debugf("Payload: %s", payload) invokeOutput, err := s.lambdaSvc.Invoke(ctx, &lambda.InvokeInput{ FunctionName: &s.getProject, InvocationType: "RequestResponse", Payload: payload, }) if err != nil { panic(err.Error()) } var project projectStruct err = json.Unmarshal(invokeOutput.Payload, &project) if err != nil { panic(err.Error()) } util.Logger.Debugf("Invocation output [%v]", invokeOutput) return project }
2. Lambda端对应修改
需要同步修改Lambda函数的入参解析逻辑,直接反序列化收到的Payload为对应的结构即可,如果你的Lambda也是Go写的,参考示例:
type LambdaSearchParams struct { SearchValue string `json:"search_value"` SearchField string `json:"search_field"` } func handler(ctx context.Context, params LambdaSearchParams) (projectStruct, error) { // 直接调用params.SearchValue和params.SearchField执行业务逻辑即可 // ... }
如果你的Lambda是其他语言开发的,只要对应把收到的event解析为包含search_value和search_field两个字段的对象即可。
注意:调用端和Lambda端的JSON字段名必须完全对应,否则会出现参数解析为空的问题。
内容的提问来源于stack exchange,提问作者Julian Cisneros
相关产品推荐
相关产品推荐

