Ціни на Google App Engine Гнучка середовище, урок 500 доларів


103

Я дотримувався підручника Nodejs на App Engine гнучкого середовища @: https://cloud.google.com/nodejs/getting-started/hello-world

Успішно розгорнувши та протестувавши навчальний посібник, я змінив код, щоб трохи поекспериментувати, і успішно розгорнув його ... а потім залишив його запущеним, оскільки це було середовище тестування (не загальнодоступне).

Через місяць я отримую рахунок від Google на суму понад 370 доларів!

В деталях транзакції я бачу наступне:

1 - 31 жовтня 2017 р. Екземпляр оперативної пам'яті App Engine: 5948,774 гібібайт-годин ([MYPROJECT]) $ 42,24

1 - 31 жовтня 2017 р. Основні години екземпляра програми App Engine Flex: 5948.774 години ([[MYPROJECT]) 312,91 дол. США

Як це середовище тестування з майже 0 запитами вимагало близько 6000 годин ресурсів? У гіршому, я б припустив, що 720 годин роботи повний робочий день протягом місяця @ 0,05 доларів на годину обійдеться мені в ~ 40 доларів. https://cloud.google.com/appengine/pricing

Хтось може допомогти пролити це світло? Мені не вдалося з’ясувати, навіщо потрібно було стільки ресурсів?

Дякую за допомогу!

Щоб отримати більше даних, це трафік за останній місяць (в основному 0): Дані про дорожній рух

І дані про екземпляриДані екземпляра

ОНОВЛЕННЯ: Зверніть увагу, що я вніс одну модифікацію до package.json: я додав nodemon як залежність і додав його як частину мого сценарію "nmp start". Хоча я сумніваюся, що це пояснює 6000 годин ресурсів:

  "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 (за замовчуванням - без змін у підручнику)

runtime: nodejs
env: flex

Вам слід зв’язатися зі
службою

4
Дякую за відповідь @BrettJ, я вже з ними зв'язався, і ось що вони мені сказали: "Як уже згадувалося, ми не маємо можливості переглядати детальний звіт про використання, тому я надав посилання, щоб ви могли також розміщувати на форумі спільноти, і знову будуть досвідчені розробники, які можуть допомогти вам у ваших технічних питаннях ".
ddallala

2
Ваші очікування відображаються на основі стандартних цін на середовище (і лише екземплярів класу B1). Але ви використовуєте flex env - різні ціни. Перевірте свій app.yaml на наявність центральних процесорів та ГБ конфігурацій пам’яті - це ваші мультиплікатори годин на екземпляр. Потім ви множите на 2 - кількість екземплярів, які у вас були запущені.
Дан Корнілеску,

Привіт, ціна @DanCornilescu все ще становить ~ 0,0,5 дол. США навіть для гнучких envs ... vCPU за основну годину 0,0526 дол. США (Айова). Я вставив свій app.yaml ... словом, не змінював його з підручника.
ddallala

1
Добре, тепер у вас є кращі точки передачі даних для зв’язку зі службою підтримки рахунків GCP.
Ден Корнілеску,

Відповіді:


175

Після кількох переговорів із Google, годин читання блогів та перегляду звітів, я нарешті (дещо) знайшов пояснення тому, що сталося. Я розміщу його тут зі своїми пропозиціями, щоб інші люди також не стали жертвами цієї проблеми.

Зауважте, для когось це може здатися очевидним, але для нового користувача GAE все це було для мене абсолютно новим.

Коротше кажучи, під час розгортання на GAE та використання наступної команди " $ gcloud app deploy ", він створює нову версію та встановлює її за замовчуванням, але, що ще важливіше, НЕ видаляє попередню версію, яка була розгорнута.

Більше інформації про версії та екземпляри можна знайти тут: https://cloud.google.com/appengine/docs/standard/python/an-overview-of-app-engine

Отже, у моєму випадку, сам того не знаючи, я створив кілька версій свого простого вузлового додатка. Ці версії все ще працюють на випадок, якщо потрібно помилитися після помилки. Але ці версії також вимагають екземплярів, і за замовчуванням, якщо це не зазначено в app.yaml, це 2 екземпляри.

Google каже:

App Engine за замовчуванням масштабує кількість екземплярів, що працюють вгору і вниз, щоб відповідати навантаженню, таким чином забезпечуючи стабільну продуктивність вашого додатка в будь-який час, мінімізуючи простої екземплярів і, таким чином, зменшуючи витрати.

Однак, з мого досвіду, це було не так. Як я вже говорив раніше, я пересунув свою програму node nodemon, яка, здається, спричиняє помилки.

Врешті-решт, слідуючи навчальному посібнику і не вимикаючи проект, я мав 4 версії, кожна з 2 екземплярів працювала повний робочий день протягом 1,5 місяців, обслуговуючи 0 запитів і генеруючи багато повідомлень про помилки, і це коштувало мені 500 доларів.

РЕКОМЕНДАЦІЇ, ЯКЩО ВСЕ ХОЧЕТЕ ВИКОРИСТОВУВАТИ GAE FLEX ENV:

  1. Перш за все, налаштуйте платіжний бюджет та попередження, щоб вас не здивував дорогий рахунок-фактура, який автоматично стягується з вашого CC: https://cloud.google.com/billing/docs/how-to/budgets

  2. У тестовому середовищі вам, швидше за все, не потрібні кілька версій, тому під час розгортання використовуйте таку команду:
    $ gcloud app deploy --version v1

  3. Оновіть app.yaml, щоб примусити лише 1 екземпляр з мінімальними ресурсами:

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. Встановити ліміт щоденних витрат

введіть тут опис зображення

Перегляньте цю публікацію в блозі для отримання додаткової інформації: https://medium.com/google-cloud/three-simple-steps-to-save-costs-when-prototyping-with-app-engine-f Flexible-environment-104fc6736495

Я хотів би, щоб деякі з цих кроків були включені в підручник з метою захисту тих, хто намагається вчитися та експериментувати, але цього не було.

Google App Engine Flex env може бути складним, якщо ви не знаєте всіх цих деталей. Друг вказав мені на Heroku, який має як встановлені ціни, так і безкоштовні / хобі пропозиції. Я зміг швидко просунути туди нову програму вузла, і це спрацювало як шарм! https://www.heroku.com/pricing

Навчання цьому уроку мені "коштувало" лише 500 доларів, але я сподіваюся, це допоможе іншим, хто дивиться на Google App Engine Flex Env.


60
Google справді, схоже, має ринок на підставі поганої документації. Шкода, що вам вдарили купюру в 500 доларів, але ви взяли кулю для багатьох інших. Я впевнений, пропонуючи ваші ідеї, так високо оцінені!
Дражен Бєловук

10
ще одна можливість "gcloud app розмістити app.yaml --stop-попередня версія"
DeividasV

2
Дякую, дуже корисно. Повідомлення / обмеження щодо виставлення рахунків є обов’язковими. Зовсім недавно зіткнувся з подібним питанням
Картік,

1
це точно не найдешевший спосіб, оскільки він постійно запускав один екземпляр. будь ласка, перегляньте мою відповідь
Канер

Чи можемо ми потенційно очікувати такого ж поганого сюрпризу зі стандартним середовищем AppEngine? Або проблеми, згадані в OP, трапляються лише у flex env?
Джон Доу,

17

Якщо ви хочете зменшити свої витрати на GAE, НЕ використовуйте, manual_scalingяк запропоновано в цій статті або прийняту відповідь!

Найкрасивіше в Google App Engine полягає в тому, що він може масштабуватися до сотень машин протягом мілісекунд залежно від потреби. І ви платите лише за запущені екземпляри.

Щоб мати можливість оптимізувати свої витрати, вам потрібно зрозуміти різні параметри масштабування та типи екземплярів:

1. Програма двигуна додатків у порівнянні зі стандартною:

Детальніше про відмінності можна знайти тут , але одна важлива відмінність, яка стосується цього питання:

[Стандартний] Призначений для запуску безкоштовно або з дуже низькою вартістю, де ви платите лише за те, що вам потрібно, і коли вам це потрібно. Наприклад, ваша програма може масштабуватися до 0 екземплярів, коли немає трафіку.

2. Параметри масштабування:

  • Автоматичне масштабування: Google масштабуватиме вашу програму залежно від попиту та конфігурації, яку ви надали.
  • Масштабування вручну: Масштабування взагалі відсутнє, GAE постійно запускатиме точну кількість випадків, про які ви просили (дуже оманливе іменування)
  • Основне масштабування: воно буде масштабуватися, щоб обмежити встановлений вами параметр, а також буде зменшуватися через певний час

3. Типи екземплярів: Існує 2 типи екземплярів , і вони в основному відрізняються часом, необхідним для створення нового екземпляра. Екземпляри класу F (використовуються в автоматичному масштабуванні) можна створювати, коли є необхідність протягом ~ 0,1 секунди, а екземпляри класу B (використовуються в ручному масштабуванні / базовому) протягом ~ 0,7 секунди: введіть тут опис зображення

введіть тут опис зображення

Тепер, коли ви зрозуміли основи, повернімось до прийнятої відповіді:

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

Це вказує GAE - це постійно запускати власний клас екземпляра ( більш дорогий ). Очевидно, що це не найдешевший варіант, оскільки замість нього можна використовувати тип екземпляра B1 / F1 (він має нижчі характеристики), і він також постійно запускає екземпляр.

Що було б найдешевшим - це вимкнути екземпляр, коли немає трафіку. Якщо ви не заперечуєте час обертання ~ 0,1 секунди, ви можете замість цього скористатися цим:

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)

