Google App Engine Flexible环境的定价,一堂$ 500的课程


103

我遵循了App Engine Flexible env教程@上的Nodejs:https://cloud.google.com/nodejs/getting-started/hello-world

成功部署并测试了本教程后,我将代码进行了一些实验,然后成功部署了它……然后将其运行,因为这是一个测试环境(非公开)。

一个月后,我收到了Google的一笔账单,金额超过370美元!

在交易明细中,我看到以下内容:

2017年10月1日至31日,App Engine Flex实例RAM:5948.774 Gibibyte-hours([MYPROJECT])$ 42.24

2017年10月1日至31日,App Engine Flex实例的核心小时数:5948.774小时([MYPROJECT])$ 312.91

这个几乎有0个请求的测试环境如何需要约6,000个小时的资源?在最坏的情况下,我会假设一个月有720个小时的全职工作,每小时$ 0.05,那么我要花$ 40左右。 https://cloud.google.com/appengine/pricing

有人可以帮助阐明这一点吗?我无法找出为什么需要这么多资源?

谢谢您的帮助!

要获取更多数据,请查看上个月的流量(基本上为0): 交通数据

和实例数据实例数据

更新:请注意,我确实对package.json进行了修改:我将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
BrettJ

4
感谢@BrettJ的回复,我已经与他们联系,这是他们告诉我的:“如上所述,我们没有任何能力查看使用情况的详细报告,这就是我提供链接的原因,因此您也可以发布在社区论坛上,将再次有经验丰富的开发人员可以帮助您解决技术问题。”
ddallala

2
您的期望是根据标准的环境价格(仅B1类实例)显示的。但是您使用的是flex env-不同的定价。检查app.yaml中的CPU和GB内存配置-这些是您按实例小时数的乘数。然后,您将2乘以-您正在运行的实例数。
Dan Cornilescu

您好@DanCornilescu的价格仍为〜$ 0.0.5,即使对于flex envs ... vCPU每核心小时$ 0.0526(爱荷华州)。我粘贴了app.yaml ...简而言之,没有从教程中对其进行修改。
ddallala

1
好的,现在您有了更好的数据点来与GCP结算支持进行通信。
Dan Cornilescu

Answers:


174

经过与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以仅使用最少的资源强制执行一个实例:

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. 设定每日支出限额

在此处输入图片说明

有关更多信息,请参见此博客文章:https : //medium.com/google-cloud/three-simple-steps-to-save-costs-when-prototyping-with-app-engine-flexible-environment-104fc6736495

我希望本教程中包含一些步骤,以保护尝试学习和尝试的人,但事实并非如此。

如果不了解所有这些详细信息,则Google App Engine Flex环境可能会很棘手。一个朋友向我指出了Heroku,它既有定价又有免费/业余爱好优惠。我能够在那里快速推送一个新的节点应用程序,它的工作原理很吸引人! https://www.heroku.com/pricing

它“仅”花费了我$ 500来学习本课程,但我希望这对其他使用Google App Engine Flex Env​​的人有所帮助。


58
Google似乎确实在糟糕的文档方面垄断了市场。不幸的是,您被一张500美元的钞票打了一巴掌,但是您肯定已经为许多其他人提供了帮助,我肯定会提供您的见解,非常感谢!
Drazen Bjelovuk

10
另一种可能性“ gcloud应用程序部署app.yaml --stop-previous-version”
DeividasV

2
谢谢,非常有帮助。帐单提醒/限额是必须的。就在最近面临类似的问题
Kartik,

1
这绝对不是最便宜的方法,因为它会不断地运行单个实例。请看我的答案
Caner

我们是否可以期望AppEngine标准env带来同样的坏消息?还是提到的问题OP仅在flex env中发生?
John Doe

16

由于级联,指数级失败(退回的电子邮件生成退回的电子邮件等),我们已经将代码部署到GAE FE变得完全发疯,并且我们无法关闭有bug的GAE实例。4个多小时后,并发送了1M +电子邮件(Mailgun不允许我们禁用该帐户。它说“请等待24小时,以使密码更改生效”,并且吊销API密钥无济于事),redis VM停止,数据库关闭,并且所有站点的代码都缩减为一个单独的“停机维护”静态503页),电子邮件一直在发送。

我确定GAE FE只是不会结束承受CPU负载的docker VM或Cloud Compute VM(redis)。也许永远不会!一旦我们实际删除了Compute VM(而不是“仅仅”停止它),电子邮件便立即停止。

