【问题标题】:Connecting Static IP Cloud Functions to Cloud SQL将静态 IP 云函数连接到 Cloud SQL
【发布时间】:2020-07-01 07:56:09
【问题描述】:

这两种情况都有几个很好的答案 - 但没有组合在一起。

1.我需要通过白名单静态调用外部 API 知识产权。
见:Associating Cloud Function egress with a static IP address
a) 从 Cloud Function 调用外部 API
b) 通过 vpcnetwork-1 上的 VPC 连接器路由来自此 Cloud Function 的所有出口(IP 地址范围 = 10.8.10.0/28)
c) 使用云 NAT 通过 [STATIC IP] 路由 vpcnetwork-1 上的所有流量 (由外部 API 列入白名单)

2。接下来,我需要获取该 API 数据并将其发送到 Cloud SQL 实例(本例中为 MySQL)。
见:Connecting to Cloud SQL from Cloud Functions
a) 创建一个 UNIX 套接字路径 连接到 [Cloud SQL 实例]

当我使用 VPC 连接器(如上所示)运行时,我得到:
1) 成功!我使用列入白名单的 IP 地址收到了 API 数据
2) CONNECTION REFUSED by [Cloud SQL Instance] - 因为我使用的是静态外部 IP? socketpath 是使用外部的,还是在我的 Google Cloud 项目中连接?

如果我从我的 Cloud Function 中删除 VPC 连接器,我会得到:
1) CONNECTION REFUSED - 此 IP 未列入白名单(因为我不再使用静态 IP)
2) 成功!我现在可以连接到 [Cloud SQL Instance](使用 UNIX 套接字路径、用户 ID、密码)

我怎样才能让这两者在同一个云函数中工作?

我看到我可以“仅通过 VPC 连接器将请求路由到私有 IP”,但我真的想要相反的结果。我只想将外部请求路由到 VPC 连接器,使用我的静态 IP,然后在我的 GCP 中保留我的私有路由以进行连接。

添加:我正在使用Javascript mysql 连接到 Cloud SQL。

var pool = mysql.createPool({ socketPath: '/cloudsql/[instance_connection_name]',
                              user: uid,
                              password: pwd,
                              database: 'mysql_db' });
var result = pool.query(sql, {}, (err,result)=> {});

不使用 VPC 连接器也可以。当我使用具有静态外部 IP 地址的 VPC 连接器时,此连接被拒绝。是不是因为 VPC 连接器和 Cloud SQL 实例不在同一个 VPC 上?我不认为 Cloud SQL 与 VPC 相关联,是吗?

【问题讨论】:

  • 能否贴出从云函数连接到clodsql的代码。我写了一个答案应该如何在 python CONNECTING FROM GOOGLE CLOUD FUNCTIONS TO CLOUD SQL USING TCP AND UNIX DOMAIN SOCKETS 2020 中完成
  • 您应该能够使用云 SQL 实例 (tcp) 的 vpc 连接器和内部 IP 地址从云函数连接到云 sql。我有这是我的帖子。
  • @marian.vladoi 我正在使用 Javascript mysql var pool = mysql.createPool({ socketPath: '/cloudsql/[instance_connection_name]', user: uid, password: pwd, database: 'mysql_db' }); var result = pool.query(sql, {}, (err,result)=> {}); 连接我如何检查这是否使用 TCP 连接?当我不使用 VPC 连接器时它工作正常。当我通过 VPC 连接器连接此功能时,此连接给出“CONNECTION REFUSED”。
  • 假设您在我之前的回答中执行了第 9 步,创建了一个服务帐户并为您的云功能分配了正确的权限,您必须仅使用内部 ip 创建一个云 sql 实例并连接到内部 ip实例的地址,使用host:internall_ip_cloudsql而不是socketPath,注意我之前的回答并检查我如何创建数据库,如何创建服务帐户,如何创建vpc连接器以及如何部署云功能,我能够使用 python 连接
  • 您的连接字符串应如下所示:var pool = mysql.createPool({ host : '10.36.0.3(internal ip of cloud sql instance)', user : 'root', password : 'root', database : 'guess', port: 3306 });

标签: mysql google-cloud-platform google-cloud-functions google-cloud-sql google-cloud-networking


【解决方案1】:

Cloud SQL 实例概览仪表板同时列出了 [公共 IP 地址] 和 [实例连接名称]

对于标准的 Cloud Functions 连接,我使用:

socketpath:[Instance Connection Name]
user: uid
password: pwd
database: 'mysql_db'

当使用 VPC 连接器时,我使用

host:[Private (or Public) IP Address]
user: uid
password: pwd
database: 'mysql_db'

总结:

[Cloud Function] -> socketpath:[Instance Connection Name] => **SUCCESS**
[Cloud Function] -> host:[Public IP Address] => **FAIL** (Timeout - IP Not Allowed)

Private VPC Connections:
[Cloud Function] -> [VPC Connector] -> socketpath:[Instance Connection Name] => **FAIL** (Connection Refused)
[Cloud Function] -> [VPC Connector] -> host:[Private IP Address] => **SUCCESS** (Set up Private IP in GCP->SQL->Connections)

Public VPC Connection:
[Cloud Function] -> [VPC Connector] -> host:[Public IP Address] => **SUCCESS** (Only after allowing/whitelisting IP of the VPC Connector routed through Cloud NAT)

私有 IP 设置的 Google Cloud CLI 说明:
CONNECTING FROM GOOGLE CLOUD FUNCTIONS TO CLOUD SQL USING TCP AND UNIX DOMAIN SOCKETS 2020

【讨论】:

  • 能否请您描述这一行:[Cloud Function] -> [VPC Connector] -> host:[Public IP Address] => SUCCESS (仅在允许 IP路由的VPC连接器),如何允许VPC连接器的内部ip。
  • @marian.vladoi 我编辑澄清这是一个公共连接。我为此功能使用 VPC 连接器的原因是,我可以通过 Cloud NAT 将流量路由到静态 IP 并进行公共外部 API 调用。在我使用您的示例创建私有连接之前,我正在使用该方法 - 这应该更安全。
猜你喜欢
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 2021-09-14
  • 2019-08-16
  • 2019-09-03
相关资源
最近更新 更多