3.3 KiB
Cloud Build Smoke-Test Post-Mortem — 10. juni 2026
Lagt til av Perplexity AI etter halv dag med debugging. Ikke gjenta disse feilene.
Symptom
Cloud Build smoke-test returnerte HTTP 404 på /health for alle forsøk, selv etter at Cloud Run-tjenesten var bekreftet live og svarte 200 fra utvikler-VM.
Root Causes (i kronologisk rekkefølge)
1. --audiences flagg på identity token
# FEIL — returnerer tomt token for service accounts:
TOKEN=$(gcloud auth print-identity-token --audiences="$BASE_URL")
# RIKTIG:
TOKEN=$(gcloud auth print-identity-token)
Konsekvens: Token var tom streng. Authorization-header ble sendt uten gyldig token.
2. Tom BASE_URL fra udefinert substitusjon
# FEIL — $_CLOUD_RUN_URL var ikke definert i cloudbuild.yaml:
BASE_URL="https://${_CLOUD_RUN_URL}"
# → curl https:///health → feil host
Konsekvens: curl traff feil URL fullstendig.
3. gcloud run services describe returnerer feil URL
# FEIL — returnerer intern URL (f.eks. zjbqp3prqq-uc.a.run.app), ikke kanonisk:
BASE_URL=$(gcloud run services describe osvauco-agent \
--format='value(status.url)')
# RIKTIG — hardkod kanonisk URL:
BASE_URL="https://osvauco-agent-357036551735.us-central1.run.app"
Konsekvens: Smoke-test traff en URL som ikke var knyttet til riktig Cloud Run-instans.
4. Cloud Build SA manglet roles/run.invoker
Cloud Run returnerer 404 (ikke 401/403) for uautoriserte kallere — designet for å skjule tjenestens eksistens. Cloud Build service account hadde ikke blitt gitt invoker-rettigheter.
# FIX — kjør én gang per ny Cloud Run-tjeneste:
gcloud run services add-iam-policy-binding osvauco-agent \
--region=us-central1 \
--member="serviceAccount:357036551735@cloudbuild.gserviceaccount.com" \
--role="roles/run.invoker" \
--project=propane-will-491900-m5
Konsekvens: Alle autentiserte kall fra Cloud Build ble avvist med 404.
Diagnose-metode som fungerte
La til verbose curl -v med og uten auth direkte i smoke-test steget:
echo "=== Med auth ==="
curl -v -H "Authorization: Bearer $TOKEN" "$BASE_URL/health" 2>&1
echo "=== Uten auth ==="
curl -v "$BASE_URL/health" 2>&1
Dette avslørte:
server: Google Frontendi response header → ikke appens 404, men GCP frontend- Response body:
The requested URL /health was not found on this server→ IAM-blokkering - Token prefix: tom →
--audiencesbug
Regler som gjelder heretter
- ALDRI
--audiencesflagg medgcloud auth print-identity-token - ALLTID hardkod kanonisk Cloud Run URL i smoke-tests
- ALLTID gi Cloud Build SA
roles/run.invokerved opprettelse av ny Cloud Run-tjeneste - BEHOLD
sleep 30i smoke-test — nødvendig for traffic routing - Ved 404 fra automatisert caller → sjekk IAM FØRST, ikke routing
Kanoniske verdier for dette prosjektet
Cloud Run URL: https://osvauco-agent-357036551735.us-central1.run.app
Cloud Build SA: 357036551735@cloudbuild.gserviceaccount.com
Prosjekt: propane-will-491900-m5
Region: us-central1
Tidslinje
- ~13:00 CEST: Første smoke-test feil
- ~19:30 CEST: Root cause identifisert (manglende IAM + feil URL + --audiences bug)
- ~19:37 CEST: IAM binding lagt til, build passerte
- Totalt tid brukt: ~6.5 timer