谷歌应用引擎.Net Core 2.0应用无法访问谷歌云SQL数据库。

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

此项目中的应用程序:全部已授权。

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

我该如何使我的应用程序访问数据库而不向全世界开放我的数据库?


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

App Engine现在支持使用端口号连接到Cloud SQL实例,而不是使用Unix域套接字。因此,现在您可以将类似以下内容添加到您的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

2个回答

8
理想的解决方案是使用Unix域套接字从您的应用引擎实例连接到Cloud SQL。这就是其他编程语言(如Python和PHP)的做法。不幸的是,MySQL连接器不支持域套接字。我看不出它不能支持的原因,但事实上它确实不支持。希望他们能尽快解决这个问题。
https://cloud.google.com/appengine/kb/#static-ip所述,

请注意,使用静态IP地址过滤不被认为是一种安全有效的保护手段。例如,攻击者可以设置一个恶意的App Engine应用程序,该应用程序可以与您的应用程序共享相同的IP地址范围。相反,我们建议您采用OAuth和证书的深度防御方法。

如果证书不足以保护您的应用程序,那么我今天所看到的唯一剩余的选择是构建一个运行自定义运行时Cloud SQL代理。该代理可以将本地IP端口号转发到Unix域套接字。如果您已经构建了docker镜像或两个镜像,那么情况并不太糟糕。
随着情况的改善,我会更新这个答案。

更新 2018-05-21

现在,App Engine支持使用端口号连接到Cloud SQL实例,而不是使用Unix域套接字。因此,您现在可以在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


谢谢您的回复。我原本以为只是配置错误或类似的问题。我会尝试应用其中一些方法,看看能否解决问题。等我有了结果,我会再次回复您。再次感谢您的帮助。 - Don Shrout
好的,经过大量阅读后,我对我们需要做的事情感到非常舒适。现在我们将依赖证书。我认为我们不必使用自定义运行时和代理。谢谢你的帮助。 - Don Shrout
遇到了这个确切的问题。最近有更新吗?@dshrout - Lafexlos
1
很遗憾,不行。被采纳的答案中描述的解决方案是处理它的方法。我们现在正在研究Azure。它使用起来要简单得多,并且成本方面非常可比。 - Don Shrout
2
Lafexlos,谷歌有工程师正在努力改善这一体验。我正在积极跟进和推动解决该问题。 - Jeffrey Rennie

3
虽然“此项目中的应用程序:全部已授权”似乎表明您可以直接使用Cloud SQL使用您的App Engine应用程序,但实际上有一些限制。首先,您的Cloud SQL需要是第二代实例,其次,具体的说明取决于您使用的语言和App Engine类型(标准或弹性)。如果您的情况符合所有要求,则应该可以正常工作。对于您的特定用例,您需要.Net说明,它确实说您需要添加一个具有0.0.0.0/0访问权限和用户帐户的网络。用户身份验证+ SSL应该提供所需的安全性。

1
嗨!我们正在使用第二代云SQL和灵活环境的.NET Core 2。根据文档,这些设置应该是经过授权的。但我们正在使用Entity Framework Core 2作为ORM。您有任何想法,这可能是问题吗? - Lafexlos
1
.Net 的指令需要具备所有 IP 访问权限的网络支持。这可能与 .Net 的工作原理有关。请仔细阅读,您将会了解我们如何处理该设置的安全性方面。 - Ying Li
不要允许来自“任何”IP的访问,至少限制为仅允许来自应用引擎IP范围列表,该列表可以通过迭代以下SPF记录_cloud-netblocks.googleusercontent.com找到。请参阅https://cloud.google.com/appengine/kb/#static-ip以获取说明。 - Aron Einhorn

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