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):
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
sumber
Jawaban:
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:
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:
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
Dalam pengujian env, Anda kemungkinan besar tidak memerlukan banyak versi, jadi saat menerapkan gunakan perintah berikut:
$ gcloud app deploy --version v1
Perbarui app.yaml Anda untuk memaksa hanya 1 instance dengan sumber daya minimal:
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.
sumber
Jika Anda ingin mengurangi biaya GAE, JANGAN gunakan
manual_scaling
seperti 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:
2. Opsi Penskalaan:
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:
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.
sumber
min_instances
ke 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.
min_instances
untuk lingkungan standar, dokumen yang Anda tautkan mengacu pada parametermin_num_instances
yang berbeda yang untuk lingkungan fleksibel. Saya akan memperbarui jawaban saya untuk mencerminkan ini dengan jelas.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.
sumber
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
sumber
max_num_instances
?min_num_instances
benar 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.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
sumber
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".
sumber