【问题标题】:Connectivity between Cloud Run and Cloud SQL (Internal IP)Cloud Run 和 Cloud SQL 之间的连接(内部 IP)
【发布时间】:2021-04-26 13:50:11
【问题描述】:

我使用 Google 提供的 Terraform modules 在 GCP 中按照 Cloud Foundation Toolkit 创建了我的组织基础架构。

下表列出了所有环境的 IP 范围:

现在我正在部署我的应用程序,该应用程序基本上由 Cloud Run 服务和 Cloud SQL (Postgres) 实例组成。 Cloud SQL 实例是使用为对等服务(例如 Cloud SQL)保留的“未分配”IP 范围中的私有 IP 创建的。

为了在 Cloud Run 和 Cloud SQL 之间建立连接,我还创建了 Serverless VPC 连接器(ip 范围 10.1.0.16/28)并配置了 Cloud SQL 代理。

当我尝试从 Cloud Run 服务连接到数据库时,大约 10 秒后出现此错误:

CloudSQL 连接失败。有关更多详细信息,请参阅https://cloud.google.com/sql/docs/mysql/connect-run:发布“https://www.googleapis.com/sql/v1beta4/projects/[my-project]/instances/platform-db/createEphemeral?alt=json&prettyPrint=false”:上下文截止日期超过

我已为默认 Cloud Run SA 和宿主项目中的应用程序使用的 SA 授予 roles/vpcaccess.user

我已为服务项目中的两个 SA 授予 roles/compute.networkUser。我还为这两个 SA 授予了 roles/cloudsql.client

我在服务项目中启用了servicenetworking.googleapis.comvpcaccess.googleapis.com

我的想法已经用完了,我无法弄清楚问题是什么。

当 Cloud Run 尝试创建对 Cloud SQL API 的 POST 请求时,这似乎是一个超时错误。因此,VPC 连接器 (10.1.0.16/28) 似乎无法连接到 Cloud SQL 实例 (10.0.80.0/20)。

以前有人遇到过这个问题吗?

【问题讨论】:

    标签: google-cloud-sql google-cloud-run cloud-sql-proxy google-vpc


    【解决方案1】:

    当您在 Cloud Run(以及 App Engine 和 Cloud Function)中使用 Cloud SQL 内置连接时,会创建一个类似于 Cloud SQL 代理的连接。这种连接可以在 Cloud SQL 公共 IP 上实现,即使您有无服务器 VPC 连接器并且您的数据库可通过 VPC 访问。

    如果您在 Cloud SQL 上只有私有 IP,则需要使用私有 IP 访问数据库,而不是内置的 Cloud SQL 连接器。更多详情the documentation

    我也写了an article on this

    【讨论】:

    • 我也尝试使用私有 IP,但是请求超时并出现错误:HTTP 503 - 请求失败,因为 HTTP 响应格式错误或与实例的连接出错。查看防火墙,没有入口规则。此外,这些路由看起来很正常:从 VPC 连接器范围到共享 VPC 以及从 Cloud SQL 范围到对等 VPC 有一个。我相信我的权限也设置得很好。有什么我想念的吗?
    • 我发现了问题。缺少防火墙规则。 Cloud Foundation Toolkit 为所有人创建拒绝出口规则。 VPC 连接器不在子网范围内,因此默认情况下无法访问。我创建了防火墙规则以允许出口到共享 VPC 中的私有服务 IP 范围以及 Google API (199.36.153.8/30)。但是,我不确定如何定位 VPC 连接器。目前,新创建的规则将“全部”作为目标。是否可以将网络标签添加到连接器?
    • 定义连接器时,您定义了一个范围。如果需要,您可以在防火墙规则中使用此范围。但是不,您不能向连接器添加网络标签。
    【解决方案2】:

    如果您使用的是私有 IP,则需要检查 docker bridge 网络的 IP 范围。这是documentation 所说的:

    如果客户端无法使用私有 IP 连接到 Cloud SQL 实例,请检查客户端是否使用 172.17.0.0/16 范围内的任何 IP。从 172.17.0.0/16 范围内的任何 IP 到使用私有 IP 的 Cloud SQL 实例的连接失败。同样,使用该范围内的 IP 创建的 Cloud SQL 实例也无法访问。这个范围是为 docker bridge 网络保留的。

    要解决您遇到的一些问题,请按照文档here 并发布您收到的任何错误消息,例如,您可以尝试:

    尝试使用gcloud sql connect 命令连接到您的实例。此命令会在短时间内授权您的 IP 地址。您可以在安装了 Cloud SDK 和 mysql 客户端的环境中运行此命令。您也可以在 Cloud Shell 中运行此命令,该命令可在 Google Cloud Console 中使用,并且预装了 Cloud SDK 和 mysql 客户端。

    暂时允许所有 IP 地址连接到实例。对于 IPv4 授权 0.0.0.0/0(对于 IPv6,授权 ::/0。测试完后,请确保再次删除它,因为它向世界开放!

    你在用connection pools吗?

    如果没有,我会创建一个连接缓存,以便当您的应用程序需要链接到数据库时,它可以从池中获取临时连接。应用程序完成操作后,连接将再次返回池以供以后使用。为使其正常工作,连接需要为 open and closed efficiently 并且不浪费任何资源。

    【讨论】:

      猜你喜欢
      • 2020-05-06
      • 2021-04-11
      • 1970-01-01
      • 2019-10-28
      • 2020-06-15
      • 2020-07-01
      • 2020-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多