【问题标题】:Pricing of Google App Engine Flexible env, a $500 lessonGoogle App Engine Flexible env 的定价,500 美元的课程
【发布时间】:2018-04-17 22:47:59
【问题描述】:

我遵循了 App Engine 灵活环境上的 Nodejs 教程: https://cloud.google.com/nodejs/getting-started/hello-world

在成功部署并测试了本教程后,我更改了代码以进行一些实验并成功部署它......然后让它运行,因为这是一个测试环境(不公开)。

一个月后,我收到了来自 Google 的超过 370 美元的帐单!

在交易详情中,我看到以下内容:

2017 年 10 月 1 日至 31 日 App Engine Flex 实例 RAM:5948.774 Gibibyte-hours ([我的项目])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 的回复,我已经联系了他们,这就是他们告诉我的:“如前所述,我们无法查看使用情况的详细报告,这就是我提供的原因链接,以便您也可以在社区论坛上发布,同样会有经验丰富的开发人员可以帮助您解决技术问题。”
  • 您的期望基于标准 env 定价(并且仅是 B1 类实例)。但是您使用的是 flex env - 不同的定价。检查您的 app.yaml 中的 CPU 和 GB 内存配置 - 这些是您的每实例小时乘数。然后乘以 2 - 您运行的实例数。
  • 嗨,@DanCornilescu 的定价仍然在 0.0.5 美元左右,即使是 flex envs ... vCPU 每核心小时 0.0526 美元(爱荷华州)。我粘贴了我的 app.yaml ... 总之,没有从教程中修改它。
  • 好的,现在您有了更好的数据点可以与 GCP 计费支持人员进行沟通。

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


【解决方案1】:

在与 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. 更新您的 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. 设置每日消费限额

有关更多信息,请参阅此博客文章: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​​ 的人。

【讨论】:

  • Google 似乎真的让市场垄断了糟糕的文档。很不幸,你被打了 500 美元的钞票,但你已经为许多其他人承担了子弹,我敢肯定,通过提供你的见解,非常感谢!
  • 另一种可能性“gcloud app deploy app.yaml --stop-previous-version”
  • 谢谢,很有帮助。计费警报/限制是必须的。最近遇到了类似的问题
  • 这绝对不是最便宜的方式,因为它会不断地运行一个实例。请看我的回答
  • @SkrewEverything - 你不应该假设你在标准环境中是安全的。实例关闭行为取决于 app.yaml 配置。虽然默认配置通常会在没有流量时关闭实例,但这并不意味着您不能在标准环境中遇到完全相同的情况。
【解决方案2】:

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

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

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

1. App Engine flex 与标准:

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

[标准是]旨在免费或以非常低的成本运行,您只需支付 您需要什么以及何时需要。例如,您的应用程序可以 没有流量时扩展到 0 个实例。

2。缩放选项:

  • 自动扩展:Google 将根据您提供的需求和配置扩展您的应用。
  • 手动扩展:根本不扩展,GAE 将始终运行您要求的确切实例数(非常误导性的命名)
  • 基本缩放:它会放大到您设置的限制,也会在一定时间后缩小

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

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

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,以防您忘记运行某些东西或在某处进行了一些昂贵的设置(每日支出限制已被弃用,但将在 2021 年 7 月 24 日之前可用,source)。

【讨论】:

  • 您不能将min_instances 设置为0。根据documentationThe 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 感谢您指出这一点,min_instances 用于标准环境,您链接的文档引用了不同的参数 min_num_instances 用于 flex 环境。我将更新我的答案以清楚地反映这一点。
  • 我的错。感谢您的快速回复!
  • 在 min_instances 的文档中说警告:要使此功能正常运行,您必须确保启用了预热请求并且您的应用程序处理了预热请求。是否必须启用此功能?如果不实施,将对延迟产生什么影响?我正在尝试降低拥有大约 600 个用户的应用的运行成本,因此我正在尝试找出最佳的扩展设置。
  • 每日消费限额为deprecated¯_(ツ)_/¯
【解决方案3】:

