func (infra *Infrastructure) createLambdaFunction(svc *lambda.Lambda, roleArn string, payload []byte) error { function, err := svc.CreateFunction(&lambda.CreateFunctionInput{ Code: &lambda.FunctionCode{ ZipFile: payload, }, FunctionName: aws.String("goad"), Handler: aws.String("index.handler"), Role: aws.String(roleArn), Runtime: aws.String("nodejs"), MemorySize: aws.Int64(1536), Publish: aws.Bool(true), Timeout: aws.Int64(300), }) if err != nil { if awsErr, ok := err.(awserr.Error); ok { // Calling this function too soon after creating the role might // fail, so we should retry after a little while. // TODO: limit the number of retries. if awsErr.Code() == "InvalidParameterValueException" { time.Sleep(time.Second) return infra.createLambdaFunction(svc, roleArn, payload) } } return err } return createLambdaAlias(svc, function.Version) }
func createLambdaFunction(l *lambda.Lambda, code []byte, runtime, role, name, handler string, timeout int) error { func_input := &lambda.CreateFunctionInput{ Code: &lambda.FunctionCode{ZipFile: code}, Runtime: aws.String(runtime), Role: aws.String(role), FunctionName: aws.String(name), Handler: aws.String(handler), Timeout: aws.Int64(int64(timeout)), } resp, err := l.CreateFunction(func_input) if err != nil { if err.(awserr.Error).Code() == "ResourceConflictException" { log.Println("Function already exists, trying to update code") input := &lambda.UpdateFunctionCodeInput{ FunctionName: aws.String(name), ZipFile: code, } resp, err = l.UpdateFunctionCode(input) if err != nil { log.Println("Could not update function code", err) return err } configInput := &lambda.UpdateFunctionConfigurationInput{ FunctionName: aws.String(name), Handler: aws.String(handler), Timeout: aws.Int64(int64(timeout)), } resp, err = l.UpdateFunctionConfiguration(configInput) if err != nil { log.Println("Could not update function configuration", err) return err } } else { return err } } log.Println(resp) return nil }