连接静态IP云函数与云SQL。
连接静态IP云函数与云SQL。
有几个好的解决方案适用于这两种情况,但不能同时使用。
1. 我需要通过白名单静态IP调用外部API。
a) 从Cloud Function调用外部API
b) 将该Cloud Function的所有出口流量通过vpcnetwork-1上的VPC连接器路由(IP地址范围=10.8.10.0/28)
c) 使用Cloud NAT将vpcnetwork-1上的所有流量路由至[STATIC IP](外部API白名单)
2. 接下来,我需要将API数据发送到Cloud SQL实例(这里是MySQL)。
参见:从Cloud Functions连接到Cloud SQL
a) 创建一个UNIX socketpath连接至[Cloud SQL实例]
当我使用VPC连接器(如上所示)时,出现以下情况:
1) 成功!我通过白名单IP地址接收到了API数据
2) [Cloud SQL实例]拒绝连接 - 因为我使用的是静态外部IP地址?socketpath使用外部IP还是在我的Google Cloud项目内部连接?
如果我从Cloud Function中移除VPC连接器,则出现以下情况:
1) 连接被拒绝 - 此IP未加入白名单(因为我不再使用静态IP)
2) 成功!我现在能够连接到[Cloud SQL实例](使用UNIX socketpath、用户名和密码)
如何使这两个在同一个Cloud Function中同时工作?
我看到我可以“仅通过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关联,是吗?
问题的原因是Cloud Functions无法直接连接Cloud SQL的静态IP地址。解决方法是使用VPC Connector来连接Cloud Functions和Cloud SQL,并设置私有IP地址,并允许通过Cloud NAT路由的VPC Connector的IP地址。
解决方法的具体步骤如下:
1. 在Cloud SQL实例概览仪表板上找到[Public IP Address]和[Instance Connection Name]。
2. 如果使用标准的Cloud Functions连接,使用以下配置:
socketpath:[Instance Connection Name]
user: uid
password: pwd
database: 'mysql_db'
3. 如果使用VPC Connector,使用以下配置:
host:[Private (or Public) IP Address]
user: uid
password: pwd
database: 'mysql_db'
4. 如果使用私有VPC连接,在Cloud Functions中设置以下配置:
[Cloud Function] -> [VPC Connector] -> host:[Private IP Address] => SUCCESS (在GCP->SQL->Connections中设置私有IP地址)
5. 如果使用公共VPC连接,在Cloud Functions中设置以下配置:
[Cloud Function] -> [VPC Connector] -> host:[Public IP Address] => SUCCESS (仅在允许/白名单VPC Connector通过Cloud NAT的IP地址之后)
6. 通过Google Cloud CLI按照私有IP设置的说明进行设置。
以上是解决将静态IP的Cloud Functions连接到Cloud SQL的问题的方法。通过使用VPC Connector和设置正确的IP地址,可以实现成功的连接。