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):
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
Réponses:
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:
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:
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
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
Mettez à jour votre app.yaml pour ne forcer qu'une seule instance avec des ressources minimales:
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.
la source
Si vous souhaitez réduire vos coûts GAE, veuillez NE PAS utiliser
manual_scaling
comme 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:
2. Options de mise à l'échelle:
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:
Maintenant que vous avez compris les bases, revenons à la réponse acceptée:
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:
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.
la source
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.
min_instances
est pour l'environnement standard, le document que vous avez lié fait référence à un paramètre différentmin_num_instances
qui est pour l'environnement flex. Je mettrai à jour ma réponse pour refléter clairement cela.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.
la source
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:
la source
max_num_instances
?min_num_instances
raison 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.Puisque personne n'a mentionné, voici les commandes gcloud liées aux versions
la source
pour les environnements de développement où la latence ne me dérange pas, j'utilise les paramètres suivants:
Et si vous utilisez votre instance plus que l'allocation gratuite d'instance backend, essayez ceci:
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.
la source