3434# - User is auto-assigned to the Grafana Team. Done.
3535# ============================================================
3636
37+ # ---- Wait for Grafana to be accessible -----------------------
38+ # The Grafana provider needs the API to be reachable via HTTPS.
39+ # This resource waits for the ingress, certificate, and DNS to be ready
40+ # before Terraform tries to create teams, datasources, and folders.
41+
42+ resource "null_resource" "wait_for_grafana" {
43+ provisioner "local-exec" {
44+ command = <<- EOT
45+ echo "Waiting for Grafana to be accessible at ${ var . grafana_url } ..."
46+ for i in {1..60}; do
47+ if curl -k -s -o /dev/null -w "%%{http_code}" ${ var . grafana_url } /api/health | grep -q "200"; then
48+ echo "✅ Grafana is ready!"
49+ exit 0
50+ fi
51+ echo "Attempt $i/60: Grafana not ready yet, waiting 10s..."
52+ sleep 10
53+ done
54+ echo "❌ ERROR: Grafana did not become accessible after 10 minutes"
55+ exit 1
56+ EOT
57+ }
58+
59+ depends_on = [
60+ helm_release . grafana ,
61+ kubernetes_ingress_v1 . monitoring_stack
62+ ]
63+ }
64+
3765# ---- Grafana Teams (one per tenant) --------------------------
3866# Each team is linked to the matching Keycloak group via team_sync.
3967# Grafana will add any user whose JWT "groups" claim contains the
@@ -44,7 +72,10 @@ resource "grafana_team" "tenants" {
4472
4573 name = " ${ each . key } -team"
4674
47- depends_on = [helm_release . grafana ]
75+ depends_on = [
76+ helm_release . grafana ,
77+ null_resource. wait_for_grafana
78+ ]
4879}
4980
5081# ---- Tenant Datasources (Loki) --------------------------------
@@ -74,7 +105,10 @@ resource "grafana_data_source" "loki" {
74105 ]
75106 }
76107
77- depends_on = [helm_release . grafana ]
108+ depends_on = [
109+ helm_release . grafana ,
110+ null_resource. wait_for_grafana
111+ ]
78112}
79113
80114# ---- Tenant Datasources (Mimir) --------------------------------
@@ -102,7 +136,10 @@ resource "grafana_data_source" "mimir" {
102136 ]
103137 }
104138
105- depends_on = [helm_release . grafana ]
139+ depends_on = [
140+ helm_release . grafana ,
141+ null_resource. wait_for_grafana
142+ ]
106143}
107144
108145# ---- Tenant Datasources (Prometheus) --------------------------
@@ -133,7 +170,10 @@ resource "grafana_data_source" "prometheus" {
133170 ]
134171 }
135172
136- depends_on = [helm_release . grafana ]
173+ depends_on = [
174+ helm_release . grafana ,
175+ null_resource. wait_for_grafana
176+ ]
137177}
138178
139179# ---- Tenant Datasources (Tempo) --------------------------------
@@ -171,7 +211,10 @@ resource "grafana_data_source" "tempo" {
171211 ]
172212 }
173213
174- depends_on = [helm_release . grafana ]
214+ depends_on = [
215+ helm_release . grafana ,
216+ null_resource. wait_for_grafana
217+ ]
175218}
176219
177220# ---- Datasource Permissions ------------------------------------
@@ -191,7 +234,10 @@ resource "grafana_data_source_permission" "loki" {
191234 permission = " Query"
192235 }
193236
194- depends_on = [helm_release . grafana ]
237+ depends_on = [
238+ helm_release . grafana ,
239+ null_resource. wait_for_grafana
240+ ]
195241}
196242
197243resource "grafana_data_source_permission" "mimir" {
@@ -203,7 +249,10 @@ resource "grafana_data_source_permission" "mimir" {
203249 permission = " Query"
204250 }
205251
206- depends_on = [helm_release . grafana ]
252+ depends_on = [
253+ helm_release . grafana ,
254+ null_resource. wait_for_grafana
255+ ]
207256}
208257
209258resource "grafana_data_source_permission" "prometheus" {
@@ -215,7 +264,10 @@ resource "grafana_data_source_permission" "prometheus" {
215264 permission = " Query"
216265 }
217266
218- depends_on = [helm_release . grafana ]
267+ depends_on = [
268+ helm_release . grafana ,
269+ null_resource. wait_for_grafana
270+ ]
219271}
220272
221273resource "grafana_data_source_permission" "tempo" {
@@ -227,7 +279,10 @@ resource "grafana_data_source_permission" "tempo" {
227279 permission = " Query"
228280 }
229281
230- depends_on = [helm_release . grafana ]
282+ depends_on = [
283+ helm_release . grafana ,
284+ null_resource. wait_for_grafana
285+ ]
231286}
232287
233288# ---- Dashboard Folders -----------------------------------------
@@ -240,7 +295,10 @@ resource "grafana_folder" "tenants" {
240295
241296 title = " ${ title (each. key )} Dashboards"
242297
243- depends_on = [helm_release . grafana ]
298+ depends_on = [
299+ helm_release . grafana ,
300+ null_resource. wait_for_grafana
301+ ]
244302}
245303
246304resource "grafana_folder_permission" "tenants" {
@@ -253,7 +311,10 @@ resource "grafana_folder_permission" "tenants" {
253311 permission = " Edit" # Team members can create and edit dashboards in their folder
254312 }
255313
256- depends_on = [helm_release . grafana ]
314+ depends_on = [
315+ helm_release . grafana ,
316+ null_resource. wait_for_grafana
317+ ]
257318}
258319
259320# ---- OSS Team Sync Workaround (Option 3) ----
0 commit comments