Google App Engineフレキシブル環境の料金、500ドルのレッスン


103

AppjsでNodejsフレキシブルenvチュートリアルをフォローしました@: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

リクエストがほとんどないこのテスト環境は、約6,000時間のリソースをどのように必要としましたか?最悪の場合、1か月間フルタイムで720時間実行すると、1時間あたり$ 0.05で約$ 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

課金については、GCPサポートにお問い合わせください
。support.google.com/ cloud / contact / cloud_platform_billing

4
@BrettJへの返信に感謝します。すでに連絡をとっていたのですが、次のように言われました。コミュニティフォーラムでは、経験豊富な開発者があなたの技術的な質問であなたを助けることができるでしょう。」
ddallala

2
あなたの期待は、標準の環境料金に基づいて表示されます(B1クラスのインスタンスのみ)。しかし、あなたはflex envを使用しています-異なる価格設定。app.yamlでCPUとGBのメモリ構成を確認します。これらはインスタンスごとの時間乗数です。次に、実行したインスタンスの数である2を掛けます。
Dan Cornilescu 2017年

こんにちは@DanCornilescuの価格は、フレックス環境の場合でも約0.0.5ドルです...コア時間あたりのvCPU $ 0.0526(アイオワ)。私は自分のapp.yamlを貼り付けました...つまり、チュートリアルから変更していません。
ddallala

1
これで、GCP課金サポートと通信するためのより良いデータポイントが手に入りました。
Dan Cornilescu

回答:


172

Googleと何度もやり取りし、何時間もブログを読んだり、レポートを確認したりして、ついに(やや)何が起こったかの説明を見つけました。他の人もこの問題の犠牲にならないように、ここに私の提案を添えて掲載します。

これは一部の人には明白に思えるかもしれませんが、新しいGAEユーザーとして、これらはすべてまったく新しいものでした。

つまり、GAEにデプロイして次のコマンド「$ gcloud app deploy」を使用すると、新しいバージョンが作成され、それがデフォルトとして設定されますが、さらに重要なことに、デプロイされた以前のバージョンは削除されません。

バージョンとインスタンスの詳細については、https//cloud.google.com/appengine/docs/standard/python/an-overview-of-app-engineをご覧ください。

そのため、私の場合、知らないうちに、単純なノードアプリの複数のバージョンを作成していました。エラー後に切り替える必要がある場合に備えて、これらのバージョンはまだ実行中です。ただし、これらのバージョンにはインスタンスも必要であり、app.yamlで指定されていない限り、デフォルトは2つのインスタンスです。

グーグルは言う:

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. 最小限のリソースで1つのインスタンスのみを強制するようにapp.yamlを更新します。

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日の費用制限を設定する

ここに画像の説明を入力してください

詳細については、このブログ投稿を参照してください:https : //medium.com/google-cloud/three-simple-steps-to-save-costs-when-prototyping-with-app-engine-flexible-environment-104fc6736495

学習や実験をしようとしている人たちを保護するために、これらの手順の一部がチュートリアルに含まれていれば良かったのですが、そうではありませんでした。

これらすべての詳細を知らないと、Google App Engine Flexの環境は扱いにくい場合があります。友人がHerokuを私に指摘しました。Herokuには、価格設定と無料/ホビーの両方のオファーがあります。そこに新しいノードアプリを素早くプッシュすることができ、それは魅力のように機能しました! https://www.heroku.com/pricing

このレッスンを学ぶのに500ドルしかかからなかったが、これがGoogle App Engine Flex Env​​を見る他の人に役立つことを願っている。


58
グーグルは本当にお粗末なドキュメントで市場を追い詰めているようだ。あなたが500ドル札を手にされたのは残念ですが、あなたの洞察を提供することで私が確信している他の多くの人のために弾丸を取ったので、とても感謝しています!
Drazen Bjelovuk

10
別の可能性 "gcloud app deploy app.yaml --stop-previous-version"
DeividasV

2
ありがとう、とても役に立ちました。請求アラート/制限は必須です。最近、同様の問題に直面しました
Kartik

1
常に単一のインスタンスを実行するため、これは間違いなく最も安価な方法ではありません。私の答えをご覧ください
Caner

AppEngineの標準envで同じような不測の事態が発生する可能性はありますか?または、OPの問題はflex envでのみ発生しますか?
John Doe

16

カスケード、指数関数的な失敗(バウンスされたメール、バウンスされたメールのメールなど)が原因で、GAE FEにコードをデプロイしましたが、まったく問題があり、バグのあるGAEインスタンスをオフにすることはできませんでした。4時間以上、100万件以上のメールが送信された後(Mailgunはアカウントを無効にできませんでした。「パスワードの変更が有効になるまで最大24時間お待ちください」と表示され、APIキーを取り消しても何も起こりませんでした)、redis VMが停止し、DBがダウンし、サイトのすべてのコードが単一の「メンテナンスのためのダウン」静的503ページに削減された場合)、メールは送信され続けました。