Це потрапляє в безкоштовні квоти, які надає Google, і це не повинно вам нічого коштувати, якщо у вас немає реального трафіку.

PS: Також настійно рекомендуємо встановити ліміт щоденних витрат, якщо ви щось забули, або десь є якісь дорогі налаштування.


2
Ви не можете встановити min_instancesзначення 0. За документацією :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 дякую, що вказали, що min_instances це для стандартного середовища, документ, який ви зв’язали, посилається на інший параметр, min_num_instances який стосується середовища flex. Я оновлю свою відповідь, щоб чітко це відобразити.
Джанер

Ах, погано. Дякуємо за швидку відповідь!
yorbro

У документації до min_instance сказано Попередження: Щоб ця функція працювала належним чином, ви повинні переконатися, що запити на розігрівання ввімкнені та що ваша програма обробляє запити на розігрівання. Це потрібно ввімкнути? Який вплив це матиме на затримку, якщо це не буде реалізовано? Я намагаюся зменшити свої експлуатаційні витрати на програму, де налічується близько 600 користувачів, тому намагаюся з’ясувати, які найкращі налаштування масштабування.
Піт Ніцца,

це попередження здається новим, я його раніше не бачив. З огляду на це, не знаю про вплив на продуктивність. Подробиці тут: cloud.google.com/appengine/docs/standard/python / ...
CANER

