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

Google App Engine .Net Core 2.0 app can't access Google Cloud SQL database

我在 Google App Engine 柔性环境中有一个 dotnet 核心 2.0 应用程序 运行。在同一个 Google 项目中,我有一个 Cloud SQL - MySQL 数据库。在 Cloud SQL 实例详细信息页面的“授权”选项卡下,显示

Apps in this project: All authorized.

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

如何在不向外界开放我的数据库的情况下授予我的应用程序数据库访问权限?


来自 Jeffery Rennie 的 2018-05-21 更新(接受的答案)

App Engine 现在支持使用端口号而不是 unix 域套接字连接到云 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

理想的解决方案是使用 unix domain socket to connect from your app engine instance to Cloud SQL. That's how other programming languages like Python and PHP do it. Unfortunately, the MySQL connector 不适用于域套接字。我看不出为什么不能,但事实并非如此。我希望他们尽快解决这个问题。

https://cloud.google.com/appengine/kb/#static-ip

中所述

Note that using static IP address filtering is not considered a safe and effective means of protection. For example, an attacker could set up a malicious App Engine app which could share the same IP address range as your application. Instead, we suggest that you take a defense in depth approach using OAuth and Certs.

如果证书不足以保护您的应用程序,那么我今天看到的唯一剩下的选择就是构建一两个 custom runtime that runs the Cloud SQL Proxy. The proxy can forward a local ip port number to a unix domain socket. If you have built a docker 映像,这还不错。

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


更新2018-05-21

App Engine 现在支持使用端口号而不是 unix 域套接字连接到云 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

虽然 "apps in this this project: All authorized" 似乎建议您可以 out-of-the-box 将您的 App Engine 应用程序与 Cloud SQL 一起使用,但您没有错,但存在一些限制。

首先,您的云 SQL 需要是 2nd generation instance, and secondly, there are specific instructions,这取决于您使用的语言和 App Engine 类型(标准或灵活)。

如果您的情况符合所有要求,它应该可行。

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