1

我正在按照此示例建立从 Cloud Function 到 Postgres Cloud SQL 的连接:https ://cloud.google.com/functions/docs/sql 。

当我使用公共 IP 创建一个测试 Cloud SQL 实例并触发云功能时,它会连接到云 SQL 实例并返回一些内容。出于安全原因,我不能打开公共 IP,所以当我在云 SQL 实例上选择私有 IP 时,我得到:

Error: function crashed. Details:
could not connect to server: Connection refused
    Is the server running locally and accepting
    connections on Unix domain socket "/cloudsql/cloud-sql-test-250613:us-central1:myinstance-2/.s.PGSQL.5432"?

我无法从文档中了解云函数和云 sql 实例之间的合同是什么。如果我们使用的是 unix 域套接字,我应该关心 IP 吗?它是公共的还是私人的重要吗?如果确实重要,我是否必须完成设置私有 IP 基础设施的所有过程?我需要无服务器 VPC 吗?

4

1 回答 1

5

通过这样做,我设法实现了 Cloud Function 和 Cloud SQL 私有实例之间的连接。

如果您禁用公共 IP 似乎很重要,每当我禁用公共 IP 时,我一直收到 ERR CONN REFUSED,这似乎是您的情况,让您的 Cloud SQL 实例仅具有私有 IP,我认为您必须使用无服务器专有网络。

这是我建议您尝试的方法:

确保您的所有基础设施都在同一个区域(Cloud SQL、Cloud Function、VPC 连接器)

请采取以下步骤:

  1. 将 Cloud SQL 实例设置为仅私有连接。(云 SQL 实例 > 连接)

  2. 确保您的私有 CloudSQL 实例位于所需的“关联网络”(VPC) 上。

  3. 在您的 Cloud SQL 实例所在的 VPC 网络上创建一个 VPC 连接器。(与MySql实例关联的那个)

要创建连接器,请转到:VPC 网络 > VPC 无服务器访问 > 创建连接器

在 VPC Network > [Your VPC] > VPC Network Peering 中,您可以检查与 Cloud SQL 实例的连接是否正确。

  1. 使用所需语言的代码创建云函数。(您可以使用文档中的示例进行测试。)

创建 Cloud Function 时,请确保将其设置在同一区域,同时将您创建的 VPC 连接器添加到 Cloud Function 中的“Egress Settings”选项。

如果您尝试通过 GCP Console 创建 VPC 连接器,您将只能选择 1 个区域。但是如果您使用云壳,您可以定义其他区域。您可以使用此命令在这些区域进行尝试。

gcloud beta compute networks vpc-access connectors create [CONNECTOR_NAME] \ 
--network [VPC_NETWORK] \ 
--region [REGION] \ 
--range [IP_RANGE]

领域:

美国-中央1、美国-东部1、欧洲-西部1

请让我知道这是否对您有用。

更新:

你好再次alobodzk,

尝试在 Python 中创建您的云函数(确保前面的所有步骤都正常)。

试试这个代码:

Cloud Function index.js(用您自己的凭据替换所有连接器数据)

import mysql.connector
from mysql.connector import Error


def mysql_demo(request):
    import mysql.connector
    from mysql.connector import Error
    try:
        connection = mysql.connector.connect(host='CloudSQL Instance Private IP', database='Database Name, user='UserName', password='Password')
        if connection.is_connected():
            db_Info = connection.get_server_info()
            print("Connected to MySQL database... MySQL Server version on ",db_Info)
            cursor = connection.cursor()
            cursor.execute("select database();")
            record = cursor.fetchone()
            print ("Your connected to - ", record)
    except Error as e :
        print ("Error while connecting to MySQL", e)
    finally:
        #closing database connection.
        if(connection.is_connected()):
            cursor.close()
            connection.close()
            print("MySQL connection is closed")
# [END functions_sql_mysql]

云功能要求.txt

psycopg2==2.7.7
PyMySQL==0.9.3
mysql-connector-python
于 2019-08-23T11:11:54.720 回答