在Function Compute中,不同的執行環境執行個體之間的狀態是不共用的,通過資料庫可以將結構化的資料持久化以實現狀態共用。通過Function Compute訪問雲上資料庫,您可以進行資料查詢和資料插入等操作。本文以Python 3為例,介紹如何在同VPC或跨VPC跨地區訪問ApsaraDB RDS for SQL Server。
前提條件
本文中index.py範例程式碼中的邏輯是查詢名為users的資料庫表中的所有資料,您可以根據實際情況修改表名,並確保表內至少有一條資料。
操作步驟
步驟一:設定資料庫白名單
情境一:訪問同VPC內的SQL Server資料庫
請確保您所建立的資料庫執行個體與需要訪問該資料庫執行個體的函數在同一地區。
您在Function Compute支援的可用性區域建立資料庫執行個體。更多資訊,請參見Function Compute支援的可用性區域。
如果您的資料庫執行個體不在Function Compute支援的可用性區域內,可以通過在您的VPC環境中建立一個與Function Compute相同可用性區域的vSwitch,並在Function Compute的服務的VPC配置中設定此vSwitch ID。由於同一VPC內不同vSwitch之間私網互連,因此Function Compute可以通過該vSwitch訪問在其他可用性區域VPC內資源。具體步驟,請參見遇到vSwitch is in unsupported zone的錯誤怎麼辦?。
登入RDS管理主控台,在上方選擇地區,然後單擊目標執行個體ID,單擊基本資料,單擊專用網路後的查看串連詳情,查看SQL Server的專用網路資訊。

登入Function Compute控制台,建立Python Web函數,為函數開通VPC訪問能力,並配置目標VPC資源。
說明請確保為函數配置的VPC與資料庫執行個體綁定的VPC相同。

在函數詳情頁,依次選擇,然後在網路頁面擷取函數配置中的交換器網段。

將上一步擷取的函數配置中交換器的網段添加到訪問白名單。
重要請使用設定IP地址白名單方式授權函數訪問資料庫,請勿使用安全性群組方式。否則,可能導致函數偶爾串連不上資料庫的情況,影響業務正常運行。
登入RDS管理主控台,在上方選擇地區,然後單擊目標執行個體ID。
在執行個體詳情頁的左側導覽列,選擇白名單與安全性群組,在白名單設定頁簽,找到目標白名單模板名稱,單擊右側修改。
在彈出的修改白名單分組面板中,在組內白名單輸入框輸入目標執行個體綁定的vSwitch的IP位址區段,然後單擊確定。

完成配置後,函數可以通過資料庫內網地址訪問SQL Server資料庫。
情境二:跨VPC或跨地區訪問SQL Server資料庫
不同VPC和不同地區之間屬於完全的邏輯隔離,常規情況下,不能跨VPC和跨地區訪問資料庫。如果需要跨VPC或跨地區訪問資料庫,可以通過為函數配置固定公網IP的方式,此時系統會在函數綁定的Virtual Private Cloud內建立公網NAT Gateway,通過公網網關即可實現通過公網IP訪問資料庫。
登入RDS管理主控台,在上方選擇地區,然後單擊目標執行個體ID,單擊基本資料,單擊專用網路後的查看串連詳情,查看SQL Server的專用網路資訊。

登入Function Compute控制台,建立Python Web函數,在函數詳情頁,依次選擇,在網路面板,為函數配置固定公網IP,然後單擊部署。

在彈出的固定公網IP配置對話方塊,勾選提示框,然後單擊確定。配置完成後,將參數允許函數預設網卡訪問公網設定為否,使配置的固定公網IP生效,更多詳情請參見配置固定公網IP地址。
說明將參數允許函數預設網卡訪問公網設定為否後使得固定公網IP生效。Function Compute會禁用預設網卡,從而強制使流量通過 VPC 綁定的網卡訪問外網。
在函數詳情頁,依次選擇,然後在網路頁面擷取函數配置的固定公網IP地址。

將上一步擷取的函數固定公網IP地址添加到訪問白名單。
重要請使用設定IP地址白名單方式授權函數訪問資料庫,請勿使用安全性群組方式。否則,可能導致函數偶爾串連不上資料庫的情況,影響業務正常運行。
登入RDS管理主控台,在上方選擇地區,然後單擊目標執行個體ID。
在左側導覽列,選擇白名單與安全性群組,在白名單設定頁簽,找到目標白名單模板名稱,單擊右側的修改。
在彈出的修改白名單分組面板中,在組內白名單輸入框輸入要綁定的固定公網IP地址,然後單擊確定。

