Google App Engine .Net Core 2.0 应用无法访问 Google Cloud SQL 数据库

Posted

技术标签:

【中文标题】Google App Engine .Net Core 2.0 应用无法访问 Google Cloud SQL 数据库【英文标题】:Google App Engine .Net Core 2.0 app can't access Google Cloud SQL database 【发布时间】:2018-06-25 07:11:21 【问题描述】:

我有一个在 Google App Engine 柔性环境中运行的 dotnet core 2.0 应用程序。在同一个 Google 项目中,我有一个 Cloud SQL - mysql 数据库。在 Cloud SQL 实例详细信息页面上,在 Authorizations 选项卡下,它声明了

此项目中的应用:所有已授权。

但是,除非我将 0.0.0.0/0 路由添加到授权网络部分,否则我无法从我的应用程序访问数据库。

在不向外界开放我的数据库的情况下,我可以做些什么来授予我的应用程序数据库访问权限?


Jeffery Rennie 于 2018 年 5 月 21 日更新(已接受答案)

App Engine 现在支持使用端口号而不是 unix 域套接字连接到 Cloud SQL 实例。所以现在,你可以在你的app.yaml 中添加这样的内容:

beta_settings:
    cloud_sql_instances: "your-project-id:us-central1:instance-name=tcp:5432"

并在 appsettings.json 的连接字符串中指定 Host=cloudsql

"ConnectionString": "Uid=aspnetuser;Pwd=;Host=cloudsql;Database=visitors"

在上面的示例中,端口是 5432,这是 PostgreSQL 数据库的默认端口。对于 MySQL 数据库,请使用端口 3306。

可在此处找到包含部署到 App Engine 的说明的完整示例:

https://github.com/GoogleCloudPlatform/dotnet-docs-samples/tree/master/appengine/flexible/CloudSql

【问题讨论】:

【参考方案1】:

理想的解决方案是使用unix domain socket 从您的应用引擎实例连接到 Cloud SQL。这就是 Python 和 php 等其他编程语言的工作方式。不幸的是,MySQL connector 不适用于域套接字。我看不出它为什么不能,但事实并非如此。我希望他们能尽快解决这个问题。

如https://cloud.google.com/appengine/kb/#static-ip中所述,

请注意,使用静态 IP 地址过滤并不安全 和有效的保护手段。例如,攻击者可以设置 启动可能共享相同 IP 地址的恶意 App Engine 应用 范围作为您的应用程序。相反,我们建议您进行辩护 使用 OAuth 和 Certs 的深入方法。

如果证书不足以保护您的应用程序,那么我今天看到的唯一剩下的选择是构建一个运行Cloud SQL Proxy 的custom runtime。代理可以将本地 ip 端口号转发到 unix 域套接字。如果你已经构建了一个或两个docker 图像,那还不错。

随着情况的改善,我会更新这个答案。


2018 年 5 月 21 日更新

App Engine 现在支持使用端口号而不是 unix 域套接字连接到 Cloud SQL 实例。所以现在,你可以在app.yaml 中添加类似这样的内容:

beta_settings:
    cloud_sql_instances: "your-project-id:us-central1:instance-name=tcp:5432"

并在 appsettings.json 的连接字符串中指定 Host=cloudsql

"ConnectionString": "Uid=aspnetuser;Pwd=;Host=cloudsql;Database=visitors"

在上面的示例中,端口是 5432,这是 PostgreSQL 数据库的默认端口。对于 MySQL 数据库,请使用端口 3306。

可在此处找到包含部署到 App Engine 的说明的完整示例:

https://github.com/GoogleCloudPlatform/dotnet-docs-samples/tree/master/appengine/flexible/CloudSql

【讨论】:

感谢您的回复。我期待只是配置错误或类似的东西。我会尝试应用其中的一些,看看我能得到什么。我会尽快回复。再次感谢您的帮助。 好的,经过大量阅读,我对我们必须做的事情感到非常满意。现在我们将依赖证书。我认为我们不必执行自定义运行时和代理。感谢您的帮助。 偶然发现了这个确切的问题。最近有更新吗? @dshout 不幸的是,没有。接受的答案中描述的解决方案是处理它的方法。我们现在正在研究 Azure。它使用起来要简单得多,并且在成本方面非常可比。 Lafexlos,Google 的工程师正在努力改善这种体验。我正在积极跟踪和推动这个问题。【参考方案2】:

虽然您没有错,“此项目中的应用:所有授权”似乎表明您可以开箱即用地使用 Cloud SQL 的 App Engine 应用,但存在一些限制。

首先,您的 Cloud SQL 需要是 2nd generation instance,其次,specific instructions 取决于您使用的语言和 App Engine 类型(标准或弹性)。

如果你的情况符合所有要求,它应该可以工作。

对于您的特定用例,您需要.Net instructions,它确实表示您需要添加一个具有 0.0.0.0/0 访问权限的网络和一个用户帐户。用户身份验证 + SSL 应该提供您需要的安全性。

【讨论】:

嗨!我们正在使用具有灵活环境的第二代云 SQL 和 .net core 2。据我从文档中了解到,使用这些设置,它应该被授权。我们使用实体框架核心 2 作为 ORM。您知道这是否是问题所在? .Net 指令需要一个具有所有 IP 访问权限的网络。它可能与 .Net 的工作方式有关。请通读一遍,您将了解我们如何处理该设置的安全方面。 好吧,与其允许来自“任何”IP,不如至少将其限制为仅允许来自应用引擎 ip 范围列表,这可以通过迭代以下 spf 记录 _cloud-netblocks.googleusercontent 来找到。 com 有关说明,请参阅cloud.google.com/appengine/kb/#static-ip。

以上是关于Google App Engine .Net Core 2.0 应用无法访问 Google Cloud SQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章

复制数据与 Google App Engine 上的多次搜索 - 设计决策

在 Google App Engine 上通过 OKClient 使用 OkHttp 客户端会引发“java.lang.NoClassDefFoundError: java.net.ProxySele

java.lang.NoClassDefFoundError:部署到Google App Engine时无法初始化类net.sf.cglib.proxy.Enhancer。

带有 .Net Core 3.1 MVC 应用程序的 Google App Engine - 控制器之间的会话数据丢失

Python Google App Engine - 获取位置

Google App Engine 上 Django 中的包含标签