【问题标题】:Eliminating nuisance Instance starts消除滋扰实例启动
【发布时间】:2021-09-10 04:22:33
【问题描述】:

我的 GCP 应用被一些用户滥用。为了阻止他们的使用,我试图消除可能被滥用的功能,并使用防火墙规则来阻止某些用户。但是不良用户继续尝试通过某些旧 URL(例如 myapp.appspot.com/badroute)访问我的应用程序。当然,我还是希望用户使用默认网址myapp.appspot.com

我已按以下方式更改了我的代码,但我仍然让实例从它们开始,并且我不希望在这种情况下使用实例。我可以采取哪些不同的措施来避免不良实例启动,或者我可以采取什么措施来强制此类实例快速停止,而不是在大约 15 分钟后停止?

class Dummy(webapp2.RequestHandler): 

  def get(self):
        logging.info("Dummy:  " )
        self.redirect("/")

app = webapp2.WSGIApplication(
                                     [('/', MainPage),
                                      ('/badroute', Dummy)],debug=True)

(当我应该提到请求时,我可能会提到实例。)

【问题讨论】:

  • 您能否详细说明除了通过 myapp.appspot.com 访问应用程序的请求之外,您如何确定哪些请求是错误的?
  • 如果他们请求 url .../badroute,他们是“坏的”。那是一条编造的路线。如果他们请求.../ 或任何其他网址,他们还不错。因为 GCP 启动的实例不会在 15 分钟内停止,即使我已将 app.yaml 中的 max_instances 设置为 1,我仍要为这些用户付费。这个应用程序是一个使用非常少的应用程序,所以我不希望为实例付费。
  • 您能否详细说明您如何管理身份验证和授权以及这些不良用户是否经过身份验证?
  • 我删除了验证码,因为需要在缩略图中识别对象的较新版本对用户来说太复杂了。这可能导致了这些问题。不良用户未通过身份验证。

标签: python google-app-engine


【解决方案1】:

那么目标是什么?您希望访问 /badroute 的用户被重定向到某个 /goodroute 吗?或者您希望 /badroute 不影响 GAE 并产生成本?

在前面放置一个谷歌云负载均衡器会有所帮助。

对于第一种情况,您可以设置重定向规则(尽管您也可以直接在 App Engine 中执行此操作,就像您在代码示例中所做的那样)。

如果你只是想让它不命中应用引擎,你可以设置谷歌云负载均衡器,让 /badroute 路由到 GCS 存储桶中的某个文件,而不是你的 GAE 服务

https://cloud.google.com/load-balancing/docs/https/ext-load-balancer-backend-buckets

但是,您将无法使用您的 *.appsot.com 基本网址。您将获得一个静态 IP,然后您应该将自定义域映射到它

【讨论】:

  • 我在研究第二种选择时遇到了麻烦(这更像我想要的)。例如,成本节省和成本增加是什么,如何“获得静态 IP...”,是否会删除或只是减少不良实例时间等。实际上,问题可能会通过我减少max_instances 到 1 和坏用户对我的应用程序失去兴趣。所以我现在希望最好,等待其他想法。
  • GCLB(谷歌云负载均衡器)根据规则/url映射将流量路由到不同的后端。您将为您的应用引擎服务和 GCS 定义一个背景否定。然后,您只需为哪些路线命中什么设置规则。你在这里保留一个静态IPconsole.cloud.google.com/networking/addresses/list
  • link Residence 基本扩展功能说“实例根据空闲超时参数关闭。如果实例空闲,例如它没有收到请求超过空闲超时,则实例被关闭。”那是在谈论强制_ah/stop吗?当我读到_ah/start 时,它说默认时间是 15 分钟,但其他文档说 idle_timeout 默认为 5 分钟。 (有时拼写为 idle-timeout,有时拼写为 idle_timeout)。试试idle_timeout?
  • idle-timeout vs idle_timeout 就是它在 appenging-web.xml 和 app.yaml 中的拼写方式。您是否在进行基本缩放,因为我认为 idle_timeout 仅适用于基本缩放。也许您读到您的代码在超时之前有 15 分钟的时间来响应 _ah/start 请求。这与 idle_timeout 的默认值为 5 分钟不同。我想您的链接正在强制执行 _ah/stop。 _ah/stop 只是一个礼貌的 webhook,您可以选择处理或不处理。无论 _ah/stop 如何,实例都会关闭。