但是,尽管GAE应用程序报告100%的版本和实例“已停止”,但我们的数据库仍继续充满“无法发送电子邮件”的通知长达2个小时。我最终不得不更改Google Cloud SQL密码。

我们一直在检查账单,这7个流氓实例继续使用CPU,因此我们取消了该帐户上使用的卡,实际上,站点在账单过期时确实掉线了,但流氓实例也是如此。GAE电子邮件支持无法解决这种情况。


既然我很早就离开了那家公司,我可以告诉你,每月的账单大约是5,000美元,通常是300美元左右。
西奥多·史密斯

在过去的几年中,我一直在使用GCP和AWS,而这样的故事让我想全职投入AWS的怀抱。GCP文档和错误检查中的漏洞令人费解-虽有所改善,但仍然令人费解。便宜是有原因的。就是说,我即将在GAE上部署一个应用程序,拿着我的啤酒
ingernet

如果您在使用GCP时遇到严重问题,就不可能与Google的任何人取得联系。我们尝试了几个月的时间,就严重不稳定问题与他们联系。不行
西奥多·R·史密斯

我对他们的技术支持很幸运,但是我的公司也为支持帐户付款,soooo
ingernet

16

如果您想降低GAE成本,请不要使用本文中manual_scaling建议的方法或公认的答案!

Google App Engine的美丽之处在于,它可以根据需求在几毫秒内扩展到数百台机器。您只需为正在运行的实例付费。

为了能够优化成本,您需要了解不同的扩展选项和实例类型:

1. App Engine Flex与标准:

有关差异的详细信息可以在此处找到,但是与此问题相关的一个重要差异是:

[标准]旨在免费或以非常低的价格运行,您只需要为需要的时间和需要的时间付费。例如,当没有流量时,您的应用程序可以扩展到0个实例。

2.缩放选项:

  • 自动缩放:Google会根据需求和您提供的配置来缩放您的应用。
  • 手动缩放:完全不进行缩放,GAE会一直运行您要求的实例的确切数量(非常容易引起误解的命名)
  • 基本缩放:它将放大以限制您的设置,并且在一定时间后也会缩小

3.实例类型:实例类型 有2 ,它们在启动一个新实例所需的时间上基本上有所不同。可以在需要时约0.1秒内创建F类实例(用于自动缩放),而在约0.7秒内可以创建B类实例(用于手动缩放/基本): 在此处输入图片说明

在此处输入图片说明

现在您已经了解了基础知识,让我们回到公认的答案:

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:强烈建议您设置每日支出限额,以防您忘记了正在运行的东西或在某处进行了一些昂贵的设置。


2
您不能设置min_instances为0。根据文档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 是针对Flex环境的不同参数。我将更新我的答案以清楚地反映这一点。
坎纳

啊,我的坏。感谢您的快速答复!
yorbro

在min_instances的文档中说:警告:为了使此功能正常运行,必须确保启用了预热请求,并且您的应用程序可以处理预热请求。是否必须启用此功能?如果不实施,它将对延迟产生什么影响?我正在尝试减少具有约600个用户的应用程序的运行成本,因此我试图找出最佳的缩放设置。
皮特·尼斯

该警告似乎是新的,我之前从未见过。话虽这么说,不知道对性能的影响。详情点击这里:cloud.google.com/appengine/docs/standard/python/...
蚕儿

4

还要注意,如果您仍然希望您的应用具有自动缩放功能,但又不想始终默认运行至少2个实例,则可以这样配置app.yaml:

runtime: nodejs
env: flex
automatic_scaling:
  min_num_instances: 1

我想你的意思是max_num_instances
多米尼克

4
绝对没有限制实例的选项。在DDoS攻击期间启动1000个实例并向客户收取1000美元的费用是GCP的业务策略。
西奥多·R·史密斯,

2
@ TheodoreR.Smith实际上可以设置最大限制,还可以设置每日限制
zardilior

3
@Dominic min_num_instances在这里是正确的,如果您想在空闲时省钱以节省冗余。@Theodore还有max_num_instances可以限制实例,但是您不能在App Engine flexible上设置每日支出限制(但可以在标准上设置)。但是,您可以设置预算和警报。
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仪表板上,观察实例,记下开始时间,并观察以确保在闲置超时时间过去之后,实例计数降至零,并且您会看到消息“此版本未部署实例”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.