Harga Google App Engine Fleksibel env, pelajaran $ 500

113

Saya mengikuti tutorial Nodejs di App Engine Fleksibel env @: https://cloud.google.com/nodejs/getting-started/hello-world

Setelah berhasil menerapkan dan menguji tutorial, saya mengubah kode untuk sedikit bereksperimen dan berhasil menerapkannya ... dan kemudian membiarkannya berjalan karena ini adalah lingkungan pengujian (bukan publik).

Sebulan kemudian, saya menerima tagihan dari Google sebesar lebih dari $ 370!

Dalam detail transaksi saya melihat yang berikut:

1 - 31 Okt 2017 RAM Instans App Engine Flex: 5.948,774 Gibibyte-jam ([MYPROJECT]) $ 42,24

1 - 31 Okt 2017 Jam Inti Instans App Engine Flex: 5.948,774 Jam ([MYPROJECT]) $ 312,91

Bagaimana lingkungan pengujian dengan hampir 0 permintaan ini membutuhkan sekitar 6.000 jam sumber daya? Yang terburuk, saya akan mengasumsikan 720 jam berjalan penuh waktu selama sebulan @ $ 0,05 per jam akan menghabiskan biaya ~ $ 40. https://cloud.google.com/appengine/pricing

Dapatkah seseorang membantu menjelaskan hal ini? Saya belum dapat menemukan mengapa begitu banyak sumber daya dibutuhkan?

Terima kasih untuk bantuannya!

Untuk lebih banyak data, ini adalah lalu lintas selama sebulan terakhir (pada dasarnya 0): Data Lalu Lintas

Dan data contohData Instance

UPDATE: Perhatikan bahwa saya membawa satu modifikasi ke package.json: Saya menambahkan nodemon sebagai ketergantungan dan menambahkannya sebagai bagian dari skrip "nmp start" saya. Meskipun saya ragu ini menjelaskan 6000 jam sumber daya:

  "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 (default-tidak ada perubahan dari tutorial)

runtime: nodejs
env: flex
ddallala.dll
sumber
Anda harus menghubungi dukungan GCP untuk mendapatkan bantuan terkait penagihan: support.google.com/cloud/contact/cloud_platform_billing
BrettJ
5
Terima kasih atas tanggapan @BrettJ, saya sudah menghubungi mereka dan inilah yang mereka katakan kepada saya: "Seperti yang disebutkan, kami tidak memiliki kemampuan untuk melihat laporan rinci penggunaan itu sebabnya saya menyediakan tautan sehingga Anda dapat memposting juga di forum komunitas dan sekali lagi akan ada pengembang berpengalaman yang dapat membantu Anda dengan pertanyaan teknis Anda. "
ddallala
2
Harapan Anda muncul berdasarkan harga env standar (dan hanya instance kelas B1). Tetapi Anda menggunakan flex env - harga yang berbeda. Periksa app.yaml Anda untuk mengetahui apakah ada CPU dan GB konfigurasi memori - itu adalah pengganda jam per instance Anda. Kemudian Anda mengalikan dengan 2 - jumlah instance yang Anda jalankan.
Dan Cornilescu
Hai @DanCornilescu, harga masih ~ $ 0,0.5 bahkan untuk lingkungan fleksibel ... vCPU per jam inti $ 0,0526 (Iowa). Saya menempelkan app.yaml saya ... singkatnya, tidak memodifikasinya dari tutorial.
ddallala
1
Oke, sekarang Anda memiliki titik data yang lebih baik untuk berkomunikasi dengan dukungan penagihan GCP.
Dan Cornilescu

Jawaban:

187

Setelah beberapa kali bolak-balik dengan Google, dan berjam-jam membaca blog dan melihat laporan, akhirnya saya (agak) menemukan penjelasan untuk apa yang terjadi. Saya akan posting di sini dengan saran saya agar orang lain tidak juga menjadi korban masalah ini.

Perhatikan, ini mungkin tampak jelas bagi sebagian orang, tetapi sebagai pengguna GAE baru, semua ini baru bagi saya.

Singkatnya, saat menerapkan ke GAE dan menggunakan perintah berikut " $ gcloud app deploy ", ini membuat versi baru dan menyetelnya sebagai default, tetapi juga dan yang lebih penting, TIDAK menghapus versi sebelumnya yang telah diterapkan.

Info lebih lanjut tentang versi dan contoh dapat ditemukan di sini: https://cloud.google.com/appengine/docs/standard/python/an-overview-of-app-engine

Jadi dalam kasus saya, tanpa menyadarinya, saya telah membuat beberapa versi aplikasi node sederhana saya. Versi ini masih berjalan jika ada yang perlu beralih setelah terjadi kesalahan. Tetapi versi ini juga memerlukan instance, dan defaultnya, kecuali dinyatakan di app.yaml, adalah 2 instance.

