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
}
}