Precios de Google App Engine Flexible env, una lección de $ 500

103

Seguí el tutorial de Nodejs en App Engine Flexible env @: https://cloud.google.com/nodejs/getting-started/hello-world

Habiendo implementado y probado con éxito el tutorial, cambié el código para experimentar un poco y lo implementé con éxito ... y luego lo dejé en ejecución ya que este era un entorno de prueba (no público).

Un mes después, recibí una factura de Google por más de $ 370.

En los detalles de la transacción veo lo siguiente:

1 al 31 de octubre de 2017 RAM de instancia flexible de App Engine: 5948,774 gibibyte-horas ([MYPROJECT]) $ 42,24

Del 1 al 31 de octubre de 2017 Horas principales de instancias flexibles de App Engine: 5948.774 horas ([MYPROJECT]) $ 312.91

¿Cómo este entorno de prueba con casi 0 solicitudes requirió alrededor de 6.000 horas de recursos? En el peor de los casos, habría asumido que 720 horas funcionando a tiempo completo durante un mes a $ 0.05 por hora me costaría ~ $ 40. https://cloud.google.com/appengine/pricing

¿Alguien puede ayudar a aclarar esto? No he podido averiguar por qué se necesitaban tantos recursos.

¡Gracias por la ayuda!

Para obtener más datos, este es el tráfico durante el último mes (básicamente 0): Datos de tráfico

Y datos de instanciaDatos de instancia

ACTUALIZACIÓN: Tenga en cuenta que traje una modificación al package.json: agregué nodemon como una dependencia y lo agregué como parte de mi script "nmp start". Aunque dudo que esto explique las 6000 horas de recursos:

  "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 (predeterminado, sin cambios desde el tutorial)

runtime: nodejs
env: flex
ddallala
fuente
Debe comunicarse con el equipo de asistencia de GCP para obtener ayuda con la facturación: support.google.com/cloud/contact/cloud_platform_billing
BrettJ
4
Gracias por la respuesta @BrettJ, ya los había contactado y esto es lo que me dijeron: "Como se mencionó, no tenemos ninguna capacidad para ver el informe detallado del uso, por eso proporcioné los enlaces para que tú también puedas publicar en el foro de la comunidad y, nuevamente, habrá desarrolladores experimentados que pueden ayudarlo con sus preguntas técnicas ".
ddallala
2
Sus expectativas aparecen según los precios env estándar (y solo una instancia de clase B1). Pero estás usando el entorno flexible: precios diferentes. Verifique su app.yaml en busca de CPU y GB de configuraciones de memoria; esos son sus multiplicadores de horas por instancia. Luego, multiplica por 2, la cantidad de instancias que tenía en ejecución.
Dan Cornilescu
Hola, @DanCornilescu, el precio sigue siendo de ~ $ 0.0.5 incluso para entornos flexibles ... vCPU por hora de núcleo $ 0.0526 (Iowa). Pegué mi app.yaml ... en resumen, no lo modifiqué del tutorial.
ddallala
1
Bien, ahora tienes mejores puntos de datos para comunicarte con el soporte de facturación de GCP.
Dan Cornilescu

Respuestas:

176

Después de varios idas y venidas con Google, y horas de leer blogs y mirar informes, finalmente (algo) encontré una explicación de lo que sucedió. Lo publicaré aquí con mis sugerencias para que otras personas no sean víctimas de este problema.

Tenga en cuenta que esto puede parecer obvio para algunos, pero como nuevo usuario de GAE, todo esto era completamente nuevo para mí.

En resumen, cuando se implementa en GAE y se usa el siguiente comando " $ gcloud app deploy ", se crea una nueva versión y la configura como predeterminada, pero también, y lo que es más importante, NO elimina la versión anterior que se implementó.

Puede encontrar más información sobre versiones e instancias aquí: https://cloud.google.com/appengine/docs/standard/python/an-overview-of-app-engine

Entonces, en mi caso, sin saberlo, había creado múltiples versiones de mi aplicación de nodo simple. Estas versiones aún se están ejecutando en caso de que sea necesario cambiar después de un error. Pero estas versiones también requieren instancias, y el valor predeterminado, a menos que se indique en app.yaml, es 2 instancias.

Google dice:

De forma predeterminada, App Engine escala la cantidad de instancias que se ejecutan hacia arriba y hacia abajo para que coincida con la carga, lo que proporciona un rendimiento constante para su aplicación en todo momento, al tiempo que minimiza las instancias inactivas y, por lo tanto, reduce los costos.

Sin embargo, según mi experiencia, este no fue el caso. Como dije anteriormente, presioné mi aplicación de nodo con nodemon, que parece que estaba causando errores.

Al final, siguiendo el tutorial y sin cerrar el proyecto, tuve 4 versiones, cada una con 2 instancias ejecutándose a tiempo completo durante 1,5 meses, atendiendo 0 solicitudes y generando muchos mensajes de error y me costó $ 500.

