Prix ​​de l'environnement flexible Google App Engine, un cours de 500 $

103

J'ai suivi le didacticiel d'environnement Nodejs sur App Engine Flexible @: https://cloud.google.com/nodejs/getting-started/hello-world

Après avoir déployé et testé avec succès le tutoriel, j'ai changé le code pour expérimenter un peu et l'ai déployé avec succès ... puis je l'ai laissé en cours d'exécution car il s'agissait d'un environnement de test (non public).

Un mois plus tard, je reçois une facture de Google de plus de 370 $!

Dans les détails de la transaction, je vois ce qui suit:

1 - 31 octobre 2017 RAM de l'instance App Engine Flex: 5948,774 Gibibyte-heures ([MYPROJECT]) 42,24 $

1er au 31 octobre 2017 Heures de base de l'instance App Engine Flex: 5948,774 heures ([MYPROJECT]) 312,91 $

Comment cet environnement de test avec presque 0 demandes a-t-il nécessité environ 6 000 heures de ressources? Dans le pire des cas, j'aurais supposé que 720 heures de fonctionnement à plein temps pendant un mois à 0,05 $ l'heure me coûteraient ~ 40 $. https://cloud.google.com/appengine/pricing

Quelqu'un peut-il aider à faire la lumière à ce sujet? Je n'ai pas été en mesure de savoir pourquoi tant de ressources étaient nécessaires?

Merci pour l'aide!

Pour plus de données, voici le trafic du mois dernier (essentiellement 0): Données de trafic

Et les données d'instanceDonnées d'instance

MISE À JOUR: Notez que j'ai apporté une modification au package.json: j'ai ajouté nodemon en tant que dépendance et l'ai ajouté dans le cadre de mon script "nmp start". Bien que je doute que cela explique les 6000 heures de ressources:

  "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 (par défaut - aucun changement par rapport au didacticiel)

runtime: nodejs
env: flex
ddallala
la source
Vous devez contacter l'assistance GCP pour obtenir de l'aide sur la facturation: support.google.com/cloud/contact/cloud_platform_billing
BrettJ
4
Merci pour la réponse @BrettJ, je les avais déjà contactés et voici ce qu'ils m'ont dit: "Comme mentionné, nous n'avons pas la possibilité de voir le rapport détaillé de l'utilisation c'est pourquoi j'ai fourni les liens afin que vous puissiez également poster sur le forum de la communauté et encore une fois, des développeurs expérimentés pourront vous aider avec vos questions techniques. "
ddallala
2
Vos attentes apparaissent en fonction de la tarification d'environnement standard (et uniquement d'une instance de classe B1). Mais vous utilisez l'environnement flex - une tarification différente. Vérifiez votre app.yaml pour les processeurs et Go de configuration de mémoire - ce sont vos multiplicateurs d'heures par instance. Ensuite, vous multipliez par 2 - le nombre d'instances que vous avez exécutées.
Dan Cornilescu
Le prix de Salut @DanCornilescu est toujours à ~ 0,0,5 $, même pour les environnements flexibles ... vCPU par heure de cœur 0,0526 $ (Iowa). J'ai collé mon app.yaml ... en bref, je ne l'ai pas modifié à partir du tutoriel.
ddallala
1
OK, vous avez maintenant de meilleurs points de données à communiquer à l'assistance de facturation GCP.
Dan Cornilescu

Réponses:

175

Après de multiples allers-retours avec Google, et des heures à lire des blogs et à regarder des rapports, j'ai enfin (un peu) trouvé une explication à ce qui s'est passé. Je le posterai ici avec mes suggestions afin que d'autres personnes ne soient pas également victimes de ce problème.

Notez que cela peut sembler évident pour certains, mais en tant que nouvel utilisateur de GAE, tout cela était nouveau pour moi.

En bref, lors du déploiement sur GAE et de l'utilisation de la commande suivante " $ gcloud app deploy ", il crée une nouvelle version et la définit comme la version par défaut, mais aussi et plus important encore, il ne supprime PAS la version précédente qui a été déployée.

