谷歌应用程序引擎弹性环境的定价,500美元的教训

我遵循了 Nodejs 的 App Engine 柔性环境教程: Https://cloud.google.com/appengine/docs/flexible/nodejs/create-app

在成功地部署和测试了该教程之后,我对代码进行了一些修改以进行试验,并成功地部署了它... ... 然后让它继续运行,因为这是一个测试环境(不是公开的)。

一个月后,我收到了来自谷歌的超过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) : Traffic Data

和实例数据Instance Data

更新: 注意,我确实对 package.json 进行了一处修改: 我将 noemon 作为一个依赖项添加进来,并将其作为“ 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"
},

Yaml (default-与教程无关)

runtime: nodejs
env: flex
34310 次浏览

在与谷歌进行了多次交流,花了几个小时阅读博客和查看报告后,我终于找到了对所发生事情的解释。我将在这里张贴我的建议,使其他人不会也成为这个问题的受害者。

注意,这可能对某些人来说是显而易见的,但是作为一个新的 GAE 用户,所有这些对我来说都是全新的。

简而言之,当部署到 GAE 并使用以下命令“ $gcloud 应用部署”时,它将创建一个新版本并将其设置为默认版本,但是更重要的是,它不会删除已部署的以前版本。

关于版本和实例的更多信息可以在这里找到: https://cloud.google.com/appengine/docs/standard/python/an-overview-of-app-engine

因此,在我的情况下,在不知情的情况下,我已经创建了我的简单节点应用程序的多个版本。这些版本仍在运行,以防出现错误后需要切换。但是这些版本也需要实例,除非 app.yaml 中有说明,否则默认情况下是2个实例。

谷歌表示:

默认情况下,应用程序引擎会调整运行中的数量和 降低到与负载相匹配,从而为您的 应用程序在任何时候,同时最小化空闲实例,从而减少 成本。

然而,根据我的经验,情况并非如此。正如我之前所说,我推出了我的节点应用程序与无恶魔,它似乎是造成错误。

最后,遵循教程并且没有关闭项目,我有了4个版本,每个版本有2个实例,全天运行1.5个月,为0个请求提供服务,生成大量错误消息,花费了我500美元。

如果您仍然想使用 GAE FLEX ENV,建议:

  1. 首先,设置一个账单预算 & 警告,这样你就不会对一个昂贵的发票感到惊讶,这个发票会自动记入你的消费者信息中心的 https://cloud.google.com/billing/docs/how-to/budgets

  2. 在测试 env 中,您很可能不需要多个版本,因此在部署时使用以下命令:
    $ 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. 设定每日消费限额

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美元来学习这一课,但我确实希望这有助于其他人看谷歌应用程序引擎 Flex Env。

还要注意的是,如果你仍然希望你的应用程序具有自动伸缩性,但是你不希望默认的最少2个实例一直运行,你可以这样配置 app.yaml:

runtime: nodejs
env: flex
automatic_scaling:
min_num_instances: 1

我们有部署到 GAE FE 的代码,由于级联、指数级故障(弹出的电子邮件生成弹出的电子邮件等) ,我们无法关闭被窃听的 GAE 实例。经过4个多小时,和1M + 电子邮件发送(邮枪只是不会让我们禁用帐户。它说“请等待长达24小时的密码更改生效”,撤销 API 密钥没有任何作用) ,重置虚拟机被停止,数据库关闭,所有网站的代码减少到一个单一的“停止维护”静态503页) ,电子邮件继续发送。

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

但是,尽管 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美元的超额账单!事实上,它“只”花了 1500美元。我们从来没有接触过任何人来争论这个问题。所以首席执行官把它吃了。

如果您想减少您的 GAE 成本请 不要使用 manual_scaling的建议在 这篇文章或接受的答案!

谷歌应用程序引擎的美妙之处在于,它可以根据需求在毫秒内扩展到数百台计算机。而且您只为正在运行的实例付费。

为了能够优化成本,你需要了解不同的缩放选项和实例类型:

1. App Engine flex vs Standard:

关于差异的细节可以在 给你中找到,但与这个问题相关的一个重要差异是:

[标准是]打算免费或以非常低的成本运行,在这里你只需付费 你需要什么,什么时候需要。例如,你的应用程序可以 当没有流量时,缩放到0实例。

2. 缩放方案:

  • 自动缩放: Google 会根据你提供的需求和配置来缩放你的应用程序。
  • 手动缩放: 根本没有缩放,GAE 将一直运行您要求的实例的精确 # (非常具有误导性的命名)
  • 基本缩放: 它会扩大到限制你的设置,也会在一定时间后缩小

3. 实例类型: 有2个 实例类型,它们在旋转一个新实例所需的时间上基本上是不同的。F 类实例(用于自动缩放)可以在需要时在 ~ 0.1秒内创建,B 类实例(用于手动缩放/基本)在 ~ 0.7秒内创建: enter image description here

enter image description here

既然你已经理解了基本原理,让我们回到公认的答案:

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)

这将落在免费配额谷歌提供的,它不应该成本你任何东西,如果你没有任何实际的流量。

PS: 我们强烈建议设置 每日开支限额,以防你忘记了什么东西在运行,或者你有一些昂贵的设置(每日消费限制已被废弃,但将可用到2021年7月24日,来源)。

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

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

如果您使用实例的次数超过了免费后端实例允许的次数,请尝试这样做:

instance_class: F1
automatic_scaling:
max_instances: 1

它是 AppEngine 指示板,监视实例,记录开始时间,并确保在怠速超时时间过后,实例计数降为零,并且您可以看到消息“ This version has no Instance loyment”。

由于没有人提到,下面是与版本相关的 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

这些选项在 flex环境中不起作用:

返回文章页面

    # 1.
resources:
cpu: .5
memory_gb: .18
disk_size_gb: 10
    

# 2.
automatic_scaling:
min_instances: 1
max_instances: 1
      

# 3.
beta_settings:
machine_type: f1-micro

相关错误:

1.

错误响应: [3] App Engine 灵活验证错误: 内存 GB (0.58)每个 VCPU 必须在0.90至6.50之间

INVALID _ ARGUMENT: 基于 VM 的自动化 缩放不应有以下参数: 标准 _ 调度程序 _ 设置. min _ 实例, 调度程序设置,最大实例]

  • “@type”: type.googleapis.com/google.rpc:
    • 描述: ‘基于 VM 的自动缩放不应该包含以下参数: “标准 _ 调度器 _ 设置. min _ 实例,标准 _ 调度器 _ 设置. max _ 实例” 自动缩放

INVALID _ ARGUMENT: 无法识别或 配置“ beta _ sets”中的未被允许的密钥

  • “@type”: type.googleapis.com/google.rpc:
    • Description: beta _ setkey 不能与 env: flex 一起使用 字段: machine _ type