16

У нас був розгорнутий код для GAE FE, який абсолютно розгубився через каскадну, експоненціальну помилку (відхилені електронні листи генерували відхилені електронні листи тощо), і ми НЕ могли вимкнути помилкові екземпляри GAE. Через 4 години та більше 1 мільйона електронних листів (Mailgun просто НЕ дозволить нам вимкнути обліковий запис. У ньому було сказано: "Будь ласка, зачекайте до 24 годин, щоб зміна пароля набрала чинності", а відкликання ключів API нічого не зробило), Redis VM було зупинено, БД не працювало, а весь код сайту зводився до однієї статичної 503 сторінки "Вниз для обслуговування"), електронні листи продовжували надсилатися.

Я визначив, що GAE FE просто не закінчує ні віртуальні машини Docker, ні Cloud Compute VM (redis), які перебувають під навантаженням процесора. Може ніколи! Після того, як ми фактично видалили Compute VM (замість того, щоб просто "зупинити"), електронні листи миттєво зупинилися.

Але наша БД продовжувала наповнюватися повідомленнями "не вдалося надіслати електронну пошту" ще протягом 2 годин, незважаючи на те, що додаток GAE повідомляє про 100% версій та екземплярів, які будуть "зупинені". Мені довелося змінити пароль Google Cloud SQL.

