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

dda*_*ala 65 google-app-engine node.js google-cloud-platform

我在App Engine灵活的env教程上关注了Nodejs:http://psoud.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): 交通数据

和实例数据实例数据

更新:请注意,我确实对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"
  },
Run Code Online (Sandbox Code Playgroud)

App.yaml(默认 - 教程没有变化)

runtime: nodejs
env: flex
Run Code Online (Sandbox Code Playgroud)

dda*_*ala 106

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

请注意,对于某些人来说这似乎是显而易见的,但作为新的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个实例:

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
Run Code Online (Sandbox Code Playgroud)
  1. 设定每日支出限额

在此输入图像描述

有关详细信息,请参阅此博客文章: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​​.

  • 谷歌似乎真的让市场陷入糟糕的文件中.不幸的是,你被500美元的账单打了一顿,但是你已经通过提供你的见解为许多其他人买了一颗子弹,非常感谢! (29认同)
  • 另一种可能性“ gcloud应用程序部署app.yaml --stop-previous-version” (4认同)
  • 谢谢,非常有帮助。帐单提醒/限额是必须的。最近遇到了类似的问题 (2认同)
  • @JohnDoe 它只发生在 Flex 环境中。在标准环境中,如果没有请求,实例将被关闭。您可以在[官方文档](https://cloud.google.com/appengine/docs/the-appengine-environments#comparing_high-level_features) -> 缩放到零行中阅读它 (2认同)

Can*_*ner 33

如果您想降低 GAE 成本,请不要manual_scaling按照本文或接受的答案中的建议使用!

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

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

1. App 引擎 flex 与标准:

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

[标准是] 旨在免费或以极低的成本运行,您只需在需要时为所需内容付费。例如,当没有流量时,您的应用程序可以扩展到 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
Run Code Online (Sandbox Code Playgroud)

这指示 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)
Run Code Online (Sandbox Code Playgroud)

这将在 google 提供的免费配额范围内,如果您没有任何实际流量,它应该不会花费您任何费用。

PS:还强烈建议设置每日支出限额,以防您忘记运行某些东西或在某处进行了一些昂贵的设置(每日支出限额已弃用,但将在 2021 年 7 月 24 日之前可用,来源)。

  • @yorbro 感谢您指出,“min_instances”适用于标准环境,您链接的文档引用了不同的参数“min_num_instances”,适用于 Flex 环境。我将更新我的答案以清楚地反映这一点。 (7认同)
  • 您无法将 `min_instances` 设置为 0。根据[文档](https://cloud.google.com/appengine/docs/flexible/nodejs/reference/app-yaml#automatic_scaling):`最小实例数为您服务。部署服务时,会为其提供这么多实例并根据流量进行扩展。必须为 1 或更大,默认值为 2 以减少延迟。 (5认同)
  • 每日支出限额已[弃用](https://cloud.google.com/appengine/docs/deprecations) ́\_(ツ)_/̊ (3认同)

The*_*ith 8

由于级联,指数级失败(退回的电子邮件生成退回的电子邮件,等等),我们部署到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电子邮件支持无法解决这种情况。

  • 过去几年我一直在使用 GCP 和 AWS,像这样的故事让我想全职投入 AWS 的怀抱。GCP 文档和错误检查中的漏洞非常糟糕——虽然有所改善,但仍然很糟糕。它便宜是有原因的。也就是说,我即将向 GAE 部署一个应用程序,别着急 (3认同)
  • 如果您在 GCP 方面遇到严重问题,那么几乎不可能与 Google 的任何人取得联系。几个月来,我们一直试图就严重不稳定问题与他们联系。不去。 (2认同)

Kat*_*Kat 5

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

runtime: nodejs
env: flex
automatic_scaling:
  min_num_instances: 1
Run Code Online (Sandbox Code Playgroud)

  • 绝对没有限制实例的选项。在 DDoS 攻击期间启动 1,000 个实例并向客户收取 1000 美元的费用是 GCP 的一项业务战略。 (5认同)
  • @TheodoreR.Smith 实际上可以设置最大限额,并且还设置每日限额 (3认同)
  • 如果您想以冗余为代价在闲置时省钱,@Dominic `min_num_instances` 在这里是正确的。@Theodore 还有 [max_num_instances](https://cloud.google.com/appengine/docs/flexible/nodejs/reference/app-yaml#automatic_scaling) 来限制实例,但您无法在应用程序上设置每日支出限制发动机灵活(但您可以按标准)。不过,您可以设置预算和警报。 (3认同)

Tay*_*lan 5

由于没有人提到,这里是与版本相关的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
Run Code Online (Sandbox Code Playgroud)