GCP Cloud Functions通过私有IP连接到Cloud SQL

时间:2019-08-23 09:26:49

标签: google-cloud-platform google-cloud-functions google-cloud-sql google-vpc

我正在遵循此示例,以建立从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吗?

1 个答案:

答案 0 :(得分:3)

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

如果您禁用公共IP似乎很重要,每当我禁用公共IP时,我都会不断收到ERR CONN REFUSED,这似乎是您的情况,只有您的Cloud SQL实例具有私有IP,我认为您确实有使用无服务器VPC。

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

确保所有基础架构都位于同一区域(Cloud SQL,Cloud Function,VPC Connector)

请执行以下步骤:

  1. 将Cloud SQL实例设置为仅专用连接。 (Cloud SQL实例>连接)

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

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

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

    在VPC网络> [您的VPC]> VPC网络对等中,您可以检查连接是否为 更正您的Cloud SQL实例。

  4. 使用所需语言的代码创建Cloud Function。 (您可以使用文档中的示例进行测试。)

创建云功能时,请确保将其设置在同一区域,同时还将创建的VPC连接器添加到云功能的“出口设置”选项中。

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

gcloud beta计算网络vpc-access连接器创建[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]

Cloud Function requirements.txt

psycopg2==2.7.7
PyMySQL==0.9.3
mysql-connector-python