Preisgestaltung von Google App Engine Flexible env, eine Lektion von 500 US-Dollar

101

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): Verkehrsdaten

Und InstanzdatenInstanzdaten

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
ddallala
quelle
Wenden
4
Vielen Dank für die Antwort @BrettJ, ich hatte sie bereits kontaktiert und sie sagten mir Folgendes: "Wie bereits erwähnt, können wir den detaillierten Bericht über die Nutzung nicht anzeigen. Deshalb habe ich die Links bereitgestellt, damit Sie auch Beiträge verfassen können Im Community-Forum und wieder gibt es erfahrene Entwickler, die Ihnen bei Ihren technischen Fragen helfen können. "
Ddallala
2
Ihre Erwartungen basieren auf Standard-Env-Preisen (und nur einer Instanz der Klasse B1). Aber Sie verwenden die flexible Umgebung - unterschiedliche Preise. Überprüfen Sie Ihre app.yaml auf CPUs und GB an Speicherkonfigurationen - dies sind Ihre Stundenmultiplikatoren pro Instanz. Dann multiplizieren Sie mit 2 - der Anzahl der ausgeführten Instanzen.
Dan Cornilescu
Hi @DanCornilescu Preise liegen immer noch bei ~ $ 0.0.5, auch für Flex-Umgebungen ... vCPU pro Kernstunde $ 0.0526 (Iowa). Ich habe meine app.yaml eingefügt ... kurz gesagt, habe sie nicht aus dem Tutorial geändert.
Ddallala
1
OK, jetzt haben Sie bessere Datenpunkte, um mit dem GCP-Abrechnungssupport zu kommunizieren.
Dan Cornilescu

Antworten:

169

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:

App Engine skaliert standardmäßig die Anzahl der hoch- und runterlaufenden Instanzen, um sie an die Last anzupassen. Auf diese Weise wird jederzeit eine konsistente Leistung für Ihre App bereitgestellt, während inaktive Instanzen minimiert und somit die Kosten gesenkt werden.

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:

  1. 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

  2. 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

  3. Aktualisieren Sie Ihre app.yaml , um nur 1 Instanz mit minimalen Ressourcen zu erzwingen:

runtime: nodejs
env: flex

# This sample incurs costs to run on the App Engine flexible environment.
# The settings below are to reduce costs during testing and are not appropriate
# for production use. For more information, see:
# https://cloud.google.com/appengine/docs/flexible/nodejs/configuring-your-app-with-app-yaml
manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10
  1. Legen Sie das tägliche Ausgabenlimit fest

Geben Sie hier die Bildbeschreibung ein

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.

ddallala
quelle
57
Google scheint wirklich den Markt für miese Dokumentation in die Enge getrieben zu haben. Es ist bedauerlich, dass Sie mit einer 500-Dollar-Rechnung geschlagen wurden, aber Sie haben die Kugel für viele andere genommen, da ich sicher bin, dass Sie Ihre Erkenntnisse anbieten, die so sehr geschätzt werden!
Drazen Bjelovuk
10
eine andere Möglichkeit "gcloud app deploy app.yaml --stop-previous-version"
DeividasV
2
Danke, sehr hilfreich. Abrechnungsbenachrichtigungen / -limits sind ein Muss. Konnte vor kurzem ein ähnliches Problem
konfrontiert
1
Dies ist definitiv nicht der billigste Weg, da ständig eine einzelne Instanz ausgeführt wird. Bitte sehen Sie meine Antwort
Caner
Können wir mit AppEngine Standard Env möglicherweise dieselbe schlechte Überraschung erwarten? Oder treten die genannten OP-Probleme nur im Flex-Umfeld auf?
John Doe
16

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.

Theodore R. Smith
quelle
Jetzt, da ich diese Firma vor langer Zeit verlassen habe, kann ich Ihnen sagen, dass die monatliche Rechnung etwa 5.000 US-Dollar betrug, normalerweise etwa 300 US-Dollar.
Theodore R. Smith
Ich habe in den letzten Jahren GCP und AWS verwendet, und Geschichten wie diese bringen mich dazu, AWS schreiend in die Arme zu laufen. Die Lücken in der Dokumentation und Fehlerprüfung von GCP sind elend - verbessert, aber immer noch elend. Es ist aus einem bestimmten Grund billig. Das heißt, ich bin über eine App auf GAE, halten mein Bier zu implementieren
ingernet
Es ist buchstäblich unmöglich, mit jemandem bei Google in Kontakt zu treten, wenn Sie ein ernstes Problem mit GCP haben. Wir haben monatelang versucht, sie wegen grober Instabilitätsprobleme zu kontaktieren. No Go.
Theodore R. Smith
Ich hatte großes Glück mit dem technischen Support, aber meine Firma zahlt auch für ein Support-Konto, soooo
ingernet
16

