在Function Compute中,不同的執行環境執行個體之間的狀態是不共用的,通過資料庫可以將結構化的資料持久化以實現狀態共用。通過Function Compute訪問雲上資料庫,您可以進行資料查詢和資料插入等操作。本文以Python函數為例,介紹如何同VPC或跨VPC跨地區訪問ApsaraDB for MongoDB。
前提條件
建立ApsaraDB for MongoDB執行個體,本文以分區叢集執行個體為例。關於ApsaraDB for MongoDB執行個體的類型,請參見單節點執行個體、複本集執行個體和分區叢集執行個體。
本文中index.py範例程式碼中的邏輯是在資料庫名為test-db和資料庫集合名為fc_col中插入一條文檔資料。您可以根據實際情況修改資料庫名和集合名稱,具體操作,請參見建立資料庫和集合并寫入資料。
操作步驟
步驟一:設定資料庫白名單
情境一:訪問同VPC內的MongoDB資料庫
如果您選擇訪問同VPC內資料庫的情境,請確保資料庫執行個體與函數處於同一地區。建議您在Function Compute支援的可用性區域建立資料庫執行個體。更多資訊,請參見Function Compute支援的可用性區域。如果您的資料庫執行個體不在Function Compute支援的可用性區域內,可以通過在您的VPC環境中建立一個與Function Compute相同可用性區域的vSwitch,並在函數的VPC配置中設定此vSwitch ID。由於同一VPC內不同vSwitch之間私網互連,因此Function Compute可以通過該vSwitch訪問在其他可用性區域的VPC內的資源。具體步驟,請參見遇到vSwitch is in unsupported zone的錯誤怎麼辦?。
登入Function Compute控制台,建立Python Web函數,為函數開通VPC訪問能力,並配置目標VPC資源。
說明請確保為函數配置的VPC與資料庫執行個體綁定的VPC相同。

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

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

完成配置後,函數可以通過資料庫內網地址訪問MongoDB資料庫。
情境二:跨VPC或跨地區訪問MongoDB資料庫
不同VPC和不同地區之間屬於完全的邏輯隔離,常規情況下不能跨VPC和跨地區訪問資料庫。如果需要跨VPC或跨地區訪問資料庫,可以通過為函數配置固定公網IP的方式,此時系統會在函數綁定的Virtual Private Cloud內建立公網NAT Gateway,通過公網網關即可實現通過公網IP訪問資料庫。
登入Function Compute控制台,在左側導覽列,選擇函數,選擇地區,然後根據介面提示建立函數。
在函數詳情頁,依次選擇,在網路面板,為函數配置固定公網IP,然後單擊部署。

在彈出的固定公網IP配置對話方塊,勾選提示框,然後單擊確定。配置完成後,將參數允許函數預設網卡訪問公網設定為否,使配置的固定公網IP生效。
在函數詳情頁,依次選擇,然後在網路頁面擷取函數配置的固定公網IP地址。

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

完成配置後,函數可以通過資料庫公網地址訪問MongoDB資料庫。
步驟二:在函數中訪問MongoDB
登入Function Compute控制台,在函數列表找到目標函數,在函數詳情頁,單擊代碼頁簽,在代碼編輯器編寫如下範例程式碼。
from flask import Flask import os from pymongo import MongoClient app = Flask(__name__) # 全域變數用於儲存 MongoDB 單例串連 _mongo_client = None # 建立資料庫連接(單例模式) def getConnection(): global _mongo_client try: # 如果串連已經存在且未斷開,直接返回 if _mongo_client is not None: try: # 測試連接是否有效(簡單命令測試) _mongo_client.admin.command('ping') # 使用 admin 資料庫的 ping 命令測試連接狀態 return _mongo_client except Exception: # 如果串連斷開,重設串連 _mongo_client = None # 如果串連不存在或已斷開,重新建立串連 url = os.environ['MONGO_URL'] _mongo_client = MongoClient(url) return _mongo_client except Exception as e: print(f"ERROR: Failed to connect to MongoDB instance: {e}") raise @app.route('/', defaults={'path': ''}) @app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE']) def hello_world(path): dbName = os.environ['MONGO_DATABASE'] # 擷取 MongoDB 串連 client = getConnection() # 操作集合,集合fc_col請根據實際情況進行修改 col = client[dbName]['fc_col'] col.insert_one(dict(DEMO="FC", MSG="Hello FunctionCompute For MongoDB")) doc = col.find_one(dict(DEMO="FC")) print('find documents:' + str(doc)) return str(doc) if __name__ == '__main__': app.run(host='0.0.0.0', port=9000)在代碼頁簽,WebIDE介面,選擇,開啟終端視窗,執行以下命令安裝pymongo庫。
pip install -t . pymongo在函數詳情頁,依次選擇,單擊編輯,在環境變數面板配置以下環境變數。
環境變數名稱
環境變數值
說明
MONGO_DATABASE
test-db
MongoDB資料庫執行個體中建立的資料庫名稱。
說明如果使用root帳號,MongoDB 7.0.4及以後的版本沒有admin預設資料庫的寫入權限,建議您使用手動建立的資料庫。
MONGO_URL
mongodb://root:password@s-bp132a4e334e****.mongodb.rds.aliyuncs.com:3717,s-bp1b486e9aa4****.mongodb.rds.aliyuncs.com:3717
MongoDB資料庫執行個體的訪問地址。
如果您選擇同VPC內的MongoDB資料庫的情境,請將此環境變數值設定為資料庫的內網地址。
如果您選擇跨VPC或跨地區訪問MongoDB資料庫的情境,請將此環境變數值設定為資料庫的外網地址。
登入MongoDB管理主控台,單擊目標執行個體,然後在執行個體詳情頁的左側導覽列,選擇資料庫連接,在資料庫連接頁面擷取資料庫的內網地址或外網地址。
在函數詳情頁,選擇字碼頁簽,單擊測試函數,執行成功後查看返回結果,如下圖所示,已成功向MongoDB資料庫插入一條資料。

更多資訊
更多訪問MongoDB資料庫的範例程式碼,請參見Function ComputePython訪問MongoDB資料庫。
如果您的資料庫訪問失敗,需根據問題現象進行排查,詳情請參見資料庫訪問失敗的常見原因。
如果您希望使用Serverless Devs命令列工具建立函數並訪問RDS MySQL資料庫,請參見以下步驟。