您可以參考本文提供的Function Compute訪問ApsaraDB for MongoDB的操作指導,在函數中配置Virtual Private Cloud相關資訊並在資料庫中配置白名單,實現VPC內資料庫的訪問和操作。本文以Python 3為例,介紹如何使用Serverless Devs部署函數來訪問ApsaraDB for MongoDB。
前提條件
建立適合業務需求的ApsaraDB for MongoDB執行個體:
本文以分區叢集執行個體為例。
重要請確保您所建立的資料庫執行個體與需要訪問該資料庫執行個體的函數在同一地區。
建議您在Function Compute支援的可用性區域建立資料庫執行個體。更多資訊,請參見Function Compute支援的可用性區域。
如果您的資料庫執行個體不在Function Compute支援的可用性區域內,可以通過在您的VPC環境中建立一個與Function Compute相同可用性區域的vSwitch,並在函數的VPC配置中設定此vSwitch ID。由於同一VPC內不同vSwitch之間私網互連,因此Function Compute可以通過該vSwitch訪問在其他可用性區域的VPC內的資源。具體步驟,請參見遇到vSwitch is in unsupported zone的錯誤怎麼辦?。
建立名為test-db的資料庫和名為fc_col的資料庫集合。具體操作,請參見建立資料庫和集合并寫入資料。
本文index.py範例程式碼中的代碼邏輯為向名為test-db的資料庫的fc-col集合中插入一條文檔資料。
操作步驟
安裝Serverless Devs和Docker,並添加密鑰資訊。
執行以下命令初始化專案。
sudo s init
根據介面提示,依次選擇阿里雲廠商、快速建立模式和Python內建運行時,設定工程名稱以及選擇專案部署地區等,本文樣本為在杭州地區下部署start-fc-mongodb-python專案。
執行以下命令進入專案。
cd start-fc-mongodb-python
根據實際情況修改目錄檔案。
編輯s.yaml設定檔,樣本如下。
edition: 3.0.0 name: hello-world-app access: "default" vars: # 全域變數 region: "cn-hangzhou" resources: hello_world: component: fc3 # 組件名稱 # actions: # 自訂執行邏輯,關於actions 的使用,可以參考:https://docs.serverless-devs.com/serverless-devs/yaml#%E8%A1%8C%E4%B8%BA%E6%8F%8F%E8%BF%B0actions props: region: ${vars.region} # 關於變數的使用方法,可以參考:https://docs.serverless-devs.com/serverless-devs/yaml#%E5%8F%98%E9%87%8F%E8%B5%8B%E5%80%BC functionName: "start-python-xbk4" description: 'hello world by serverless devs' runtime: "python3.9" code: ./code handler: index.handler memorySize: 128 timeout: 30 internetAccess: true vpcConfig: vpcId: vpc-bp11y195luy47h8cm**** # 資料庫執行個體所在的VPC ID securityGroupId: sg-bp1el3hto8hhkdup**** # 安全性群組ID vSwitchIds: - vsw-bp18vwna9x79koh3q**** # 請確保該vSwitch對應的網段已配置到資料庫執行個體訪問白名單中 environmentVariables: MONGO_DATABASE: test-db # 資料庫名稱 MONGO_URL: mongodb://username:password@d-bp1b05cac9df0dd****.mongodb.rds.aliyuncs.com:37** # 資料庫存取點,其中username和password為資料庫的使用者名稱和密碼,如果使用者名稱和密碼中包含特殊字數,需按照RFC 3986標準進行轉義
重要請確保您為函數配置的交換器網段已添加到資料庫執行個體訪問白名單中。具體操作,請參見設定資料庫訪問IP地址白名單。
編輯index.py代碼檔案,樣本如下,代碼邏輯為向名稱為test-db的資料庫的fc-col集合中插入一條文檔資料。
# -*- coding: utf-8 -*- import os from pymongo import MongoClient # 需先安裝pymongo庫 def handler(event, context): dbName = os.environ['MONGO_DATABASE'] url = os.environ['MONGO_URL'] client = MongoClient(url) 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)
執行以下命令構建專案。
sudo s build --use-docker
執行以下命令部署專案。
sudo s deploy -y
執行以下命令調用函數。
sudo s invoke -e "{}"
預期輸出如下,以下返回結果表示已成功向MongoDB資料庫插入一條資料。
========= FC invoke Logs begin ========= FC Invoke Start RequestId: 1-65d30578-1586adb3-4d0f099c1ada find documents:{'_id': ObjectId('65d2faef467c916ed6401a73'), 'DEMO': 'FC', 'MSG': 'Hello FunctionCompute For MongoDB'} FC Invoke End RequestId: 1-65d30578-1586adb3-4d0f099c1ada Duration: 161.75 ms, Billed Duration: 162 ms, Memory Size: 256 MB, Max Memory Used: 34.44 MB ========= FC invoke Logs end ========= FC Invoke instanceId: c-65d304d7-15f440b6-20443f00e921 FC Invoke Result: {'_id': ObjectId('65d2faef467c916ed6401a73'), 'DEMO': 'FC', 'MSG': 'Hello FunctionCompute For MongoDB'} End of method: invoke
設定資料庫訪問IP地址白名單
請使用設定IP地址白名單方式授權函數訪問資料庫,請勿使用安全性群組方式。否則,可能導致函數偶爾串連不上資料庫的情況,影響業務正常運行。
本文以分區叢集執行個體為例。
在頂部功能表列,選擇地區。
在左側導覽列,單擊分區叢集執行個體列表。
在分區叢集執行個體列表頁面,找到目標執行個體,並單擊其名稱。
在左側導覽列,選擇 。
在白名單設定頁面,找到白名單分組名,在其操作列,單擊表徵圖,在下拉式功能表中,選擇手動修改。
在手動修改面板,按需填寫IP地址,單擊確定。
重要此處填寫的IP地址,為在Function Compute服務的網路設定中添加的vSwitch的IP位址區段。您可以在服務的網路設定中,單擊配置的專用網路名稱跳轉到專用網路控制台擷取。
更多資訊
更多訪問MongoDB資料庫的範例程式碼,請參見Function ComputePython訪問MongoDB資料庫。
關於如何查看Function Compute配置的交換器資訊以及如何在MongoDB資料庫允許存取Function Compute的交換器網段,請分別參見配置網路和設定白名單。
如果您的資料庫訪問失敗,需根據問題現象進行排查,詳情請參見資料庫訪問失敗的常見原因。