Ich folgte dem Nodejs on App Engine Flexible env Tutorial @: https://cloud.google.com/nodejs/getting-started/hello-world
Nachdem ich das Tutorial erfolgreich bereitgestellt und getestet hatte, änderte ich den Code, um ein wenig zu experimentieren, und stellte ihn erfolgreich bereit ... und ließ ihn dann laufen, da dies eine Testumgebung war (nicht öffentlich).
Einen Monat später erhalte ich von Google eine Rechnung über 370 US-Dollar!
In den Transaktionsdetails sehe ich Folgendes:
1. - 31. Oktober 2017 RAM der App Engine Flex-Instanz: 5948,774 Gibibyte-Stunden ([MYPROJECT]) 42,24 USD
1. - 31. Oktober 2017 Kernstunden der App Engine Flex-Instanz: 5948,774 Stunden ([MYPROJECT]) 312,91 USD
Wie hat diese Testumgebung mit fast 0 Anfragen etwa 6.000 Stunden Ressourcen benötigt? Im schlimmsten Fall hätte ich angenommen, dass 720 Stunden Vollzeitbeschäftigung für einen Monat bei 0,05 USD pro Stunde mich ~ 40 USD kosten würden. https://cloud.google.com/appengine/pricing
Kann jemand helfen, Licht ins Dunkel zu bringen? Ich konnte nicht herausfinden, warum so viele Ressourcen benötigt wurden.
Danke für die Hilfe!
Für weitere Daten ist dies der Verkehr im letzten Monat (im Grunde 0):
UPDATE: Beachten Sie, dass ich eine Änderung an package.json vorgenommen habe: Ich habe nodemon als Abhängigkeit hinzugefügt und als Teil meines Skripts "nmp start" hinzugefügt. Obwohl ich bezweifle, dass dies die 6000 Stunden an Ressourcen erklärt:
"scripts": {
"deploy": "gcloud app deploy",
"start": "nodemon app.js",
"dev": "nodemon app js",
"lint": "samples lint",
"pretest": "npm run lint",
"system-test": "samples test app",
"test": "npm run system-test",
"e2e-test": "samples test deploy"
},
App.yaml (Standard - keine Änderung gegenüber dem Tutorial)
runtime: nodejs
env: flex
Antworten:
Nach mehrmaligem Hin und Her mit Google und stundenlangem Lesen von Blogs und Betrachten von Berichten habe ich endlich (etwas) eine Erklärung dafür gefunden, was passiert ist. Ich werde es hier mit meinen Vorschlägen veröffentlichen, damit nicht auch andere Menschen diesem Problem zum Opfer fallen.
Beachten Sie, dass dies für einige offensichtlich erscheint, aber als neuer GAE-Benutzer war dies alles für mich brandneu.
Kurz gesagt, bei der Bereitstellung in GAE und mit dem folgenden Befehl " $ gcloud app deploy " eine neue Version erstellt und als Standardversion festgelegt wird, wird vor allem die zuvor bereitgestellte Version NICHT entfernt.
Weitere Informationen zu Versionen und Instanzen finden Sie hier: https://cloud.google.com/appengine/docs/standard/python/an-overview-of-app-engine
In meinem Fall hatte ich, ohne es zu wissen, mehrere Versionen meiner einfachen Knoten-App erstellt. Diese Versionen werden weiterhin ausgeführt, falls nach einem Fehler gewechselt werden muss. Diese Versionen erfordern jedoch auch Instanzen, und die Standardeinstellung ist, sofern nicht in der app.yaml angegeben, 2 Instanzen.
Google sagt:
Nach meiner Erfahrung war dies jedoch nicht der Fall. Wie ich bereits sagte, habe ich meine Node-App mit nodemon gepusht, was anscheinend Fehler verursacht hat.
Am Ende hatte ich nach dem Tutorial und ohne das Projekt herunterzufahren, 4 Versionen mit jeweils 2 Instanzen, die 1,5 Monate lang in Vollzeit ausgeführt wurden, 0 Anfragen bedienten und viele Fehlermeldungen generierten. Das kostete mich 500 US-Dollar.
EMPFEHLUNGEN, WENN SIE GAE FLEX ENV NOCH VERWENDEN WOLLEN:
Richten Sie in erster Linie ein Abrechnungsbudget und Benachrichtigungen ein, damit Sie nicht von einer teuren Rechnung überrascht werden, die automatisch Ihrem CC belastet wird: https://cloud.google.com/billing/docs/how-to/budgets
In einer Testumgebung benötigen Sie höchstwahrscheinlich nicht mehrere Versionen. Verwenden Sie daher während der Bereitstellung den folgenden Befehl:
$ gcloud app deploy --version v1
Aktualisieren Sie Ihre app.yaml , um nur 1 Instanz mit minimalen Ressourcen zu erzwingen:
Weitere Informationen finden Sie in diesem Blogbeitrag: https://medium.com/google-cloud/three-simple-steps-to-save-costs-when-prototyping-with-app-engine-flexible-environment-104fc6736495
Ich wünschte, einige dieser Schritte wären in das Tutorial aufgenommen worden, um diejenigen zu schützen, die versuchen zu lernen und zu experimentieren, aber das war nicht der Fall.
Google App Engine Flex env kann schwierig sein, wenn man nicht alle diese Details kennt. Ein Freund hat mich auf Heroku hingewiesen, der sowohl festgelegte Preise als auch Free / Hobby-Angebote hat. Ich konnte dort schnell eine neue Knoten-App pushen, und es funktionierte wie ein Zauber! https://www.heroku.com/pricing
Es hat mich "nur" 500 US-Dollar gekostet, diese Lektion zu lernen, aber ich hoffe, dies hilft anderen, die sich Google App Engine Flex Env ansehen.
quelle
Wir haben Code für GAE FE bereitgestellt, der aufgrund eines kaskadierenden, exponentiellen Fehlers (zurückgesendete E-Mails, generierte E-Mail-E-Mails usw.) absolut verrückt geworden ist, und wir konnten die fehlerhaften GAE-Instanzen NICHT deaktivieren. Nach mehr als 4 Stunden und mehr als 1 Million gesendeten E-Mails (Mailgun ließ uns das Konto einfach NICHT deaktivieren. Es hieß "Bitte warten Sie bis zu 24 Stunden, bis die Kennwortänderung wirksam wird", und das Widerrufen von API-Schlüsseln führte zu nichts) wurde gestoppt, die Datenbank heruntergefahren und der gesamte Code der Site auf eine einzige statische 503-Seite "Down For Maintenance" reduziert. Die E-Mails wurden weiterhin gesendet.
Ich habe festgestellt, dass GAE FE weder Docker-VMs noch Cloud Compute-VMs (Redis) beendet, die unter CPU-Last stehen. Vielleicht nie! Sobald wir die Compute VM tatsächlich gelöscht haben (anstatt sie "nur" zu stoppen), wurden die E-Mails sofort gestoppt.
Unsere Datenbank wurde jedoch noch bis zu 2 Stunden lang mit Benachrichtigungen "E-Mail konnte nicht gesendet werden" gefüllt, obwohl die GAE-App 100% der Versionen und Instanzen als "gestoppt" meldete. Am Ende musste ich das Google Cloud SQL-Passwort ändern.
Wir haben die Rechnung weiter überprüft, und die 7 Schurkeninstanzen haben weiterhin CPU verbraucht. Daher haben wir die auf diesem Konto verwendete Karte storniert, und die Website ist tatsächlich gesunken, als die Rechnung überfällig war, aber auch die Schurkeninstanzen. Mit dem GAE-E-Mail-Support konnten wir die Situation nie lösen.
quelle
Wenn Sie Ihre GAE Kosten senken bitte NICHT verwenden ,
manual_scaling
wie in vorgeschlagen diesem Artikel oder die akzeptierte Antwort!Das Schöne an Google App Engine ist, dass es je nach Bedarf innerhalb von Millisekunden auf Hunderte von Computern skaliert werden kann. Und Sie zahlen nur für laufende Instanzen.
Um Ihre Kosten optimieren zu können, müssen Sie die verschiedenen Skalierungsoptionen und Instanztypen kennen:
1. App Engine Flex vs Standard:
Die Details zu Unterschieden finden Sie hier , aber ein wichtiger Unterschied, der für diese Frage relevant ist, ist:
2. Skalierungsoptionen:
3. Instanztypen: Es gibt zwei Instanztypen , die sich grundsätzlich in der Zeit unterscheiden, die zum Hochfahren einer neuen Instanz benötigt wird. Instanzen der F-Klasse (bei der automatischen Skalierung verwendet) können bei Bedarf innerhalb von ~ 0,1 Sekunden und Instanzen der B-Klasse (bei der manuellen Skalierung / Basis) innerhalb von ~ 0,7 Sekunden erstellt werden:
Nachdem Sie die Grundlagen verstanden haben, kehren wir zur akzeptierten Antwort zurück:
Dies weist GAE an, eine benutzerdefinierte Instanzklasse auszuführen ( teurer , ständig ) . Offensichtlich ist dies nicht die billigste Option, da stattdessen der Instanztyp B1 / F1 verwendet werden könnte (er hat niedrigere Spezifikationen) und eine Instanz ständig ausgeführt wird.
Am billigsten wäre es , die Instanz auszuschalten, wenn kein Datenverkehr vorhanden ist. Wenn Ihnen die ~ 0,1 Sekunden Hochlaufzeit nichts ausmacht, können Sie stattdessen Folgendes tun:
Dies fällt unter die kostenlosen Quoten, die Google anbietet, und es sollte Sie nichts kosten, wenn Sie keinen echten Datenverkehr haben.
PS: Es wird außerdem dringend empfohlen, ein tägliches Ausgabenlimit festzulegen, falls Sie etwas vergessen haben oder irgendwo kostspielige Einstellungen vorgenommen haben.
quelle
min_instances
auf 0 setzen.The minimum number of instances given to your service. When a service is deployed, it is given this many instances and scales according to traffic. Must be 1 or greater, default is 2 to reduce latency.
min_instances
das Dokument, das Sie verlinkt haben, für eine Standardumgebung gilt. Es bezieht sich auf verschiedene Parameter,min_num_instances
die für eine flexible Umgebung gelten. Ich werde meine Antwort aktualisieren, um dies klar widerzuspiegeln.Beachten Sie außerdem, dass Sie Ihre app.yaml folgendermaßen konfigurieren können, wenn Ihre App weiterhin automatisch skaliert werden soll, aber nicht mindestens 2 Instanzen standardmäßig ausgeführt werden sollen:
quelle
max_num_instances
?min_num_instances
ist hier richtig, wenn Sie im Leerlauf auf Kosten der Redundanz Geld sparen möchten. @Theodore Es gibt auch max_num_instances , um Instanzen zu begrenzen, aber Sie können kein tägliches Ausgabenlimit für App Engine flexible festlegen (dies ist jedoch standardmäßig möglich). Sie können jedoch Budgets und Warnungen einrichten.Da niemand erwähnt hat, sind hier die gcloud-Befehle, die sich auf die Versionen beziehen
quelle
Für Entwicklungsumgebungen, in denen mir eine kleine Latenz nichts ausmacht, verwende ich die folgenden Einstellungen:
Wenn Sie Ihre Instanz mehr als die zulässige kostenlose Backend-Instanz verwenden, versuchen Sie Folgendes:
Im AppEngine-Dashboard können Sie die Instanzen überwachen, die Startzeit notieren und sicherstellen, dass nach Ablauf der Zeitspanne idle_timeout die Anzahl der Instanzen auf Null sinkt und die Meldung "In dieser Version sind keine Instanzen bereitgestellt" angezeigt wird.
quelle