Vous trouverez plus d'informations sur les versions et les instances ici: https://cloud.google.com/appengine/docs/standard/python/an-overview-of-app-engine

Donc, dans mon cas, sans le savoir, j'avais créé plusieurs versions de mon application de nœud simple. Ces versions sont toujours en cours d'exécution au cas où il faudrait changer suite à une erreur. Mais ces versions nécessitent également des instances, et la valeur par défaut, sauf indication contraire dans app.yaml, est de 2 instances.

Google dit:

Par défaut, App Engine adapte le nombre d'instances en cours d'exécution en fonction de la charge, offrant ainsi des performances constantes pour votre application à tout moment tout en minimisant les instances inactives et en réduisant ainsi les coûts.

Cependant, d'après mon expérience, ce n'était pas le cas. Comme je l'ai dit plus tôt, j'ai poussé mon application de nœud avec nodemon, ce qui semble causer des erreurs.

En fin de compte, en suivant le tutoriel et sans arrêter le projet, j'avais 4 versions, chacune avec 2 instances fonctionnant à plein temps pendant 1,5 mois, servant 0 requête et générant beaucoup de messages d'erreur et cela m'a coûté 500 $.

RECOMMANDATIONS SI VOUS VOULEZ TOUJOURS UTILISER GAE FLEX ENV:

  1. Avant tout, configurez un budget de facturation et des alertes pour ne pas être surpris par une facture coûteuse qui est automatiquement facturée sur votre CC: https://cloud.google.com/billing/docs/how-to/budgets

  2. Dans un environnement de test, vous n'avez probablement pas besoin de plusieurs versions, alors lors du déploiement, utilisez la commande suivante:
    $ gcloud app deploy --version v1

  3. Mettez à jour votre app.yaml pour ne forcer qu'une seule instance avec des ressources minimales:

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. Définir la limite de dépenses quotidiennes

entrez la description de l'image ici

Consultez cet article de blog pour plus d'informations: https://medium.com/google-cloud/three-simple-steps-to-save-costs-when-prototyping-with-app-engine-flexible-environment-104fc6736495

J'aurais aimé que certaines de ces étapes aient été incluses dans le didacticiel afin de protéger ceux qui essaient d'apprendre et d'expérimenter, mais ce n'était pas le cas.

L'environnement de Google App Engine Flex peut être délicat si l'on ne connaît pas tous ces détails. Un ami m'a indiqué Heroku, qui propose à la fois des prix fixes et des offres Free / Hobby. J'ai pu y installer rapidement une nouvelle application de nœud, et cela a fonctionné comme du charme! https://www.heroku.com/pricing

Cela ne m'a coûté "que" 500 $ pour apprendre cette leçon, mais j'espère que cela aidera les autres utilisateurs de Google App Engine Flex Env.

ddallala
la source
60
Google semble vraiment avoir le marché accaparé sur une documentation médiocre. C'est dommage que vous ayez reçu une facture de 500 $, mais vous avez pris la balle pour beaucoup d'autres, j'en suis sûr, en offrant vos idées, tellement appréciées!
Drazen Bjelovuk
10
une autre possibilité "gcloud app deploy app.yaml --stop-previous-version"
DeividasV
2
Merci, très utile. Les alertes / limites de facturation sont indispensables. Face à un problème similaire tout récemment
Kartik
1
ce n'est certainement pas le moyen le moins cher, car il exécuterait constamment une seule instance. s'il vous plaît voir ma réponse
Caner
Peut-on s'attendre à la même mauvaise surprise avec l'environnement standard AppEngine? Ou les problèmes OP mentionnés se produisent-ils uniquement dans l'environnement flex?
John Doe le
17

Si vous souhaitez réduire vos coûts GAE, veuillez NE PAS utiliser manual_scalingcomme suggéré dans cet article ou la réponse acceptée!

La belle chose à propos de Google App Engine est qu'il peut évoluer jusqu'à des centaines de machines en quelques millisecondes en fonction de la demande. Et vous ne payez que pour les instances en cours d'exécution.