完成配置後,函數可以通過資料庫公網地址訪問SQL Server資料庫。
步驟二:在函數中訪問SQL Server資料庫
登入Function Compute控制台,在函數列表找到目標函數,在函數詳情頁,單擊代碼頁簽,在代碼編輯器根據資料庫表編寫如下範例程式碼。
from flask import Flask, jsonify import os import pymssql # 需先安裝pymssql庫 from datetime import datetime app = Flask(__name__) # 全域變數用於儲存資料庫單例串連 _mssql_connection = None # 建立資料庫連接(單例模式) def getConnection(): global _mssql_connection try: # 如果串連已經存在且未斷開,直接返回 if _mssql_connection is not None: try: # 測試連接是否有效(簡單命令測試) with _mssql_connection.cursor() as cursor: cursor.execute("SELECT 1") # 簡單查詢測試連接狀態 result = cursor.fetchone() if result and result[0] == 1: return _mssql_connection except pymssql.OperationalError: # 如果串連斷開,重設串連 _mssql_connection = None # 如果串連不存在或已斷開,重新建立串連 _mssql_connection = pymssql.connect( host=os.environ['MSSQL_SERVER'], port=int(os.environ['MSSQL_PORT']), user=os.environ['MSSQL_USER'], password=os.environ['MSSQL_PASSWORD'], database=os.environ['MSSQL_DATABASE'], charset='utf8' ) return _mssql_connection except Exception as e: print(f"ERROR: Unexpected error: Could not connect to SQL Server instance: {e}") raise @app.route('/', defaults={'path': ''}) @app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE']) def hello_world(path): conn = getConnection() try: with conn.cursor() as cursor: # 查詢 users 表的所有記錄,users 表需要根據實際表名進行修改 cursor.execute("SELECT * FROM users") result = cursor.fetchall() columns = [desc[0] for desc in cursor.description] # 擷取欄位名列表 # 將查詢結果轉換為字典列表 users = [] for row in result: user = {} for idx, column_name in enumerate(columns): value = row[idx] if isinstance(value, datetime): # 處理日期類型欄位 user[column_name] = value.strftime('%Y-%m-%d %H:%M:%S') else: user[column_name] = value users.append(user) if users: # 返回所有使用者的 JSON 響應 return jsonify(users), 200 else: # 如果沒有找到使用者,返回 404 錯誤 return jsonify({'error': 'No users found'}), 404 finally: # 不需要關閉串連,因為使用了單例模式 pass if __name__ == '__main__': app.run(host='0.0.0.0', port=9000)為函數安裝所需依賴:
pip3 install -t . pymssql,點擊部署代碼使依賴生效。詳細步驟請參見通過控制台Web IDE終端安裝依賴。在函數詳情頁,依次選擇,單擊編輯,在環境變數面板配置以下環境變數。
環境變數名稱
環境變數值
說明
MSSQL_SERVER
rm-bp*****wn.sqlserver.rds.aliyuncs.com
資料庫執行個體的訪問地址,如果您選擇同VPC內的SQL Server資料庫的情境,請將此環境變數值設定為資料庫的內網地址。如果您選擇跨VPC或跨地區訪問SQL Server資料庫的情境,請將此環境變數值設定為資料庫的外網地址。
訪問執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。在左側導覽列單擊資料庫連接,在資料庫連接資訊地區擷取串連資料庫的串連地址資訊。
MSSQL_PORT
1433
資料庫內網連接埠號碼
MSSQL_USER
*****
SQL Server執行個體中建立的帳號名稱。
MSSQL_PASSWORD
*****
資料庫密碼
MSSQL_DATABASE
*****
執行個體中建立的資料庫名稱。
在函數詳情頁,選擇字碼頁簽,單擊測試函數,執行成功後查看返回結果。

更多資訊
更多訪問RDS SQL Server資料庫的樣本,請參見Function ComputePython訪問SQL Server資料庫。
關於如何查看Function Compute配置的交換器資訊以及如何在RDS MySQL資料庫允許存取Function Compute的交換器網段,請分別參見配置網路和SQL Server設定白名單。
如果資料庫訪問失敗,需根據問題現象進行排查,詳情請參見資料庫訪問失敗的常見原因。
如果您希望使用Serverless Devs命令列工具建立函數並訪問ApsaraDB RDS for SQL Server的資料庫,請參見以下步驟。