in cmd/resource/lambda.go [205:260]
func invokeLambda(svc LambdaAPI, functionName *string, event *Event) (*LambdaResponse, error) {
log.Printf("Invoking VPC connector %s for action: %s", *functionName, event.Action)
eventJSON, err := json.Marshal(event)
if err != nil {
return nil, err
}
input := &lambda.InvokeInput{
FunctionName: functionName,
Payload: eventJSON,
}
count := 0
var result *lambda.InvokeOutput
for count <= retryCount {
result, err = svc.Invoke(input)
if err != nil {
if aerr, ok := err.(awserr.Error); ok {
switch aerr.Code() {
case lambda.ErrCodeTooManyRequestsException, lambda.ErrCodeServiceException,
lambda.ErrCodeEC2UnexpectedException, lambda.ErrCodeEC2ThrottledException,
lambda.ErrCodeResourceConflictException, lambda.ErrCodeResourceNotReadyException:
log.Printf("Got error from the lambda: %s. Retrying...", aerr.Code())
time.Sleep(5 * time.Second)
count++
if count >= retryCount {
return nil, AWSError(err)
}
default:
return nil, AWSError(err)
}
} else {
return nil, AWSError(err)
}
} else {
break
}
}
if result.FunctionError != nil {
log.Printf("Remote execution error: %v\n", *result.FunctionError)
errorDetails := make(map[string]string)
err := json.Unmarshal(result.Payload, &errorDetails)
errMsg := ""
if err != nil {
log.Println(err.Error())
errMsg = fmt.Sprintf("[%v] %v", *result.FunctionError, string(result.Payload))
} else {
errMsg = fmt.Sprintf("[%v] %v", errorDetails["errorType"], errorDetails["errorMessage"])
}
return nil, errors.New(errMsg)
}
resp := &LambdaResponse{}
err = json.Unmarshal(result.Payload, resp)
if err != nil {
return nil, err
}
return resp, nil
}