使用Google Compute Engine作为Google App Engine Web应用程序的代理

8
我在Google App Engine上有一个Java Web应用程序,它向外部API发出请求。该API最近要求在访问其服务时对IP地址进行白名单处理。由于GAE不提供静态IP,我了解到一种解决方案是设置GCE实例(具有静态IP)并将其用作GAE应用程序发出的外部请求的代理。
我已经使用Debian GNU/Linux 9设置了f1-micro实例,并根据文档创建了一个静态外部IP地址。
如何安装nginx并设置GAE以将请求路由到GCE代理?
2个回答

13

我们与一个需要将我们的IP地址列入白名单的客户遇到了类似的问题。我们通过以下方式解决了这个问题:

  1. 创建一台带有静态IP地址的计算引擎。这是我们提供给客户的IP地址。
  2. 在计算引擎上安装Squid (https://help.ubuntu.com/lts/serverguide/squid.html)
  3. 然后我们通过代理服务器重定向了所有来自App Engine的调用。您没有列出您使用的语言,但对于PHP,这意味着向我们的CURL操作中添加以下两行:

    curl_setopt($ch, CURLOPT_PROXY, "http://" . $_SERVER['SQUID_PROXY_HOST'] . ":" . $_SERVER['SQUID_PROXY_PORT'] );

    curl_setopt($ch, CURLOPT_PROXYUSERPWD, $_SERVER['SQUID_PROXY_USER'] . ":" . $_SERVER['SQUID_PROXY_PWD']);

需要注意的一点是,根据您所进行的呼叫数量,微型实例可能不适合您。我们最初在微型盒子上设置了代理服务器,但每隔几天就必须重新启动它。最终,我们切换到标准盒子,并且从那时起就没有遇到任何问题。


2
你好,我现在也面临着同样的问题。我们使用Go应用程序在应用引擎上运行,该应用程序向外部服务器发出请求,我们必须被列入白名单。所以情况是一样的。你提到了PHP的两行代码,但我不知道我该如何处理Go应用程序才能实现这一点。我已经设置了一个具有静态IP的VM,但目前从应用引擎到VM的连接还没有建立。 - Vario
@vario 我也遇到了同样的问题,不知道你最终是如何解决的?似乎需要一个 VPC 访问连接器来建立 App Engine 和 Compute Engine 中 Squid 实例之间的连接? - jonhendrix
如果所有请求都将被重定向到代理服务器,使用应用引擎的意义何在?为什么不直接在计算引擎上部署应用程序并从那里提供服务。我认为使用应用引擎的目的是获得冗余和容错性。如果它被代理,那么所有请求最终都将从计算引擎中提供服务,这样做的意义何在?我有什么遗漏吗? - Merhawi Fissehaye
这是一个很好的观点。我绝对不建议将每个请求都通过代理服务器路由,否则您会限制您的请求并创建一个单点故障。在我们的情况下,我们有几个客户需要静态 IP 地址,因此我们只通过代理服务器向其网站发送请求。所有其他请求都可以正常路由。我不熟悉 Go 语言,但在 PHP 中,如果客户端请求白名单 IP 地址,只需添加来自我的原始答案中的两行即可。 - dwelling

4
您可以通过将应用引擎实例和自定义 NAT 实例配置在同一VPC自定义网络中,并使用路由规则解决此问题。
相关谷歌文档如下:
  1. 将计算引擎VM实例配置为Nat网关(https://cloud.google.com/vpc/docs/special-configurations#natgateway

  2. 为此实例创建路由规则(https://cloud.google.com/vpc/docs/using-routes#addingroute)和(https://cloud.google.com/vpc/docs/using-routes#canipforward

  3. 配置您的app.yaml网络属性(https://cloud.google.com/appengine/docs/flexible/java/reference/app-yaml#network_settings

如果您有复杂的系统,我强烈建议您创建子网络并使用特定标签来标记要转发到NAT网关的GAE实例。

1
对于第三步(配置 app.yaml 网络属性),URL 已更改为 https://cloud.google.com/appengine/docs/flexible/java/reference/app-yaml#network_settings - Merhawi Fissehaye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接