【问题标题】:EF Core connect from Google Cloud Run to Google Cloud SQLEF Core 从 Google Cloud Run 连接到 Google Cloud SQL
【发布时间】:2021-08-03 16:01:12
【问题描述】:

我试过这些:

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

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

我也尝试过这样的公共 IP:

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

使用 IP 地址我的 SQL 实例公共 IP,但它不起作用。

我已启用 Cloud Run 的 sql 实例连接:

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

这是我得到的错误:

Microsoft.Data.SqlClient.SqlException (0x80131904):网络相关 或在建立连接时发生特定于实例的错误 SQL 服务器。服务器未找到或无法访问。核实 实例名称正确且 SQL Server 配置为 允许远程连接。 (提供者:SQL 网络接口,错误:25 - 连接字符串无效)

【问题讨论】:

    标签: asp.net-core google-cloud-platform entity-framework-core google-cloud-run


    【解决方案1】:

    您正在尝试将 Cloud SQL SQL 服务器与 Cloud Run 结合使用。但是如果你看一下the documentation,这个连接是不支持的。

    实际上是支持连接的,但是 Cloud Run 服务会打开一个 Unix 套接字来连接 SQL Server 实例。并且没有与 Unix Socket 兼容的 SQL Server 客户端,因此您无法访问它。

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


    编辑 1

    由于我的英语不好,让我解释一下!!

    最好的方法是遵循文档页面:将 Cloud SQL 私有 IP 连接到您的 VPC,将无服务器 VPC 连接器与 Cloud Run 结合使用,并且在您的代码中,您可以使用连接字符串中的私有 IP 来访问数据库。

    但是,您也可以使用我不推荐的公共 IP(请参阅下面的原因),至少在第一次幼稚使用时是这样。事实上,您可以在代码中使用公共 IP 而不是私有 IP。由于您使用公共 IP,因此您不再需要 Cloud Run 服务上的无服务器 VPC 连接器(您不使用 VPC,而是使用互联网来访问互联网)。

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


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

    我之前说过,Cloud Run 是一个共享服务,你在发起呼出时不管理源 IP(比如连接到数据库)。是真的,不过you can control that!

    • 首先,您需要(再次)在 Cloud Run 上使用无服务器 VPC 连接器。您需要将出口设置为 ALL(将公共和私有流量路由到无服务器 VPC 连接器)。
    • 然后,在您的 VPC 中创建一个 Cloud NAT,并至少选择您的无服务器 VPC 连接器子网,以便在访问互联网时进行 NAT
    • 在您的 Cloud NAT 配置中保留公共 IP

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

    【讨论】:

    • 我改进了我的答案,使用公共 IP 更安全
    • 明白了,你的解释很透彻。现在我还处于开发阶段。我稍后会在它投入生产时保护它。谢谢大佬!