func invokeLambda()

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
}