【解决方案2】:

免责声明:我不能 100% 确定这是否可行。

  1. 创建一个新服务dummy
  2. 创建和部署dispatch.yaml (GAE Standard // GAE Flex)
  3. 将您要阻止的链接添加到dispatch.yaml 并将它们指向虚拟服务。
  4. 设置Identity Aware Proxy (IAP) 并为dummy 服务启用它。
  5. ???
  6. 利润

这个想法是,IAP 会在请求到达dummy 服务之前阻止它们。由于请求从未真正转发到服务dummy,因此您将不会启动实例。机器人将从 Google 自己的基础架构中获得一个不错的 403 页面。

编辑:确保创建具有 0 个实例的虚拟服务,因为这样做的想法是不花钱。


EDIT2:

所以让我稍微扩展一下这个答案。

您可以在一个 GCP 项目中运行多个 GAE 服务。每个服务都是它自己的应用程序。您可以让一个服务运行 python Flask 应用程序,而另一个服务运行 Java Springboot 应用程序。您可以将每个设置为 GAE Standard 或 GAE Flex。见this doc

通常所有流量都会路由到默认服务。使用dispatch.yaml,您可以向某些端点发出请求,转到特定的服务。

如果您将 dummy 服务创建为 GAE 标准应用程序,并且您实际上不需要它来执行任何操作,那么您可以将所有被滥用的端点路由到这个虚拟服务使用dispatch.yaml。使用 GAE 标准,您可以让服务使用 0 个实例(和 0 个成本)。

然后,您可以使用 IAP 确保只有您自己的 Google 帐户才能访问此应用(您不会这样做)。实际上,这意味着滥用者无法真正访问该服务,因为 IAP 在访问该服务之前会阻止它,因为您已将其设置为只有您的 Google 帐户才能访问它。

注意,dispatch.yaml 独立于任何服务,它是 GAE 的每个项目配置文件之一。它与特定服务无关。

如上所述,虚拟应用实际上不需要执行任何操作,但您需要部署一次,因为这基本上会创建服务。

【讨论】:

  • 第二步,dispatch.yaml是在myapp.appspot.com的目录下创建的,而不是在dummy.appspot.com的目录下?在步骤 1 中,dummy 是否存在于与myapp 分开的自己的目录中,并且有自己的 main.py? dummys main.py 包含什么?我很难理解这种方法,甚至不清楚为什么dummy 中的实例可能不会花钱。
  • 查看我的编辑,我已经澄清了一点。如果您对这种方法还有其他疑问,请随时提问...
【解决方案3】:

考虑使用 cloudflare 来减少机器人滥用,自定义有关路由访问、速率限制 ips 等的防火墙规则。如果您愿意,可以将其与 Google 云负载均衡器结合使用 — 如 https://stackoverflow.com/a/69165767/806876 中所述。

参考文献

Cloudflare GCP 集成:https://www.cloudflare.com/integrations/google-cloud/

【讨论】:

    【解决方案4】:

    关于我的app.yaml,我没有在我的问题中提供一些信息:

    handlers:
    - url: /.*
      script: mainapp.app
    

    只需从 url 规范中删除 .*,就不会创建实例启动。不过,用户会得到Error: Not Found。所以这满足了我的需求。

    Edo Akse 的回答通过阅读 here 将我推向了这个答案,所以我接受了他的回答。不过,我仍然不清楚如何实施 Edo's Answer。

    【讨论】:

      猜你喜欢
      • 2012-02-06
      • 1970-01-01
      • 2015-08-19
      • 2013-12-18
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多