Google App Engine Flexible env的定价,500美元的课程

时间:2017-11-05 19:25:11

标签: node.js google-app-engine google-cloud-platform

我在App Engine Flexible env教程@上关注了Nodej: https://cloud.google.com/nodejs/getting-started/hello-world

成功部署并测试了本教程之后,我将代码更改为稍微进行了实验并成功部署了它......然后让它继续运行,因为这是一个测试环境(非公开)。

一个月后,我收到了谷歌超过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小时的资源?在最糟糕的情况下,我会假设720小时全天运行一个月@ 0.05美元/小时将花费我~40美元。 https://cloud.google.com/appengine/pricing

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

感谢您的帮助!

对于更多数据,这是过去一个月的流量(基本为0): Traffic Data

实例数据Instance Data

更新: 请注意,我确实对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

7 个答案:

答案 0 :(得分:80)

经过多次来回与谷歌,以及几个小时阅读博客和查看报告,我终于(有点)找到了解释发生的事情。我会在这里发布我的建议,以便其他人也不会成为这个问题的受害者。

请注意,对于某些人来说这似乎是显而易见的,但作为新的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. 更新您的 app.yaml ,仅使用最少的资源强制执行1个实例:

  4. 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. 设置每日支出限额
    2. 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,它既有定价,也有免费/爱好。我能够快速推送一个新的节点应用程序,它就像魅力一样! https://www.heroku.com/pricing

      学习本课“只”花了我500美元,但我希望这有助于其他人查看Google App Engine Flex Env​​。

答案 1 :(得分:5)

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

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

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

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

答案 2 :(得分:4)

由于没有人提及,因此这里是与版本有关的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

答案 3 :(得分:2)

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

runtime: nodejs
env: flex
automatic_scaling:
  min_num_instances: 1

答案 4 :(得分:2)

感谢分享! 看完这篇文章后,我的账单像下面的图表一样下降

Steep cliff

我的问题是,我认为较旧的版本在部署新版本时就停止了(在部署时明确表示我是gcloud,它会拆分流量并停止版本...) 但是在仔细查看版本页面后,我有一堆旧机器仍在运行,但流量为0%。通过在部署时指定版本,可以轻松纠正昂贵的错误。

gcloud app deploy --version v1

It serves someone, right?

答案 5 :(得分:2)

如果您想降低GAE成本,请请勿按照this article的建议使用manual_scaling或接受的答案!

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

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

1。 App Engine Flex与标准:

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

  

(Flex是)旨在免费或以非常低的成本运行,您只需为   您需要什么以及何时需要。例如,您的应用程序可以   没有流量时,扩展为0个实例。

2。缩放选项:

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

3。实例类型: 有2个instance types,它们启动新实例所需的时间基本上不同。当需要时,可以在约0.1秒内创建F类实例(用于自动缩放),而在大约0.7秒内可以创建B类实例(用于手动缩放/基本): enter image description here

enter image description here

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

manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10

这指示GAE一直在运行自定义实例类(more costly)。显然,这不是最便宜的选择,因为可以使用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:强烈建议您设置daily spending limit,以防您忘记了正在运行的内容或在某处进行了一些昂贵的设置。

答案 6 :(得分:1)

对于不介意延迟的开发环境,我使用以下设置:

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

如果您使用实例超过免费后端实例配额,请尝试以下操作:

instance_class: F1
automatic_scaling:
  max_instances: 1

在AppEngine仪表板上,观察实例,记下开始时间,并观察以确保在闲置超时时间过去之后,实例计数降至零,并且您会看到消息“此版本未部署任何实例”。