您可以參考本文提供的Function Compute訪問ApsaraDB RDS for MySQL的操作指導,在函數中配置Virtual Private Cloud相關資訊並在資料庫中配置白名單,實現VPC內資料庫的訪問和操作。本文以Python 3為例,介紹如何使用Serverless Devs部署函數來訪問ApsaraDB RDS for MySQL。
前提條件
- 重要
請確保您所建立的資料庫執行個體與需要訪問該資料庫執行個體的函數在同一地區。
建議您在Function Compute支援的可用性區域建立資料庫執行個體。更多資訊,請參見Function Compute支援的可用性區域。
如果您的資料庫執行個體不在Function Compute支援的可用性區域內,可以通過在您的VPC環境中建立一個與Function Compute相同可用性區域的vSwitch,並在函數的VPC配置中設定此vSwitch ID。由於同一VPC內不同vSwitch之間私網互連,因此Function Compute可以通過該vSwitch訪問在其他可用性區域的VPC內的資源。具體步驟,請參見遇到vSwitch is in unsupported zone的錯誤怎麼辦?。
在建立的資料庫中,建立名為users的表。
本文中index.py範例程式碼中的代碼邏輯為查詢名為users的資料庫表中的所有資料,因此,需要提前建立該表。
操作步驟
安裝Serverless Devs和Docker,並添加密鑰資訊。
執行以下命令初始化專案。
sudo s init
根據介面提示,依次選擇阿里雲帳號、快速建立模式和Python內建運行時,設定工程名稱以及選擇專案部署地區等,本文樣本為在杭州地區下部署start-fc-mysql-python專案。
執行以下命令進入專案。
cd start-fc3-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-0t1m" description: 'hello world by serverless devs' runtime: "python3.9" code: ./code handler: index.handler memorySize: 128 timeout: 30 internetAccess: true vpcConfig: vpcId: vpc-bp11y195luy47h8c**** # 資料庫執行個體所在的VPC ID securityGroupId: sg-bp1el3hto8hhkdu**** # 安全性群組ID vSwitchIds: - vsw-bp116uemmj7fniub**** # 請確保該vSwitch對應的網段已配置到資料庫執行個體訪問白名單中 environmentVariables: PYTHONPATH: /code/python MYSQL_HOST: rm-bp19j9og672d4****.mysql.rds.aliyuncs.com # 資料庫執行個體的私網地址 MYSQL_PORT: "3306" # 資料庫執行個體的私網連接埠 MYSQL_USER: z***** # 資料庫執行個體中建立的資料庫 MYSQL_PASSWORD: 1**** # 資料庫執行個體的密碼 MYSQL_DBNAME: db**** # 資料庫執行個體中建立的資料庫名稱
重要請確保您為函數配置的交換器網段已添加到資料庫執行個體訪問白名單中。具體操作,請參見設定資料庫訪問IP地址白名單。
編輯index.py代碼檔案,樣本如下,代碼邏輯為查詢資料庫的名稱為users的表中的所有資料。
# -*- coding: utf-8 -*- import pymysql # 需先安裝pymysql庫 import os import logging def handler(event, context): # 擷取RDS的串連資訊,通常這些資訊可以通過環境變數或者Key Management Service(如KMS)擷取 db_host = os.environ['MYSQL_HOST'] db_port = int(os.environ['MYSQL_PORT']) db_user = os.environ['MYSQL_USER'] db_password = os.environ['MYSQL_PASSWORD'] db_name = os.environ['MYSQL_DBNAME'] # 建立資料庫連接 connection = pymysql.connect(host=db_host, port=db_port, user=db_user, password=db_password, db=db_name) try: with connection.cursor() as cursor: # 查詢user表的所有記錄 sql = "SELECT * FROM user" cursor.execute(sql) result = cursor.fetchall() for row in result: print(f"User: {row}") except Exception as e: logging.error(f"Error occurred during database operation: {e}") finally: # 關閉資料庫連接 connection.close() return 'Finished querying the user table'
執行以下命令構建專案。
sudo s build --use-docker
執行以下命令部署專案。
sudo s deploy -y
執行以下命令調用函數。
sudo s invoke -e "{}"
預期輸出如下,返回結果表示已成功訪問user表。
========= FC invoke Logs begin ========= FC Invoke Start RequestId: 1-65d2b4b4-1502c418-30faff838bec FC Invoke End RequestId: 1-65d2b4b4-1502c418-30faff838bec Duration: 35.37 ms, Billed Duration: 36 ms, Memory Size: 128 MB, Max Memory Used: 14.16 MB ========= FC invoke Logs end ========= Invoke instanceId: c-65d2b45f-15f440b6-a01ef0d32d36 Code Checksum: 8737553540873826675 Qualifier: LATEST RequestId: 1-65d2b4b4-1502c418-30faff838bec Invoke Result: Finished querying the user table > [hello_world] completed (0.25s)
設定資料庫訪問IP地址白名單
請使用設定IP地址白名單方式授權函數訪問資料庫,請勿使用安全性群組方式。否則,可能導致函數偶爾串連不上資料庫的情況,影響業務正常運行。
- 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
在左側導覽列單擊白名單與安全性群組。
在白名單設定頁面,可查看當前的IP白名單模式。
說明較早建立的執行個體可能採用高安全模式。新建立的執行個體都採用通用白名單模式。
在預設顯示的白名單設定頁簽,找到default白名單分組,在其右側,單擊修改。
在修改白名單分組對話方塊,修改組內白名單,單擊確定。
重要此處填寫的IP地址為您在Function Compute函數的網路設定中添加的vSwitch的IP段。
更多資訊
更多訪問RDS MySQL資料庫的樣本,請參見Function ComputePython訪問MySQL資料庫。
關於如何查看Function Compute配置的交換器資訊以及如何在RDS MySQL資料庫允許存取Function Compute的交換器網段,請分別參見配置網路和RDS設定白名單。
如果您的資料庫訪問失敗,需要根據問題現象進行排查,詳情請參見資料庫訪問失敗的常見原因。