GAE FEは、CPU負荷がかかっているDocker VMもCloud Compute VM(redis)も単に終了しないと判断しました。多分決して!Compute VMを実際に削除すると(「単に」停止するのではなく)、メールは即座に停止しました。

しかし、GAEアプリがバージョンとインスタンスの100%が「停止」であると報告したにもかかわらず、DBは「メールを送信できませんでした」という通知でさらに最大2時間いっぱいになり続けました。Google Cloud SQLのパスワードを変更する必要がありました。

私たちは請求書をチェックし続け、7つの不正なインスタンスがCPUを使い続けたため、そのアカウントで使用されたカードをキャンセルしました。実際、請求書が期日を過ぎるとサイトはダウンしましたが、不正なインスタンスもダウンしました。GAEのメールサポートでは、この状況を解決することはできませんでした。


私がずっと前にその会社を辞めたので、毎月の請求額は約5,000ドル、通常は約300ドルだったと言えます。
セオドアR.スミス

私は過去数年間GCPとAWSを使用してきましたが、このような話を聞くと、AWSの腕に絶え間なく叫びたくなります。GCPのドキュメントとエラーチェックの穴は悲惨です-改善されていますが、それでもなお悲惨です。それは理由のために安いです。とは
いえ

GCPで重大な問題が発生している場合、Googleの担当者に連絡することは文字通り不可能です。私たちは何ヶ月もの間、全体的な不安定性の問題について彼らに連絡を取ろうとしました。立ち入り禁止。
セオドアR.スミス

私は彼らの技術サポートで大丈夫でしたが、私の会社はサポートアカウントsooooも支払います
ingernet

16

GAEのコストを削減したい場合は、この記事または承認された回答で提案されているように使用しないでください。manual_scaling

Google App Engineのすばらしいところは、要求に応じて数ミリ秒以内に数百台のマシンにスケールアップおよびスケールダウンできることです。また、実行中のインスタンスに対してのみ支払います。

コストを最適化するには、さまざまなスケーリングオプションとインスタンスタイプを理解する必要があります。

1. 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:何かを実行しているのを忘れた場合や、どこかに高価な設定がある場合に備えて、1日の支出制限を設定することを強くお勧めします。


2
min_instances0に設定することはできません。ドキュメントによると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

3
@yorbroは、指摘してくれてありがとう、min_instances 標準環境用です。リンクしたドキュメントmin_num_instances は、フレックス環境用の別のパラメータを参照しています。これを明確に反映するように回答を更新します。
Caner

ああ、悪い。早速のお返事ありがとうございます!
yorbro

min_instancesのドキュメントに警告があります:この機能が正しく機能するには、ウォームアップリクエストが有効になっていて、アプリケーションがウォームアップリクエストを処理していることを確認する必要があります。これを有効にする必要がありますか?これが実装されていない場合、レイテンシにどのような影響がありますか?約600人のユーザーを抱えるアプリのランニングコストを削減するために、最適なスケーリング設定が何であるかを理解しようとしています。
ピート・ニース

その警告は新しいようです、私は前にそれを見たことがありません。そうは言っても、パフォーマンスへの影響についてはわかりません。詳細はこちら:cloud.google.com/appengine/docs/standard/python/...
Caner

4

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

runtime: nodejs
env: flex
automatic_scaling:
  min_num_instances: 1

max_num_instancesってことかな?
ドミニク

4
インスタンスを制限するオプションは絶対にありません。DDoS攻撃中に1,000インスタンスをスピンアップし、顧客に数千ドルを請求することは、GCPのビジネス戦略です。
セオドアR.スミス

2
@ TheodoreR.Smithが実際にできる最大値と1日の制限を設定
zardilior

3
min_num_instances冗長性を犠牲にしてアイドル状態でお金を節約したい場合は、@ Dominic が適切です。@Theodore インスタンスを制限するためのmax_num_instancesもありますが、App Engineフレキシブルに1日の支出制限を設定することはできません(ただし、標準では設定できます)。ただし、予算とアラートを設定できます。
jon_wu

3

誰も言及していないため、バージョンに関連する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

0

少し待機時間を気にしない開発環境では、次の設定を使用しています。

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

また、無料のバックエンドインスタンスの許容量を超えてインスタンスを使用する場合は、次のことを試してください。

instance_class: F1
automatic_scaling:
  max_instances: 1

AppEngineダッシュボードでインスタンスを監視し、開始時刻をメモして、idle_timeout期間が経過した後、インスタンス数がゼロになり、「このバージョンにはインスタンスがデプロイされていません」というメッセージが表示されることを確認します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.