diff --git a/pkg/tsdb/cloudwatch/cloudwatch.go b/pkg/tsdb/cloudwatch/cloudwatch.go index ddff020b694..16d89678b01 100644 --- a/pkg/tsdb/cloudwatch/cloudwatch.go +++ b/pkg/tsdb/cloudwatch/cloudwatch.go @@ -174,6 +174,23 @@ func (e *cloudWatchExecutor) getRequestContext(ctx context.Context, pluginCtx ba }, nil } +// getRequestContextOnlySettings is useful for resource endpoints that are called before auth has been configured such as external-id that need access to settings but nothing else +func (e *cloudWatchExecutor) getRequestContextOnlySettings(ctx context.Context, pluginCtx backend.PluginContext, _ string) (models.RequestContext, error) { + instance, err := e.getInstance(ctx, pluginCtx) + if err != nil { + return models.RequestContext{}, err + } + + return models.RequestContext{ + OAMAPIProvider: nil, + MetricsClientProvider: nil, + LogsAPIProvider: nil, + EC2APIProvider: nil, + Settings: instance.Settings, + Logger: e.logger.FromContext(ctx), + }, nil +} + func (e *cloudWatchExecutor) CallResource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error { ctx = instrumentContext(ctx, "callResource", req.PluginContext) return e.resourceHandler.CallResource(ctx, req, sender) diff --git a/pkg/tsdb/cloudwatch/resource_handler.go b/pkg/tsdb/cloudwatch/resource_handler.go index e950bd4d02c..9107a76cb5c 100644 --- a/pkg/tsdb/cloudwatch/resource_handler.go +++ b/pkg/tsdb/cloudwatch/resource_handler.go @@ -25,7 +25,7 @@ func (e *cloudWatchExecutor) newResourceMux() *http.ServeMux { mux.HandleFunc("/accounts", routes.ResourceRequestMiddleware(routes.AccountsHandler, e.logger, e.getRequestContext)) mux.HandleFunc("/namespaces", routes.ResourceRequestMiddleware(routes.NamespacesHandler, e.logger, e.getRequestContext)) mux.HandleFunc("/log-group-fields", routes.ResourceRequestMiddleware(routes.LogGroupFieldsHandler, e.logger, e.getRequestContext)) - mux.HandleFunc("/external-id", routes.ResourceRequestMiddleware(routes.ExternalIdHandler, e.logger, e.getRequestContext)) + mux.HandleFunc("/external-id", routes.ResourceRequestMiddleware(routes.ExternalIdHandler, e.logger, e.getRequestContextOnlySettings)) mux.HandleFunc("/regions", routes.ResourceRequestMiddleware(routes.RegionsHandler, e.logger, e.getRequestContext)) // remove this once AWS's Cross Account Observability is supported in GovCloud mux.HandleFunc("/legacy-log-groups", handleResourceReq(e.handleGetLogGroups, e.logger)) diff --git a/pkg/tsdb/cloudwatch/routes/external_id.go b/pkg/tsdb/cloudwatch/routes/external_id.go index 5361cbdda76..159f8cd81fb 100644 --- a/pkg/tsdb/cloudwatch/routes/external_id.go +++ b/pkg/tsdb/cloudwatch/routes/external_id.go @@ -14,8 +14,8 @@ type ExternalIdResponse struct { ExternalId string `json:"externalId"` } -func ExternalIdHandler(ctx context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) { - reqCtx, err := reqCtxFactory(ctx, pluginCtx, "default") +func ExternalIdHandler(ctx context.Context, pluginCtx backend.PluginContext, reqCtxBeforeAuth models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) { + reqCtx, err := reqCtxBeforeAuth(ctx, pluginCtx, "") if err != nil { return nil, models.NewHttpError("error in ExternalIdHandler", http.StatusInternalServerError, err) }