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
有人可以帮助阐明这一点吗?我无法找出为什么需要这么多资源?
谢谢您的帮助!
更新:请注意,我确实对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:
首先,设置结算预算和提醒,这样您就不会对自动向CC收取的昂贵发票感到惊讶:https://cloud.google.com/billing/docs/how-to/budgets
在测试环境中,您很可能不需要多个版本,因此在部署时使用以下命令:
$ gcloud app deploy --version v1
更新您的app.yaml以仅使用最少的资源强制执行1个实例:
Run Code Online (Sandbox Code Playgroud)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.
Can*_*ner 33
如果您想降低 GAE 成本,请不要manual_scaling
按照本文或接受的答案中的建议使用!
Google App Engine 的美妙之处在于它可以根据需求在几毫秒内扩展到数百台机器。您只需为正在运行的实例付费。
为了能够优化您的成本,您需要了解不同的扩展选项和实例类型:
1. App 引擎 flex 与标准:
可以在此处找到有关差异的详细信息,但与此问题相关的一个重要差异是:
[标准是] 旨在免费或以极低的成本运行,您只需在需要时为所需内容付费。例如,当没有流量时,您的应用程序可以扩展到 0 个实例。
2. 缩放选项:
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 日之前可用,来源)。
由于级联,指数级失败(退回的电子邮件生成退回的电子邮件,等等),我们部署到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电子邮件支持无法解决这种情况。
另请注意,如果您仍然希望您的应用程序具有自动缩放功能,但您不希望始终运行默认的最少 2 个实例,您可以像这样配置您的 app.yaml:
runtime: nodejs
env: flex
automatic_scaling:
min_num_instances: 1
Run Code Online (Sandbox Code Playgroud)
由于没有人提到,这里是与版本相关的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)
归档时间: |
|
查看次数: |
11063 次 |
最近记录: |