Ми продовжували перевіряти рахунок, а 7 екземплярів-шахраїв продовжували використовувати центральний процесор, і тому ми скасували картку, що використовувалася в цьому обліковому записі, і сайт, насправді, знизився, коли рахунок був прострочений, але також зробили випадки неправди. Ми ніколи не змогли вирішити ситуацію із підтримкою електронної пошти GAE.


Тепер, коли я давно покинув цю компанію, я можу сказати вам, що щомісячний рахунок становив близько 5000 доларів, як правило, близько 300 доларів.
Теодор Р. Сміт,

Я використовував GCP та AWS протягом останніх кількох років, і подібні історії викликають у мене бажання бігти з криками в обійми AWS повний робочий день. Діри в документації GCP та перевірці помилок жалюгідні - покращуються, але все ще жалюгідні. Це дешево неспроста. Тим не менш, я збираюся розгорнути додаток для GAE, потримати своє пиво
ingernet

Буквально неможливо зв’язатися з кимось із Google, якщо у вас СЕРЬОЗНА проблема з GCP. Місяцями ми намагалися зв’язатися з ними щодо серйозних проблем нестабільності. Не ходити.
Теодор Р. Сміт,

Мені пощастило з їх технічною підтримкою, але моя компанія також платить за рахунок підтримки,
оооо

4

Також зверніть увагу, що якщо ви все ще хочете, щоб у вашому додатку було автоматичне масштабування, але ви не хочете, щоб за промовчанням постійно працювали мінімум 2 екземпляри, ви можете налаштувати свій app.yaml так:

runtime: nodejs
env: flex
automatic_scaling:
  min_num_instances: 1

Гадаю, ти маєш на увазі max_num_instances?
Домінік

4
Категорично немає можливості обмежувати екземпляри. Обернення 1000 екземплярів під час DDoS-атаки та виставлення рахунку клієнту на 1000 доларів - це бізнес-стратегія GCP.
Теодор Р. Сміт

2
@ TheodoreR.Smith насправді з максимальною можливістю, а також встановленням денного ліміту
zardilior

3
@Dominic min_num_instancesправильний тут, якщо ви хочете заощадити гроші під час бездіяльності ціною надмірності. @Theodore Існує також max_num_instance, щоб обмежити екземпляри, але ви не можете встановити щоденний ліміт витрат на App Engine гнучко (але ви можете на стандартному рівні). Однак ви можете встановити бюджети та попередження.
jon_wu

4

Оскільки ніхто не згадував, ось команди gcloud, пов'язані з версіями

# 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

1

для середовищ розробників, де я не заперечую трохи затримки, я використовую такі налаштування:

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

І якщо ви використовуєте свій екземпляр більше, ніж дозволи на безкоштовний серверний екземпляр, спробуйте це:

instance_class: F1
automatic_scaling:
  max_instances: 1

На інформаційній панелі AppEngine слідкуйте за Екземплярами, приймайте до уваги час запуску та стежте, щоб після того, як період idle_timeout пройшов, кількість екземплярів знизилася до нуля, і ви побачите повідомлення "Ця версія не має розгорнутих екземплярів".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.