您可以參考本文提供的Function Compute訪問ApsaraDB for Redis的操作指導,在函數中配置Virtual Private Cloud相關資訊並在資料庫中配置白名單,實現VPC內的Redis資料庫訪問和操作。本文以Python 3為例,介紹如何使用Serverless Devs部署函數來訪問Redis資料庫。
前提條件
請確保您所建立的資料庫執行個體與需要訪問該資料庫執行個體的函數在同一地區。
建議您在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的錯誤怎麼辦?。
操作步驟
安裝Serverless Devs和Docker,並添加密鑰資訊。
執行以下命令初始化專案。
sudo s init
根據介面提示,依次選擇阿里雲廠商、快速建立模式和Python內建運行時,設定工程名稱以及選擇專案部署地區等,本文樣本為在杭州地區下部署start-fc-redis-python專案。
執行以下命令進入專案。
cd start-fc-redis-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: REDIS_HOST: r-bp17w15ohdk7****.redis.rds.aliyuncs.com # 資料庫執行個體的私網地址。 REDIS_PASSWORD: 15**** # 資料庫執行個體的密碼。 REDIS_PORT: 6379 # 資料庫執行個體的私網連接埠。
重要請確保您為函數配置的交換器網段已添加到資料庫執行個體訪問白名單中。具體操作,請參見設定資料庫訪問IP地址白名單。
編輯index.py代碼檔案,樣本如下,代碼邏輯為從Redis中讀取一個名稱為counter的鍵的值,將其加1,然後將新值寫回Redis。
# -*- coding: utf-8 -*- import os import redis conn_pool = None def initializer(context): global conn_pool conn_pool = redis.ConnectionPool( host=os.environ['REDIS_HOST'], password=os.environ['REDIS_PASSWORD'], port=os.environ['REDIS_PORT'], db=1, decode_responses=True) def handler(event, context): global conn_pool r = redis.Redis(connection_pool=conn_pool) counter = r.get('counter') if counter is None: counter = 0 else: counter = int(counter) print('counter: ' + str(counter)) r.set('counter', str(counter + 1)) return counter
執行以下命令構建專案。
sudo s build --use-docker
執行以下命令部署專案。
sudo s deploy -y
執行以下命令調用函數。
sudo s invoke -e "{}"
預期輸出如下,返回結果中的數字從0開始遞增,表示已成功讀取Redis中名稱為counter的鍵的值。
[2021-09-14T17:08:50.875] [INFO ] [S-CLI] - Start ... ========= FC invoke Logs begin ========= FC Initialize Start RequestId: ccd73383-048d-4c8d-834e-93da59b86a21 FC Initialize End RequestId: ccd73383-048d-4c8d-834e-93da59b86a21 FC Invoke Start RequestId: eccafc0a-493e-4f3e-9afa-45c0b84a2c0f counter: 0 FC Invoke End RequestId: eccafc0a-493e-4f3e-9afa-45c0b84a2c0f Duration: 27.51 ms, Billed Duration: 28 ms, Memory Size: 256 MB, Max Memory Used: 34.05 MB ========= FC invoke Logs end ========= FC Invoke Result: 0 End of method: invoke
設定資料庫訪問IP地址白名單
- 登入Redis管理主控台。
- 在頂部功能表列的左上方,選擇執行個體所屬的地區。
- 在執行個體列表頁,單擊目標執行個體ID。
在執行個體詳情頁面的左側導覽列,選擇白名單配置,在白名單設定頁簽,找到目標白名單分組,單擊右側操作列的修改。
在彈出的修改白名單分組面板中,在組內白名單輸入框輸入目標執行個體綁定的vSwitch的IP位址區段,然後單擊確定。
更多資訊
更多訪問Redis資料庫的樣本,請參見Function ComputePython訪問Redis資料庫。
關於如何查看Function Compute配置的交換器資訊以及如何在RDS MySQL資料庫允許存取Function Compute的交換器網段,請分別參見配置網路和設定IP白名單。
本文提供的範例程式碼,需要匯入Redis用戶端庫,關於安裝第三方依賴的步驟,請參見為函數安裝第三方依賴。
如果您配置的vSwitch無法訪問指定可用性區域,請參見遇到vSwitch is in unsupported zone的錯誤怎麼辦?。更多關於訪問Redis資料庫的異常案例,請參見常見報錯。如果您遇到的異常問題還未解決,需要根據問題現象進行排查,詳情請參見資料庫訪問失敗的常見原因。