2017-07-28 3 views
2

Ich habe die grundlegende Python 3 Tutorial Website auf Kolben aus diesem google cloud tutorial genommen und ich kann dies einrichten und die Website funktioniert gut.Cron Job in Google App-Engine funktioniert nicht

Darüber hinaus wollte ich auch ein Python-Skript ausführen, das jeden Tag ausgeführt wird, um einige Daten zu sammeln, aber der Cron-Job funktioniert einfach nicht. Admin dieser URL

cron.yaml

cron: 
- description: test dispatch vs target 
    url: /cronapp 
    schedule: every 5 hours 

app.yaml

runtime: python 
env: flex 
entrypoint: gunicorn -b :$PORT main:app 

runtime_config: 
    python_version: 3 

handlers: 
- url: /cronapp 
    script: cronapp.py 
    login: admin 

Ich rufe dies als http://myproject.appspot.com/cronapp auch direkt zu verwenden, jemanden zu beschränken doesn: Ich Login auch hinzugefügt arbeite nicht und gibt eine 404 zurück. was mache ich falsch? jede mögliche Hilfe wird geschätzt

Antwort

2

Ihre app.yaml Datei vermischt die Standardumgebung Element in eine flexible environment configuration, also wird es vermutlich ignoriert. Sie können die Cron-Anfragen wahrscheinlich in den Logs der App in der Entwicklerkonsole sehen (wahrscheinlich mit Fehlern).

Sie müssen sich für /cronappin Ihrem App Code, nicht in app.yaml einen Handler hinzuzufügen. Nicht ganz sicher, wie Sie das tun (ich verwende immer noch nur die Standardumgebung), es hängt von Ihrer App und/oder ihrem Framework ab. Werfen Sie einen Blick auf die Hello World code review für eine Flasche Beispiel.

Update:

ich nicht ganz korrekt sein kann, basierend ich meine Antwort auf Dokumentation, aber ich habe gerade bemerkt, einige Ungereimtheiten (ich dafür eine Dokumentation Feedback an Google gesendet werden).

Die flexible Umgebung Securing URLs for cron erwähnt ein paar Lösungen (die meist aus the standard environment equivalent kopiert erscheint):

  • man in der Tat auf der Grundlage der login: admin Option handler:

Sie ein einschränken URL durch Hinzufügen von login: admin zum Handler Konfigurationsabschnitt in app.yaml. Für weitere Informationen siehe Securing URLs

Aber handler ist nicht im Configuring your App with app.yaml erwähnt und die Securing URLs verweisen auf einen nicht vorhandenen Tag. Ich bin mir also nicht sicher, ob das tatsächlich funktioniert oder nicht.

  • ist der zweite auf der Grundlage der X-Appengine-Cron Header (das gleiche wie in der Standardumgebung):

Anfragen aus dem Cron-Service wird auch einen HTTP-Header enthalten:

X-Appengine-Cron: true 

Der Header X-Appengine-Cron wird intern von Google App Engine festgelegt. Wenn Ihr Anforderungshandler diesen Header findet, kann er darauf vertrauen, dass die Anfrage eine Cron-Anfrage ist. Wenn die Kopfzeile in einer externen Benutzeranforderung an Ihre App vorhanden ist, wird sie entfernt, mit Ausnahme von Anforderungen von angemeldeten Administratoren der Anwendung, die die Kopfzeile für Testzwecke festlegen dürfen.

Aber in Removed headers wird erwähnt, dass:

Darüber hinaus sind einige ausgewählte Header, die das folgende Muster entsprechen aus der Anforderung entfernt werden:

  • X-Appengine-*

Es ist unklar, ob sich dies auf X-Appengine-Cron erstreckt oder nicht. Es ist einen Versuch wert. Dies ist meine Überprüfung in der (Standard-env, webapp2-basierten) Cron-Handler-Code:

+0

Dank Dan. Cron funktioniert gut, wenn ich den Handler direkt in die App bringe. Aber ich möchte nicht, dass die Außenwelt diese URL anruft. Dies sollte nur über cron erreichbar sein. Irgendwelche Ideen, wie man das einschränkt? – user1251323

+1

Danke Dan für die ausführliche Antwort. Ich habe mit X-app engine-cron in den Headern getestet, wie Sie gesagt haben, aber es sieht so aus, als wäre es nicht mit der Kopfzeile in der flexiblen Umgebung gesendet. Ich werde ein Ticket mit Google eröffnen. – user1251323

+0

Ich bin mir nicht sicher, was jetzt passiert ist. aber ein neuer Einsatz in einem neuen, neuen Projekt scheint mit X-AppEngine-Cron-Lösung funktioniert zu haben. Danke nochmal für deine Hilfe. – user1251323