Hallo zusammen,
ich stecke gerade bei einem hartnäckigen Problem mit der Automatisierung eines Python-Scrapers in der Google Cloud fest und hoffe, dass jemand von euch eine zündende Idee hat! Ich habe schon unzählige Stunden in die Fehlersuche investiert, aber komme einfach nicht weiter.
Kurz zum Projekt: Ich habe einen Python-Web-Scraper, der Daten von einer externen Website abruft und diese an die Dialfire API sendet. Das Skript läuft lokal einwandfrei und ich möchte es in der Google Cloud automatisieren.
Mein Setup in GCP: Ich habe mich für folgende Architektur entschieden (da ein direkter Trigger von Cloud Scheduler zu Cloud Run Job bei mir ständig einen 404-Fehler warf):
Cloud Scheduler (mein-scraper-scheduler😞 Soll den Job alle 5 Minuten auslösen.
Cloud Function (mein-scraper-trigger-function😞 Dient als Zwischenschicht und soll den eigentlichen Cloud Run Job triggern.
Cloud Run Job (mein-scraper-job😞 Führt das Python-Scraper-Skript aus.
Das Problem: Der Cloud Scheduler Job startet die Cloud Function erfolgreich. Die Cloud Function selbst bricht aber mit einem 500 Internal Server Error ab.
Die genaue Fehlermeldung in den Cloud Function Logs ist: Error triggering Cloud Run Job: module 'google.auth' has no attribute 'oidc'
Was ich bereits versucht habe (und was funktioniert):
Cloud Run Job (mein-scraper-job😞
Wird erfolgreich bereitgestellt (Docker-Image wird gebaut und gepusht).
Der Scraper-Code (scraper.py) funktioniert lokal einwandfrei (Login auf der Zielseite, Datenabruf, Dialfire API-Aufruf).
Alle Umgebungsvariablen (Username, Passwort, API-Keys etc.) sind korrekt im Cloud Run Job gesetzt.
Wenn ich den Cloud Run Job manuell über das GCP-Dashboard ausführe ("Execute"), läuft er erfolgreich durch und sendet Daten an Dialfire.
Cloud Function (mein-scraper-trigger-function😞
Wird erfolgreich bereitgestellt und ist aktiv.
Der Code der Function ist so geschrieben, dass er google.auth verwendet, um ein OIDC-Token zu generieren und damit den Cloud Run Job per POST-Request auszulösen.
Gepinnte Abhängigkeiten: Ich habe die requirements.txt der Cloud Function mit expliziten Versionen versehen, um Versionskonflikte zu vermeiden, da der Fehler auf ein Problem mit google.auth.oidc hindeutet:
functions-framework==3.7.0
google-auth==2.23.4
google-auth-oauthlib==1.2.0
google-auth-httplib2==0.2.0
requests==2.32.3
Trotz dieser gepinnten Versionen tritt der module 'google.auth' has no attribute 'oidc' Fehler auf.
Berechtigungen (IAM):
Das Dienstkonto des Cloud Schedulers (cloud-scheduler-invoker@[PROJEKT-ID].iam.gserviceaccount.com) hat die Rolle roles/editor auf Projektebene, was für den Aufruf der Cloud Function ausreicht. Hinweis: [PROJEKT-ID] ist hier die tatsächliche Google Cloud Projekt-ID.
Das Standard-Dienstkonto der Cloud Function ([PROJEKTNUMMER]-compute@developer.gserviceaccount.com) hat ebenfalls die Rolle roles/editor auf Projektebene, was für den Aufruf des Cloud Run Jobs ausreichend sein sollte.
Alle relevanten APIs (Cloud Scheduler, Cloud Functions, Cloud Run, Cloud Build, Artifact Registry) sind im Projekt [PROJEKT-ID] aktiviert.
Bereinigung:
Vor jedem neuen Deployment-Versuch wurden alle alten Cloud Run Jobs, Cloud Scheduler Jobs und Cloud Functions vollständig gelöscht und eine Wartezeit von 5-10 Minuten eingehalten, um Inkonsistenzen zu vermeiden.
Meine Frage an die Community: Hat jemand von euch eine Idee, warum der Fehler module 'google.auth' has no attribute 'oidc' in der Cloud Function auftritt, obwohl die requirements.txt korrekt ist und die Funktionalität lokal verfügbar ist? Es scheint, als wäre das oidc-Attribut in der Laufzeitumgebung der Cloud Function nicht korrekt verfügbar.
Ich bin für jeden Hinweis dankbar!
Viele Grüße, Ferry