RECOMENDACIONES SI TODAVÍA QUIERES USAR GAE FLEX ENV:

  1. En primer lugar, configure un presupuesto de facturación y alertas para que no se sorprenda con una factura costosa que se carga automáticamente a su CC: https://cloud.google.com/billing/docs/how-to/budgets

  2. En un entorno de prueba, lo más probable es que no necesite varias versiones, por lo que durante la implementación, use el siguiente comando:
    $ gcloud app deploy --version v1

  3. Actualice su app.yaml para forzar solo 1 instancia con recursos mínimos:

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. Establecer límite de gasto diario

ingrese la descripción de la imagen aquí

Consulte esta publicación de blog para obtener más información: https://medium.com/google-cloud/three-simple-steps-to-save-costs-when-prototyping-with-app-engine-flexible-environment-104fc6736495

Desearía que algunos de estos pasos se hubieran incluido en el tutorial para proteger a aquellos que están tratando de aprender y experimentar, pero no fue así.

Google App Engine Flex env puede ser complicado si no se conocen todos estos detalles. Un amigo me señaló Heroku, que tiene precios fijos y ofertas gratuitas / de pasatiempos. Pude colocar rápidamente una nueva aplicación de nodo allí, ¡y funcionó a la perfección! https://www.heroku.com/pricing

Aprender esta lección "sólo" me costó $ 500, pero espero que esto ayude a otros que buscan en Google App Engine Flex Env.

ddallala
fuente
60
Google realmente parece tener el mercado acorralado por una pésima documentación. Es desafortunado que te hayan abofeteado con un billete de $ 500, pero estoy seguro de que has recibido la bala por muchos otros al ofrecer tus ideas, ¡muy apreciadas!
Drazen Bjelovuk
10
otra posibilidad "gcloud app deploy app.yaml --stop-previous-version"
DeividasV
2
Gracias, muy útil. Las alertas / límites de facturación son imprescindibles. Se enfrentó a un problema similar recientemente
Kartik
1
Definitivamente, esta no es la forma más barata, porque constantemente ejecuta una sola instancia. por favor vea mi respuesta
Caner
¿Podemos esperar la misma sorpresa con el env estándar de AppEngine? ¿O los problemas OP mencionados ocurren solo en el entorno flexible?
John Doe
17

Si desea reducir sus costos de GAE, NO lo use manual_scalingcomo se sugiere en este artículo o en la respuesta aceptada.

Lo hermoso de Google App Engine es que puede escalar hacia arriba y hacia abajo a cientos de máquinas en milisegundos según la demanda. Y solo paga por las instancias que se están ejecutando.

Para poder optimizar sus costos, debe comprender las diferentes opciones de escalado y tipos de instancias:

1. Aplicación del motor flexible frente a estándar:

Los detalles sobre las diferencias se pueden encontrar aquí , pero una diferencia importante relevante para esta pregunta es:

[El estándar es] Diseñado para ejecutarse de forma gratuita o a un costo muy bajo, donde solo paga por lo que necesita y cuando lo necesita. Por ejemplo, su aplicación puede escalar a 0 instancias cuando no hay tráfico.

2. Opciones de escala:

  • Escalado automático: Google escalará su aplicación según la demanda y la configuración que proporcionó.
  • Escalado manual: sin escalado en absoluto, GAE ejecutará el número exacto de instancias que solicitó, todo el tiempo (denominación muy engañosa)
  • Escalado básico: se ampliará para limitar su configuración y también se reducirá después de cierto tiempo

3. Tipos de instancias: hay 2 tipos de instancias , y básicamente difieren en el tiempo que lleva iniciar una nueva instancia. Las instancias de clase F (utilizadas en el escalado automático) se pueden crear cuando sea necesario dentro de ~ 0.1 segundos y las instancias de clase B (utilizadas en escalado manual / básico) dentro de ~ 0.7 segundos: ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Ahora que entendió los conceptos básicos, regresemos a la respuesta aceptada:

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

Lo que esto indica a GAE es ejecutar una clase de instancia personalizada ( más costosa ), todo el tiempo. Obviamente, esta no es la opción más barata porque el tipo de instancia B1 / F1 podría usarse en su lugar (tiene especificaciones más bajas) y también está ejecutando una instancia constantemente.

Lo más económico sería apagar la instancia cuando no hay tráfico. Si no le importa el tiempo de giro de ~ 0.1 segundos, puede optar por esto en su lugar:

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)

Esto caerá dentro de las cuotas gratuitas que proporciona Google y no debería costarle nada si no tiene tráfico real.

PD: También es muy recomendable establecer un límite de gasto diario en caso de que olvide que algo se esté ejecutando o tenga algunas configuraciones costosas en alguna parte.