Pour pouvoir optimiser vos coûts, vous devez comprendre les différentes options de mise à l'échelle et les types d'instances:

1. Flex du moteur d'application vs standard:

Les détails sur les différences peuvent être trouvés ici , mais une différence importante pertinente pour cette question est:

[Standard is] Destiné à fonctionner gratuitement ou à un coût très bas, où vous ne payez que pour ce dont vous avez besoin et quand vous en avez besoin. Par exemple, votre application peut évoluer vers 0 instance lorsqu'il n'y a pas de trafic.

2. Options de mise à l'échelle:

  • Mise à l'échelle automatique: Google fera évoluer votre application en fonction de la demande et de la configuration que vous avez fournies.
  • Mise à l'échelle manuelle: aucune mise à l'échelle du tout, GAE exécutera le nombre exact d'instances que vous avez demandé, tout le temps (dénomination très trompeuse)
  • Mise à l'échelle de base: elle augmentera jusqu'à la limite que vous avez définie et diminuera également après un certain temps

3. Types d'instances: Il existe 2 types d'instances , et elles diffèrent fondamentalement dans le temps nécessaire pour créer une nouvelle instance. Les instances de classe F (utilisées dans la mise à l'échelle automatique) peuvent être créées en cas de besoin en ~ 0,1 seconde et les instances de classe B (utilisées dans la mise à l'échelle manuelle / basique) en ~ 0,7 seconde: entrez la description de l'image ici

entrez la description de l'image ici

Maintenant que vous avez compris les bases, revenons à la réponse acceptée:

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

Ce que cela indique à GAE est d'exécuter une classe d'instance personnalisée ( plus coûteuse ), tout le temps. De toute évidence, ce n'est pas l'option la moins chère car le type d'instance B1 / F1 pourrait être utilisé à la place (il a des spécifications inférieures) et il exécute également une instance en permanence.

Ce qui serait le moins cher est de désactiver l'instance lorsqu'il n'y a pas de trafic. Si cela ne vous dérange pas le temps de rotation d'environ 0,1 seconde, vous pouvez utiliser ceci à la place:

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)

Cela relèvera des quotas gratuits fournis par Google et ne devrait rien vous coûter si vous n'avez pas de trafic réel.

PS: Il est également fortement recommandé de définir une limite de dépenses quotidiennes au cas où vous auriez oublié quelque chose en cours d'exécution ou si vous avez des paramètres coûteux quelque part.

Caner
la source
2
Vous ne pouvez pas définir min_instancesà 0. Selon la documentation :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.
yorbro
4
@yorbro merci d'avoir signalé que, min_instances est pour l'environnement standard, le document que vous avez lié fait référence à un paramètre différent min_num_instances qui est pour l'environnement flex. Je mettrai à jour ma réponse pour refléter clairement cela.
Caner
Ah mon mal. Merci pour la réponse rapide!
yorbro
Dans la documentation de min_instances, il est dit Avertissement: pour que cette fonctionnalité fonctionne correctement, vous devez vous assurer que les demandes de préchauffage sont activées et que votre application gère les demandes de préchauffage. Cela doit-il être activé? Quel impact cela aura-t-il sur la latence si cela n'est pas mis en œuvre? J'essaie de réduire mes coûts de fonctionnement pour une application qui compte environ 600 utilisateurs, j'essaie donc de déterminer quels sont les meilleurs paramètres de mise à l'échelle.
Pete Nice le
cet avertissement semble être nouveau, je ne l'ai jamais vu auparavant. Cela étant dit, je ne connais pas l'impact sur les performances. détails ici: cloud.google.com/appengine/docs/standard/python/…
Caner
16