Google mengatakan:

App Engine secara default menskalakan jumlah instance yang berjalan ke atas dan ke bawah agar sesuai dengan beban, sehingga memberikan kinerja yang konsisten untuk aplikasi Anda setiap saat sambil meminimalkan instance tidak aktif dan dengan demikian mengurangi biaya.

Namun, dari pengalaman saya, bukan itu masalahnya. Seperti yang saya katakan sebelumnya, saya mendorong aplikasi node saya dengan nodemon yang tampaknya menyebabkan kesalahan.

Pada akhirnya, mengikuti tutorial dan tidak menghentikan proyek, saya memiliki 4 versi, masing-masing dengan 2 contoh berjalan penuh waktu selama 1,5 bulan melayani 0 permintaan dan menghasilkan banyak pesan kesalahan dan saya dikenakan biaya $ 500.

REKOMENDASI ​​JIKA ANDA MASIH INGIN MENGGUNAKAN GAE FLEX ENV:

  1. Pertama dan terpenting, siapkan anggaran & peringatan penagihan sehingga Anda tidak terkejut dengan faktur mahal yang secara otomatis ditagih ke CC Anda: https://cloud.google.com/billing/docs/how-to/budgets

  2. Dalam pengujian env, Anda kemungkinan besar tidak memerlukan banyak versi, jadi saat menerapkan gunakan perintah berikut:
    $ gcloud app deploy --version v1

  3. Perbarui app.yaml Anda untuk memaksa hanya 1 instance dengan sumber daya minimal:

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. Tetapkan batas pengeluaran harian

masukkan deskripsi gambar di sini

Lihat entri blog ini untuk info lebih lanjut: https://medium.com/google-cloud/three-simple-steps-to-save-costs-when-prototyping-with-app-engine-flexible-environment-104fc6736495

Saya berharap beberapa langkah ini disertakan dalam tutorial untuk melindungi mereka yang mencoba belajar dan bereksperimen, tetapi ternyata tidak.

Google App Engine Flex env bisa jadi rumit jika seseorang tidak mengetahui semua detail ini. Seorang teman mengarahkan saya ke Heroku, yang telah menetapkan harga dan penawaran Gratis / Hobi. Saya dapat dengan cepat mendorong aplikasi node baru di sana, dan itu bekerja seperti pesona! https://www.heroku.com/pricing

Saya "hanya" menghabiskan $ 500 untuk mempelajari pelajaran ini, tapi saya harap ini membantu orang lain yang melihat Google App Engine Flex Env.

ddallala.dll
sumber
65
Google tampaknya benar-benar memojokkan pasar pada dokumentasi yang buruk. Sangat disayangkan bahwa Anda ditampar dengan uang $ 500, tetapi Anda telah mengambil keputusan untuk banyak orang lain. Saya yakin dengan menawarkan wawasan Anda, sangat kami hargai!
Drazen Bjelovuk
11
kemungkinan lain "gcloud app deploy app.yaml --stop-before-version"
DeividasV
2
Terima kasih, sangat membantu. Peringatan / batasan penagihan adalah suatu keharusan. Menghadapi masalah serupa baru
Kartik
1
ini jelas bukan cara termurah, karena terus-menerus menjalankan satu instance. silakan lihat jawaban saya
Caner
Bisakah kita berpotensi mengharapkan kejutan buruk yang sama dengan AppEngine standard env? Atau apakah masalah yang disebutkan OP hanya terjadi di flex env?
John Doe
18

Jika Anda ingin mengurangi biaya GAE, JANGAN gunakan manual_scalingseperti yang disarankan dalam artikel ini atau jawaban yang diterima!

Hal yang menarik tentang Google App Engine adalah ia dapat meningkatkan dan menurunkan skala hingga ratusan mesin dalam milidetik berdasarkan permintaan. Dan Anda hanya membayar untuk instance yang sedang berjalan.

Untuk dapat mengoptimalkan biaya, Anda perlu memahami berbagai opsi penskalaan dan jenis instans:

1. Fleksibilitas mesin aplikasi vs standar:

Detail tentang perbedaan dapat ditemukan di sini , tetapi satu perbedaan penting yang relevan untuk pertanyaan ini adalah:

[Standar] Dimaksudkan untuk dijalankan secara gratis atau dengan biaya yang sangat rendah, di mana Anda hanya membayar apa yang Anda butuhkan dan saat Anda membutuhkannya. Misalnya, aplikasi Anda dapat menskalakan ke 0 instance saat tidak ada lalu lintas.