Caner
fuente
2
No se puede establecer min_instancesen 0. Según la documentación :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 gracias por señalar eso, min_instances es para entorno estándar, el documento que vinculó se refiere a diferentes parámetros min_num_instances que son para entorno flexible. Actualizaré mi respuesta para reflejar esto claramente.
Caner
Ah mi mal. ¡Gracias por la rápida respuesta!
yorbro
En la documentación de min_instances se dice Advertencia: para que esta característica funcione correctamente, debe asegurarse de que las solicitudes de preparación estén habilitadas y que su aplicación maneje las solicitudes de preparación. ¿Esto tiene que estar habilitado? ¿Qué impacto tendrá en la latencia si no se implementa? Estoy tratando de reducir mis costos de funcionamiento para una aplicación que tiene alrededor de 600 usuarios, así que estoy tratando de averiguar cuáles son las mejores configuraciones de escala.
Pete Nice
esa advertencia parece nueva, no la había visto antes. Dicho esto, no sé sobre el impacto en el rendimiento. detalles aquí: cloud.google.com/appengine/docs/standard/python/…
Caner
16

Hicimos que el código implementado en GAE FE se volviera absolutamente loco debido a una falla exponencial en cascada (correos electrónicos rebotados generaron correos electrónicos rebotados, etc.) y NO pudimos desactivar las instancias GAE que tenían errores. Después de más de 4 horas, y más de 1 millón de correos electrónicos enviados (Mailgun simplemente NO nos permitió deshabilitar la cuenta. Decía "Espere hasta 24 horas para que el cambio de contraseña entre en vigencia", y la revocación de las claves de API no hizo nada), la VM de redis se detuvo, la base de datos cayó y todo el código del sitio se redujo a una sola página 503 estática "Abajo para mantenimiento"), los correos electrónicos se siguieron enviando.

Determiné que GAE FE simplemente no finaliza ni las VM de Docker ni las VM de Cloud Compute (redis) que están bajo carga de CPU. ¡Tal vez nunca! Una vez que realmente eliminamos la Compute VM (en lugar de "simplemente" detenerla), los correos electrónicos se detuvieron instantáneamente.

Pero nuestra base de datos continuó llenándose con avisos de "no se pudo enviar correo electrónico" durante hasta 2 horas más, a pesar de que la aplicación GAE informó que el 100% de las versiones e instancias estaban "Detenidas". Terminé teniendo que cambiar la contraseña de Google Cloud SQL.

Seguimos revisando la factura, y las 7 instancias deshonestas siguieron consumiendo CPU, por lo que cancelamos la tarjeta utilizada en esa cuenta, y el sitio, de hecho, se cayó cuando la factura estaba vencida, pero también lo hicieron las instancias deshonestas. Nunca pudimos resolver la situación con el soporte por correo electrónico de GAE.

Theodore R. Smith
fuente
Ahora que hace tiempo que dejé esa empresa, puedo decirles que la factura mensual rondaba los 5.000 dólares, normalmente unos 300 dólares.
Theodore R. Smith
He usado GCP y AWS durante los últimos años, e historias como esta me dan ganas de correr gritando a los brazos de AWS a tiempo completo. Los agujeros en la documentación de GCP y la comprobación de errores son miserables: mejoran, pero aún son miserables. Es barato por una razón. Dicho esto, estoy a punto de implementar una aplicación en GAE, sostenga mi cerveza
ingernet
Es literalmente imposible ponerse en contacto con alguien en Google si tiene un problema GRAVE con GCP. Durante meses intentamos comunicarnos con ellos sobre problemas graves de inestabilidad. No vayas.
Theodore R. Smith
He tenido ok suerte con su soporte técnico, pero mi compañía también paga por una cuenta de apoyo, taaaan
ingernet
4

También tenga en cuenta que si aún desea que su aplicación tenga un escalado automático pero no desea que el mínimo predeterminado de 2 instancias se ejecute en todo momento, puede configurar su app.yaml de la siguiente manera:

runtime: nodejs
env: flex
automatic_scaling:
  min_num_instances: 1
Kat
fuente
Creo que te refieres max_num_instances?
Domingo
4
Definitivamente no hay una opción para limitar las instancias. Activar 1,000 instancias durante un ataque DDoS y facturar al cliente $ 1,000 de dólares es una estrategia comercial de GCP.
Theodore R. Smith
2
@ TheodoreR.Smith en realidad con max you can y también estableciendo un límite diario
zardilior
3
@Dominic min_num_instancestiene razón aquí si desea ahorrar dinero mientras está inactivo a costa de la redundancia. @Theodore También hay max_num_instances para limitar las instancias, pero no puedes establecer un límite de gasto diario en App Engine flexible (pero puedes hacerlo en estándar). Sin embargo, puede configurar presupuestos y alertas.
jon_wu
4

Como nadie lo mencionó, aquí están los comandos de gcloud relacionados con las versiones

# 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
fuente
1

para entornos de desarrollo donde no me importa un poco de latencia, estoy usando la siguiente configuración:

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

Y si usa su instancia más que la asignación de instancia de backend gratuita, intente esto:

instance_class: F1
automatic_scaling:
  max_instances: 1

En el panel de AppEngine, observe las instancias, tome nota de la hora de inicio y observe para asegurarse de que después de que el período idle_timeout haya pasado, el recuento de instancias baje a cero y vea el mensaje "Esta versión no tiene instancias implementadas".

Joe Bourne
fuente