web-dev-qa-db-ja.com

Google App Engine Flexible envの価格設定、500ドルのレッスン

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): Traffic Data

そしてインスタンスデータ Instance Data

更新: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
53
ddallala

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を引き続き使用する場合の推奨事項:

  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. 1日の支出制限を設定する

enter image description here

詳細については、このブログ投稿を参照してください: 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​​を見るのに役立つことを願っています。

97
ddallala

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のメールサポートでは状況を解決できませんでした。

7

共有してくれてありがとう!この記事を読んだ後、私の請求書は下のグラフのように下がりました

Steep cliff

私の問題は、新しいバージョンをデプロイすると古いバージョンが停止したと想定していたことです(デプロイすると、明らかにgcloudと表示され、トラフィックを分割してバージョンを停止します...)しかし、バージョンページをよく見ると、多数の古いマシンがまだ実行されていますが、トラフィックの0%を処理しています。展開時にバージョンを指定することにより、高価なミスを簡単に修正できます。

gcloud app deploy --version v1

It serves someone, right?

5
Carl Engene

また、アプリで自動スケーリングを使用したいが、常にデフォルトの最小2インスタンスを常に実行したくない場合は、次のようにapp.yamlを設定できます。

runtime: nodejs
env: flex
automatic_scaling:
  min_num_instances: 1
2
Kat