App Engine Flexible envのNodejsチュートリアル@: https://cloud.google.com/nodejs/getting-started/hello-world
チュートリアルを正常にデプロイおよびテストした後、少し実験するためにコードを変更し、正常にデプロイしました...これはテスト環境(パブリックではない)であったため、実行したままにしました。
1か月後、Googleから370ドル以上の請求書を受け取りました!
トランザクションの詳細には、次が表示されます。
2017年10月1日〜31日App Engine FlexインスタンスRAM:5948.774ギビバイト時間([MYPROJECT])$ 42.24
2017年10月1〜31日、App Engine Flexインスタンスのコア時間:5948.774時間([MYPROJECT])$ 312.91
ほぼ0のリクエストを含むこのテスト環境では、約6,000時間のリソースが必要でした。最悪の場合、1時間あたり$ 0.05で1か月間フルタイムで720時間実行すると、約$ 40の費用がかかります。 https://cloud.google.com/appengine/pricing
誰かがこれに光を当てるのを助けることができますか?なぜそれほど多くのリソースが必要なのかわかりません。
助けてくれてありがとう!
より多くのデータについては、これは先月のトラフィックです(基本的に0):
更新:package.jsonに1つの変更を加えたことに注意してください。依存関係として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
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はデフォルトで、負荷に合わせて実行するインスタンスの数を増減するため、アイドルインスタンスを最小限に抑えてコストを削減しながら、常に一定のパフォーマンスをアプリに提供します。
しかし、私の経験から、これは事実ではありませんでした。先ほど言ったように、nodemonでノードアプリをプッシュしましたが、エラーが発生しているようです。
最後に、チュートリアルに従ってプロジェクトをシャットダウンせずに、4つのバージョンがあり、それぞれが2つのインスタンスで1.5か月間フルタイムで実行され、0リクエストを処理し、多くのエラーメッセージを生成し、500ドルかかりました。
GAE FLEX ENVを引き続き使用する場合の推奨事項:
何よりもまず、CCに自動的に請求される高価な請求書に驚かないように、請求予算とアラートを設定します。 https://cloud.google.com/billing/docs/how-to/budgets
テスト環境では、ほとんどの場合、複数のバージョンは必要ないため、展開中に次のコマンドを使用します。$ gcloud app deploy --version v1
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
詳細については、このブログ投稿を参照してください: https://medium.com/google-cloud/three-simple-steps-to-save-costs-when-prototyping-with-app-engine-flexible-environment- 104fc6736495
これらの手順の一部が、学習と実験を試みている人を保護するためにチュートリアルに含まれていたらいいのですが、そうではありませんでした。
Google App Engine Flex envは、これらすべての詳細がわからない場合は注意が必要です。友達がHerokuを教えてくれました。Herokuにはセット価格とFree/Hobbyオファーの両方があります。私はそこに新しいノードアプリをすばやくプッシュすることができました。 https://www.heroku.com/pricing
このレッスンを学ぶのに「たった」500ドルかかりましたが、これが他の人がGoogle App Engine Flex Envを見るのに役立つことを願っています。
GAE FEにデプロイされたコードは、連鎖的な指数関数的エラー(バウンスされた電子メールがバウンスされた電子メールなどを生成するため)に完全に夢中になり、バグがあったGAEインスタンスをオフにできませんでした。 4時間以上後、1M以上のメールが送信されました(Mailgunはアカウントを無効にできません。「パスワードの変更が有効になるまで最大24時間お待ちください」と表示され、APIキーを取り消すことは何もしませんでした)、redis VMが停止し、DBがダウンし、すべてのサイトのコードが単一の「Down For Maintenance」静的503ページに縮小されたため、メールは送信され続けました。
GAE FEは、CPU負荷がかかっているdocker VMまたはCloud Compute VM(redis)を単に終了させないだけだと判断しました。たぶん決してない! Compute VMを実際に削除すると(「単に」停止するのではなく)、電子メールはすぐに停止しました。
しかし、GAEアプリが100%のバージョンとインスタンスを「停止」すると報告しているにもかかわらず、DBはさらに2時間まで「メールを送信できませんでした」という通知でいっぱいになりました。 Google Cloud SQLのパスワードを変更しなければならなくなりました。
請求書を確認し続け、7つの不正なインスタンスがCPUを使い続けたため、そのアカウントで使用されていたカードをキャンセルしました。実際、請求書の期限が切れたときにサイトはダウンしましたが、不正なインスタンスもそうでした。 GAEのメールサポートでは状況を解決できませんでした。
また、アプリで自動スケーリングを使用したいが、常にデフォルトの最小2インスタンスを常に実行したくない場合は、次のようにapp.yamlを設定できます。
runtime: nodejs
env: flex
automatic_scaling:
min_num_instances: 1