2. Opsi Penskalaan:

  • Penskalaan otomatis: Google akan menskalakan aplikasi Anda tergantung pada permintaan dan konfigurasi yang Anda berikan.
  • Penskalaan manual: Tidak ada penskalaan sama sekali, GAE akan menjalankan # persis seperti yang Anda minta, sepanjang waktu (penamaan yang sangat menyesatkan)
  • Penskalaan dasar: Ini akan meningkatkan skala untuk membatasi yang Anda tetapkan dan juga akan turun setelah waktu tertentu

3. Jenis Instans: Ada 2 jenis instans , dan pada dasarnya berbeda dalam waktu yang diperlukan untuk menjalankan instans baru. Instans kelas F (digunakan dalam penskalaan otomatis) dapat dibuat ketika diperlukan dalam ~ 0,1 detik dan instans kelas B (digunakan dalam penskalaan manual / dasar) dalam ~ 0,7 detik: masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Sekarang setelah Anda memahami dasar-dasarnya, mari kembali ke jawaban yang diterima:

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

Apa yang diinstruksikan ini GAE adalah untuk menjalankan kelas instance kustom ( lebih mahal ), sepanjang waktu. Jelas ini bukan opsi termurah karena jenis instans B1 / F1 dapat digunakan sebagai gantinya (memiliki spesifikasi lebih rendah) dan juga menjalankan instans secara konstan.

Apa yang akan menjadi yang termurah adalah mematikan instance saat tidak ada lalu lintas. Jika Anda tidak keberatan dengan waktu putar ~ 0,1 detik, Anda dapat menggunakan ini sebagai gantinya:

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)

Ini akan termasuk dalam kuota gratis yang disediakan google dan tidak akan dikenakan biaya apa pun jika Anda tidak memiliki lalu lintas yang sebenarnya.

PS: Sangat disarankan juga untuk mengatur batas pengeluaran harian jika Anda lupa sesuatu sedang berjalan atau Anda memiliki beberapa pengaturan yang mahal di suatu tempat.

Caner
sumber
3
Anda tidak dapat mengatur min_instanceske 0. Berdasarkan dokumentasi :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 terima kasih untuk menunjukkan bahwa, min_instances untuk lingkungan standar, dokumen yang Anda tautkan mengacu pada parameter min_num_instances yang berbeda yang untuk lingkungan fleksibel. Saya akan memperbarui jawaban saya untuk mencerminkan ini dengan jelas.
Caner
Ah saya buruk. Terima kasih atas balasan cepatnya!
yorbro
Dalam dokumentasi untuk min_instances disebutkan Peringatan: Agar fitur ini berfungsi dengan baik, Anda harus memastikan bahwa permintaan pemanasan diaktifkan dan bahwa aplikasi Anda menangani permintaan pemanasan. Apakah ini harus diaktifkan? Apa dampaknya pada latensi jika ini tidak diterapkan? Saya mencoba mengurangi biaya operasional untuk aplikasi yang memiliki sekitar 600 pengguna, jadi saya mencoba mencari tahu pengaturan penskalaan terbaik.
Pete Nice
peringatan itu sepertinya baru, saya belum pernah melihatnya sebelumnya. Karena itu, tidak tahu tentang dampak kinerja. detailnya di sini: cloud.google.com/appengine/docs/standard/python/…
Caner
18

Kami memiliki kode yang disebarkan ke GAE FE benar-benar gila karena kegagalan berjenjang dan eksponensial (email pentalan menghasilkan email email terpental, dll.) Dan kami TIDAK dapat mematikan contoh GAE yang disadap. Setelah 4+ jam, dan 1 juta + email terkirim (Mailgun TIDAK akan membiarkan kami menonaktifkan akun. Dikatakan "Harap tunggu hingga 24 jam agar perubahan kata sandi berlaku", dan mencabut kunci API tidak melakukan apa-apa), VM redis dihentikan, DB down, dan semua kode situs dikurangi menjadi satu halaman statis 503 "Down For Maintenance"), email terus dikirim.

Saya memutuskan bahwa GAE FE tidak mengakhiri VM docker atau VM Cloud Compute (redis) yang berada di bawah beban CPU. Mungkin tidak pernah! Setelah kami benar-benar menghapus VM Hitung (bukan "hanya" menghentikannya), email langsung berhenti.

Namun, DB kami terus diisi dengan pemberitahuan "tidak dapat mengirim email" hingga 2 jam lagi, meskipun aplikasi GAE melaporkan 100% versi dan instance akan "Dihentikan". Saya akhirnya harus mengubah sandi Google Cloud SQL.

Kami terus memeriksa tagihan, dan 7 kasus nakal terus menggunakan CPU sehingga kami membatalkan kartu yang digunakan pada akun tersebut, dan situs tersebut, pada kenyataannya, turun ketika tagihan telah lewat jatuh tempo, tetapi begitu pula kasus nakal. Kami tidak pernah dapat menyelesaikan masalah ini dengan dukungan email GAE.


