我在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
有人可以帮助阐明这一点吗?我无法找出为什么需要这么多资源?
感谢您的帮助!
更新: 请注意,我确实对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
答案 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:
首先,设置结算预算&提醒,以免您对自动向CC收取的昂贵发票感到惊讶:https://cloud.google.com/billing/docs/how-to/budgets
在测试环境中,您很可能不需要多个版本,因此在部署时使用以下命令:
$ gcloud app deploy --version v1
更新您的 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
有关详细信息,请参阅此博客文章: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)
感谢分享! 看完这篇文章后,我的账单像下面的图表一样下降
我的问题是,我认为较旧的版本在部署新版本时就停止了(在部署时明确表示我是gcloud,它会拆分流量并停止版本...) 但是在仔细查看版本页面后,我有一堆旧机器仍在运行,但流量为0%。通过在部署时指定版本,可以轻松纠正昂贵的错误。
gcloud app deploy --version v1
答案 5 :(得分:2)
如果您想降低GAE成本,请请勿按照this article的建议使用manual_scaling
或接受的答案!
Google App Engine的美丽之处在于,它可以根据需求在几毫秒内扩展到数百台机器。而且,您只需为正在运行的实例付费。
要优化成本,您需要了解不同的扩展选项和实例类型:
1。 App Engine Flex与标准:
有关差异的详细信息可以在here中找到,但是与此问题相关的一个重要差异是:
(Flex是)旨在免费或以非常低的成本运行,您只需为 您需要什么以及何时需要。例如,您的应用程序可以 没有流量时,扩展为0个实例。
2。缩放选项:
3。实例类型: 有2个instance types,它们启动新实例所需的时间基本上不同。当需要时,可以在约0.1秒内创建F类实例(用于自动缩放),而在大约0.7秒内可以创建B类实例(用于手动缩放/基本):
现在您已经了解了基础知识,让我们回到公认的答案上吧
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仪表板上,观察实例,记下开始时间,并观察以确保在闲置超时时间过去之后,实例计数降至零,并且您会看到消息“此版本未部署任何实例”。