Wenn Sie Ihre GAE Kosten senken bitte NICHT verwenden , manual_scalingwie 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:

[Standard is] Soll kostenlos oder zu sehr geringen Kosten ausgeführt werden, wobei Sie nur für das bezahlen, was Sie benötigen und wann Sie es benötigen. Beispielsweise kann Ihre Anwendung auf 0 Instanzen skaliert werden, wenn kein Datenverkehr vorhanden ist.

2. Skalierungsoptionen:

  • Automatische Skalierung: Google skaliert Ihre App je nach Bedarf und Konfiguration.
  • Manuelle Skalierung: Überhaupt keine Skalierung. GAE führt die genaue Anzahl der von Ihnen angeforderten Instanzen ständig aus (sehr irreführende Benennung).
  • Grundlegende Skalierung: Sie wird vergrößert, um die von Ihnen festgelegten Werte zu begrenzen, und nach einer bestimmten Zeit auch verkleinert

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: Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Nachdem Sie die Grundlagen verstanden haben, kehren wir zur akzeptierten Antwort zurück:

manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10

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:

instance_class: F1
automatic_scaling:
  max_instances: 1 (--> you can adjust this as you wish)
  min_instances: 0 (--> will scale to 0 when there is no traffic so won't incur costs)

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.

Caner
quelle
2
Sie können nicht min_instancesauf 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.
Gemäß
3
@yorbro Vielen Dank für den Hinweis, dass 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.
Caner
Ah mein schlechtes. Danke für die schnelle Antwort!
Yorbro
In der Dokumentation zu min_instances heißt es Warnung: Damit diese Funktion ordnungsgemäß funktioniert, müssen Sie sicherstellen, dass Aufwärmanforderungen aktiviert sind und Ihre Anwendung Aufwärmanforderungen verarbeitet. Muss dies aktiviert sein? Welche Auswirkungen hat dies auf die Latenz, wenn dies nicht implementiert wird? Ich versuche, meine laufenden Kosten für eine App mit etwa 600 Benutzern zu senken, um herauszufinden, welche Skalierungseinstellungen am besten geeignet sind.
Pete Nice
Diese Warnung scheint neu zu sein, ich habe sie noch nie gesehen. Davon abgesehen wissen Sie nichts über die Auswirkungen auf die Leistung. Details hier: cloud.google.com/appengine/docs/standard/python/…
Caner
4

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:

runtime: nodejs
env: flex
automatic_scaling:
  min_num_instances: 1
Kat
quelle
Ich denke du meinst max_num_instances?
Dominic
3
Es gibt definitiv keine Möglichkeit, Instanzen einzuschränken. Das Hochfahren von 1.000 Instanzen während eines DDoS-Angriffs und die Abrechnung von 1000 US-Dollar an den Kunden ist eine Geschäftsstrategie von GCP.
Theodore R. Smith
2
@ TheodoreR.Smith tatsächlich mit max können Sie und auch ein Tageslimit setzen
zardilior
3
@Dominic min_num_instancesist 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.
jon_wu
3

Da niemand erwähnt hat, sind hier die gcloud-Befehle, die sich auf die Versionen beziehen

# List all versions
$ gcloud app versions list

SERVICE  VERSION.ID       TRAFFIC_SPLIT  LAST_DEPLOYED              SERVING_STATUS
default  20200620t174631  0.00           2020-06-20T17:46:56+03:00  SERVING
default  20200620t174746  0.00           2020-06-20T17:48:12+03:00  SERVING
default  prod             1.00           2020-06-20T17:54:51+03:00  SERVING

# Delete these 2 versions (you can't delete all versions, you have to have at least one remaining)
$ gcloud app versions delete 20200620t174631 20200620t174746

# Help
$ gcloud app versions --help
Taylan
quelle
0

Für Entwicklungsumgebungen, in denen mir eine kleine Latenz nichts ausmacht, verwende ich die folgenden Einstellungen:

instance_class: B1
basic_scaling:
  max_instances: 1
  idle_timeout: 1m

Wenn Sie Ihre Instanz mehr als die zulässige kostenlose Backend-Instanz verwenden, versuchen Sie Folgendes:

instance_class: F1
automatic_scaling:
  max_instances: 1

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.

Joe Bourne
quelle