Pembaruan (30 Sep 2020): Ini masih merupakan momen terburuk dalam karir 22 tahun saya !! Seluruh perusahaan yang terdiri dari 15 pengembang jenius tidak tahu cara mematikan GAE. Kami tahu pelanggan menerima JUTAAN email ketika salah satu pengembang saya tidak dapat mengakses akun GMail-nya. Tidak bisa mencabutnya, tidak bisa mematikannya. Benar-benar momen "Terminator"!

Tidak terlalu buruk, kecuali untuk pengeluaran, jika MailGun mengizinkan kami untuk benar-benar menonaktifkan akses API atau mengubah kata sandi. Tapi itu akan tetap menjadi biaya yang buruk untuk GAE.

Saya tidak lagi mempercayai server yang tidak dapat saya gunakan untuk masalah reboot.

Pada akhirnya, MailGun hanya menagih kami sekitar $ 50. GAE, bagaimanapun ... Jika saya hanya berasumsi "Oke, pengiriman surat dihentikan, kita bisa berhenti", kita bisa saja berakhir dengan kelebihan tagihan $ 20.000! Saat itu, "hanya" harganya $ 1.500 . Dan kami tidak pernah bisa menghubungi siapa pun untuk membantahnya. Jadi CEO baru saja memakannya.

Theodore R. Smith
sumber
Sekarang saya sudah lama meninggalkan perusahaan itu, saya dapat memberitahu Anda bahwa tagihan bulanan sekitar $ 5.000, biasanya sekitar $ 300.
Theodore R. Smith
Saya telah menggunakan GCP dan AWS selama beberapa tahun terakhir, dan cerita seperti ini membuat saya ingin berlari ke pelukan AWS secara penuh. Lubang dalam dokumentasi GCP dan pemeriksaan error sangat buruk - meningkat, tetapi masih buruk. Itu murah karena suatu alasan. Karena itu, saya akan menerapkan aplikasi ke GAE, tahan bir saya
ingernet
Benar-benar tidak mungkin untuk menghubungi siapa pun di Google jika Anda memiliki Masalah SERIUS dengan GCP. Kami mencoba selama berbulan-bulan untuk menghubungi mereka tentang masalah ketidakstabilan yang parah. Tidak pergi.
Theodore R. Smith
Saya cukup beruntung dengan dukungan teknis mereka, tetapi perusahaan saya juga membayar untuk akun dukungan, soooo
ingernet
Ini masih momen terburuk dalam karir 22 tahun saya !! Seluruh perusahaan yang terdiri dari 15 pengembang jenius tidak tahu cara mematikan GAE. Kami tahu pelanggan menerima JUTAAN email ketika salah satu pengembang saya tidak dapat mengakses akun GMail-nya. Tidak dapat mencabutnya
Theodore R. Smith
4

Perhatikan juga bahwa jika Anda masih ingin aplikasi Anda memiliki penskalaan otomatis tetapi Anda tidak ingin minimum default 2 instance berjalan setiap saat, Anda dapat mengonfigurasi app.yaml Anda seperti ini:

runtime: nodejs
env: flex
automatic_scaling:
  min_num_instances: 1
Kat
sumber
Saya pikir maksud Anda max_num_instances?
Dominic
4
Jelas tidak ada opsi untuk membatasi contoh. Memutar 1.000 instance selama serangan DDoS dan menagih pelanggan $ 1.000 adalah strategi bisnis GCP.
Theodore R. Smith
2
@ TheodoreR. Sebenarnya dengan maksimal Anda bisa dan juga menetapkan batas harian
zardilior
3
@Dominic min_num_instancesbenar di sini jika Anda ingin menghemat uang saat menganggur dengan biaya redundansi. @Theodore Ada juga max_num_instances untuk membatasi instance, tetapi Anda tidak dapat menetapkan batas pengeluaran harian di App Engine secara fleksibel (tetapi Anda bisa secara standar). Namun Anda dapat mengatur anggaran dan peringatan.
jon_wu
4

Karena tidak ada yang disebutkan, berikut adalah perintah gcloud yang terkait dengan versinya

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

untuk lingkungan pengembang di mana saya tidak keberatan sedikit latensi, saya menggunakan pengaturan berikut:

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

Dan jika Anda menggunakan instance Anda lebih dari yang diizinkan, coba ini:

instance_class: F1
automatic_scaling:
  max_instances: 1

Di dasbor AppEngine, lihat Instance, catat waktu mulai, dan perhatikan untuk memastikan bahwa setelah periode idle_timeout telah berlalu, jumlah Instance turun ke nol dan Anda melihat pesan "Versi ini tidak memiliki instans yang diterapkan".

Joe Bourne
sumber