EF Core 从 Google 云 运行 Google 云 SQL 连接

EF Core connect from Google Cloud Run to Google Cloud SQL

我试过这些:

Data Source=/cloudsql/*****:asia-southeast2:*****;Initial Catalog=*****;Integrated Security=False;User ID=sqlserver;Password=MyPassword0!;MultipleActiveResultSets=True

/cloudsql/*****:asia-southeast2:***** 是我在 here 中描述的实例连接名称。

我试过 public IP 也是这样的:

Data Source=***.***.***.***;Initial Catalog=*****;Integrated Security=False;User ID=sqlserver;Password=MyPassword0!;MultipleActiveResultSets=True

使用 IP 地址我的 SQL 实例 public IP,但它不工作。

我已经从云端启用 sql 实例连接 运行:

如何使用 EF Core 修复连接字符串?

这是我得到的错误:

Microsoft.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 25 - Connection string is not valid)

您正在尝试将云 SQL SQL 服务器与云 运行 一起使用。但是,如果您查看the documentation,则不支持此连接。

实际上支持连接,但是云 运行 服务打开一个 Unix 套接字来连接 SQL 服务器实例。并且没有 SQL 符合 Unix Socket 的服务器客户端,因此您无法访问它。

要解决您的问题,我建议您使用本页的 Private IP 部分。您也可以使用 public IP 实现相同的配置(不要使用无服务器 VPC 连接器并转到您的 Cloud SQL 实例,并授权网络 0.0.0.0/0 访问您的实例), 但是,因为你需要广泛开放授权网络,出于安全考虑,我不推荐你这个选项。


编辑 1

因为我的英语不好,让我解释一下!!

最好的方法是按照文档页面进行操作:将云 SQL 私有 IP 连接到您的 VPC,将无服务器 VPC 连接器与云 运行 一起使用,并且在您的代码中您可以使用私有 IP用于访问数据库的连接字符串中的 IP。

但是,您也可以使用我不推荐的 public IP(原因见下文),至少在第一次使用时是这样。事实上,您可以在代码中使用公共 IP 而不是私有 IP。因为您使用公共 IP,所以您不再需要 Cloud 运行 服务上的无服务器 VPC 连接器(您不使用 VPC,而是使用 Internet 访问 Internet)。

但是,由于您使用互联网并且云 运行 是一项多客户共享服务,您不知道您的源 IP。在云端SQL,您需要允许授权网络部分中的任何IP(0.0.0.0/0)访问您的数据库,这不是一个非常安全的配置。


或者,您可以在 Cloud 运行 上创建更复杂的配置,安全地使用 Cloud SQL public IP(但它变得非常复杂)。让我深入研究一下。

我之前说过云运行是一个共享服务,你在发起呼出(比如连接数据库)时不管理源IP。没错,但是 you can control that!

  • 首先,您(再次)需要云上的无服务器 VPC 连接器 运行。并且您需要将出口设置为所有(路由 public 和到无服务器 VPC 连接器的专用流量)。
  • 然后,在您的 VPC 中创建一个 Cloud NAT,并且 select,至少,您的无服务器 VPC 连接器子网在访问互联网时要被 NAT
  • 在您的 Cloud NAT 配置上保留 public IP

现在您有一个 public,在您的云 运行 服务上定义的静态 IP。您只能在您的 Cloud SQL 授权网络上授予它,以提高安全性并且不要让任何人访问您的 Cloud SQL 实例。