由于级联、指数级故障(退回的电子邮件生成退回的电子邮件等),我们将部署到 GAE FE 的代码完全发疯了,我们无法关闭被窃听的 GAE 实例。 4 多个小时后,发送了 100 万多封电子邮件(Mailgun 只是不允许我们禁用该帐户。它说“请等待 24 小时以使密码更改生效”,并且撤销 API 密钥没有任何作用),redis VM被停止,数据库关闭,所有站点的代码都减少到一个“停机维护”静态 503 页面),电子邮件继续发送。

我确定 GAE FE 只是简单地不会结束处于 CPU 负载下的 docker VM 或云计算 VM (redis)。也许永远不会!一旦我们真正删除了 Compute VM(而不是“仅仅”停止它),电子邮件就会立即停止。

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

我们一直在检查账单,而 7 个恶意实例一直在占用 CPU,因此我们取消了在该帐户上使用的卡,事实上,当账单逾期时,网站确实宕机了,但同样如此流氓实例。我们无法通过 GAE 电子邮件支持解决这种情况。


更新(2020 年 9 月 30 日):这仍然是我 22 年职业生涯中最糟糕的时刻!!整个公司的 15 名天才开发者都无法弄清楚如何关闭 GAE。我们知道,当我的一位开发人员无法访问她的 GMail 帐户时,客户会收到数百万封电子邮件。拔不出来,关不掉。这真是一个“终结者”的时刻!

如果 MailGun 允许我们实际禁用 API 访问或更改密码,除了费用外,情况不会那么糟糕。但在 GAE 上,这仍然是一笔不小的开支。

我不再信任无法发出reboot 的服务器。

最后,MailGun 只收了我们大约 50 美元。然而,GAE……如果我只是假设“好的,邮件停止了,我们可以停止了”,我们最终可能会收到 20,000 美元的超额账单!事实上,它“仅”花费 1,500 美元。而且我们永远无法与任何人联系以提出异议。所以 CEO 就吃了。

【讨论】:

  • 现在我早就离开了那家公司,我可以告诉你,每月的账单大约是 5,000 美元,通常是 300 美元左右。
  • 过去几年我一直在使用 GCP 和 AWS,这样的故事让我想全职投入 AWS 的怀抱。 GCP 的文档和错误检查中的漏洞非常糟糕 - 有所改进,但仍然非常糟糕。便宜是有原因的。也就是说,我要在 GAE 上部署一个应用程序,拿着我的啤酒
  • 如果您在使用 GCP 时遇到严重问题,几乎不可能与 Google 的任何人取得联系。我们尝试了几个月就严重的不稳定问题与他们联系。不行。
  • 他们的技术支持我很幸运,但我的公司也支付了支持帐户的费用,太棒了
  • 这仍然是我 22 年职业生涯中最糟糕的时刻!!整个公司的 15 名天才开发者都无法弄清楚如何关闭 GAE。我们知道,当我的一位开发人员无法访问她的 GMail 帐户时,客户会收到数百万封电子邮件。无法拔掉它
【解决方案4】:

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

runtime: nodejs
env: flex
automatic_scaling:
  min_num_instances: 1

【讨论】:

  • 我想你的意思是max_num_instances
  • 绝对没有限制实例的选项。在 DDoS 攻击期间启动 1000 个实例并向客户收取 1000 美元的费用是 GCP 的一项业务策略。
  • @TheodoreR.Smith 实际上最大可以设置每日限制
  • @Dominic min_num_instances 在这里是正确的,如果您想在闲置时以冗余为代价省钱。 @Theodore 还有max_num_instances 来限制实例,但您不能在App Engine 灵活上设置每日支出限制(但您可以在标准上)。但是,您可以设置预算和提醒。
【解决方案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

【讨论】:

    【解决方案6】:

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

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

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

    instance_class: F1
    automatic_scaling:
      max_instances: 1
    

    在 AppEngine 仪表板中,观察实例,记下开始时间,并观察以确保在 idle_timeout 时间段过后,实例计数降至零,并且您会看到消息“此版本没有部署实例”。

    【讨论】:

      猜你喜欢
      • 2017-12-07
      • 2019-07-10
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 2022-06-23
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      相关资源
      最近更新 更多