簡體   English   中英

GCP Cloud Functions 使用私有 IP 連接到雲 sql

[英]GCP Cloud Functions connecting to cloud sql with private IP

我正在按照此示例建立從 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 嗎?

通過這樣做,我設法實現了 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 網絡 > [您的 VPC] > VPC 網絡對等互連中,您可以檢查與 Cloud SQL 實例的連接是否正確。

  1. 使用所需語言的代碼創建雲函數。 (您可以使用文檔中的示例進行測試。)

創建 Cloud Function 時,請確保將其設置在同一區域中,同時將您創建的 VPC 連接器添加到 Cloud Function 中的“出口設置”選項。

如果您嘗試通過 GCP Console 創建 VPC 連接器,您將只能選擇 1 個區域。 但是,如果您使用雲外殼,則可以定義其他區域。 您可以使用此命令並在這些區域中進行嘗試。

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

領域:

us-central1, us-east1, europe-west1

如果這對你有用,請告訴我。

更新:

再次你好 alobodzk,

嘗試在 Python 中創建您的 Cloud Function(一旦確保前面的所有步驟都正常)。

試試這個代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM