[英]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 連接器)
請采取以下步驟:
將 Cloud SQL 實例設置為僅限專用連接。 (雲 SQL 實例 > 連接)
確保您的私有 CloudSQL 實例位於所需的“關聯網絡”(VPC) 上。
在您的 Cloud SQL 實例所在的 VPC 網絡上創建一個 VPC 連接器。 (與 MySql 實例關聯的那個)
要創建連接器,請轉到:VPC 網絡 > VPC 無服務器訪問 > 創建連接器
在 VPC 網絡 > [您的 VPC] > VPC 網絡對等互連中,您可以檢查與 Cloud SQL 實例的連接是否正確。
創建 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.