func makeEventFunc()

in cfn/cfn.go [88:145]


func makeEventFunc(h Handler) eventFunc {
	return func(ctx context.Context, event *event) (response, error) {
		ps := credentials.SessionFromCredentialsProvider(&event.RequestData.ProviderCredentials)
		m := metrics.New(cloudwatch.New(ps), event.ResourceType)
		once.Do(func() {
			l, err := logging.NewCloudWatchLogsProvider(
				cloudwatchlogs.New(ps),
				event.RequestData.ProviderLogGroupName,
			)
			if err != nil {
				log.Printf("Error: %v, Logging to Stdout", err)
				m.PublishExceptionMetric(time.Now(), event.Action, err)
				l = os.Stdout
			}
			// Set default logger to output to CWL in the provider account
			logging.SetProviderLogOutput(l)
		})
		re := newReportErr(m)
		if err := scrubFiles("/tmp"); err != nil {
			log.Printf("Error: %v", err)
			m.PublishExceptionMetric(time.Now(), event.Action, err)
		}
		handlerFn, err := router(event.Action, h)
		log.Printf("Handler received the %s action", event.Action)
		if err != nil {
			return re.report(event, "router error", err, serviceInternalError)
		}
		if err := validateEvent(event); err != nil {
			return re.report(event, "validation error", err, invalidRequestError)
		}
		rctx := handler.RequestContext{
			StackID:    event.StackID,
			Region:     event.Region,
			AccountID:  event.AWSAccountID,
			StackTags:  event.RequestData.StackTags,
			SystemTags: event.RequestData.SystemTags,
			NextToken:  event.NextToken,
		}
		request := handler.NewRequest(
			event.RequestData.LogicalResourceID,
			event.CallbackContext,
			rctx,
			credentials.SessionFromCredentialsProvider(&event.RequestData.CallerCredentials),
			event.RequestData.PreviousResourceProperties,
			event.RequestData.ResourceProperties,
		)
		p := invoke(handlerFn, request, m, event.Action)
		r, err := newResponse(&p, event.BearerToken)
		if err != nil {
			log.Printf("Error creating response: %v", err)
			return re.report(event, "Response error", err, unmarshalingError)
		}
		if !isMutatingAction(event.Action) && r.OperationStatus == handler.InProgress {
			return re.report(event, "Response error", errors.New("READ and LIST handlers must return synchronous"), invalidRequestError)
		}
		return r, nil
	}
}