Le code déployé sur GAE FE est devenu complètement fou en raison d'un échec exponentiel en cascade (les e-mails rebondis ont généré des e-mails rebondis, etc.) et nous ne pouvions PAS désactiver les instances GAE qui étaient buggées. Après plus de 4 heures et plus de 1 million d'e-mails envoyés (Mailgun ne nous a tout simplement PAS laissé désactiver le compte. Il disait "Veuillez attendre jusqu'à 24 heures pour que le changement de mot de passe entre en vigueur", et la révocation des clés API n'a rien fait), la VM redis a été arrêté, la base de données en panne, et tout le code du site réduit à une seule page statique 503 "Down For Maintenance"), les courriels ont continué à être envoyés.

J'ai déterminé que GAE FE ne mettait tout simplement pas fin aux VM docker ou aux VM Cloud Compute (redis) qui sont sous la charge du processeur. Peut-être jamais! Une fois que nous avons supprimé la machine virtuelle Compute (au lieu de "simplement" l'arrêter), les e-mails se sont arrêtés instantanément.

Cependant, notre base de données a continué à être remplie d'avis "Impossible d'envoyer un e-mail" pendant jusqu'à 2 heures de plus, bien que l'application GAE ait signalé que 100% des versions et des instances étaient "arrêtées". J'ai fini par devoir changer le mot de passe Google Cloud SQL.

Nous avons continué à vérifier la facture, et les 7 instances non autorisées ont continué à utiliser le processeur et nous avons donc annulé la carte utilisée pour ce compte, et le site a, en fait, baissé lorsque la facture était en souffrance, tout comme les instances voyous. Nous n'avons jamais été en mesure de résoudre la situation avec l'assistance par e-mail GAE.

Théodore R. Smith
la source
Maintenant que j'ai quitté cette entreprise il y a longtemps, je peux vous dire que la facture mensuelle était d'environ 5 000 $, normalement environ 300 $.
Theodore R. Smith
J'ai utilisé GCP et AWS ces dernières années, et des histoires comme celle-ci me donnent envie de courir à plein temps dans les bras d'AWS. Les trous dans la documentation et la vérification des erreurs de GCP sont misérables - ils s'améliorent, mais ils sont toujours misérables. C'est bon marché pour une raison. Cela dit, je suis sur le point de déployer une application sur GAE, tiens ma bière
Ingernet
Il est littéralement impossible d'entrer en contact avec qui que ce soit chez Google si vous avez un problème GRAVE avec GCP. Nous avons essayé pendant des mois de les contacter au sujet de graves problèmes d'instabilité. Ne pas aller.
Theodore R. Smith
J'ai eu de la chance avec leur support technique, mais mon entreprise paie également pour un compte de support,
soooo
4

Notez également que si vous souhaitez toujours que votre application ait une mise à l'échelle automatique mais que vous ne souhaitez pas que le minimum par défaut de 2 instances s'exécute à tout moment, vous pouvez configurer votre app.yaml comme suit:

runtime: nodejs
env: flex
automatic_scaling:
  min_num_instances: 1
Kat
la source
Je pense que tu veux dire max_num_instances?
Dominic
4
Il n'y a certainement aucune option pour limiter les instances. Faire tourner 1 000 instances lors d'une attaque DDoS et facturer au client 1 000 $ est une stratégie commerciale de GCP.
Theodore R. Smith
2
@ TheodoreR.Smith en fait avec max, vous pouvez et en fixant également une limite quotidienne
zardilior
3
@Dominic a min_num_instancesraison ici si vous voulez économiser de l'argent en veille au prix de la redondance. @Theodore Il existe également max_num_instances pour limiter les instances, mais vous ne pouvez pas définir de limite de dépenses quotidiennes sur App Engine flexible (mais vous pouvez le faire en standard). Vous pouvez cependant configurer des budgets et des alertes.
jon_wu
4

Puisque personne n'a mentionné, voici les commandes gcloud liées aux versions

# 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
la source
1

pour les environnements de développement où la latence ne me dérange pas, j'utilise les paramètres suivants:

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

Et si vous utilisez votre instance plus que l'allocation gratuite d'instance backend, essayez ceci:

instance_class: F1
automatic_scaling:
  max_instances: 1

Dans le tableau de bord AppEngine, regardez les instances, prenez note de l'heure de début et vérifiez qu'après la période idle_timeout, le nombre d'instances tombe à zéro et le message "Cette version n'a aucune instance déployée" s'affiche.

Joe Bourne
la source