Serverless 解惑——函數計算如何訪問 Redis 數據庫

函數計算(Function Compute)函數計算 是事件驅動的全託管計算服務。使用函數計算,您無需採購與管理服務器等基礎設施,只需編寫並上傳代碼。函數計算爲您準備好計算資源,彈性地可靠地運行任務,並提供日誌查詢、性能監控和報警等功能。藉助函數計算,您可以快速構建任何類型的應用和服務,並且只需爲任務實際消耗的資源付費。

訪問 Redis 數據庫是指在函數計算中通過編寫代碼調用數據庫驅動庫通過 TCP 協議實現對數據庫進行的插入、查詢等操作。通常函數計算中運行的不同函數實例之間是不共享狀態的,對於結構化的數據可以通過數據庫的形式進行持久化以實現狀態共享。由於用戶函數運行在函數計算的 VPC 中,而用戶的數據庫運行在用戶所屬的 VPC 中,所以在函數計算平臺訪問數據庫會涉及到跨 VPC 訪問的場景,下面我們先來介紹一下其工作機制。

工作機制

訪問 Redis 的原理、工作機制與訪問 Mysql 數據庫完全相同,本文不再重複闡述,更詳細的內容請參考 訪問 Mysql 數據庫 中的工作機制章節。

配置與函數編寫

公共配置

創建專有網絡VPC

  1. 登錄 VPC控制檯
  2. 參閱 VPC 搭建專有網絡 創建VPC和交換機。

創建安全組

安全組控制檯 新建安全組,點擊 創建安全組,設置安全組名稱,網絡類型選擇 專有網絡,並選擇剛纔創建的專有網絡。

創建與配置 Redis 實例

  1. 創建適合業務需求的雲數據庫 Redis 版實例可以參考 雲數據庫 Redis 版

  2. 創建成功後,在實例信息頁面左側的導航欄中單擊白名單設置

  3. 單擊 default 區域框右側的修改
    1

  4. 在彈出的對話框中,將 函數計算所在的 VPC 網絡的網段地址配置在白名單輸入框中。

    1. 登錄 VPC 控制檯,在專有網絡列表中找到應用所在的 VPC,單擊該 VPC 的名稱進入專有網絡詳情頁面。
    2. 複製應用所在的 VPC 的 IPv4 網段
      2
    3. 組內白名單設置框中粘貼該 VPC 的 IPv4 網段地址,然後單擊確定
      3
  5. 最後訪問 Redis 數據庫 host 爲實例的內網地址,可以登錄阿里雲控制檯查看:

多種語言的客戶端連接阿里雲 Redis 可以參考 Redis 客戶端連接

1

函數計算配置 VPC

注意:函數計算服務所在區域與公共配置中創建的資源所在區域一致。

  1. 函數計算控制檯 創建服務。
  2. 【專有網絡配置】選項中,選擇您在步驟一中創建的 VPC 網絡,交換機、安全組。
  3. 【權限配置】選項中,選擇【新建角色】,點擊【點擊授權】,在角色快速創建頁面,點擊【同意授權】。
  4. 點擊確定,新建服務完畢。

函數編寫與調試

下面演示 Python3 開發語言訪問 Redis 數據庫函數示例創建:

使用 Fun 工具在建立存放代碼和依賴模塊目錄下安裝依賴和項目部署。

  1. 建立一個目錄,用於存放代碼和依賴模塊,在該目錄下新建 template.yml 文件,例如 /tmp/code/template.yml,內容爲:
ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
  Redis-test:
    Type: 'Aliyun::Serverless::Service'
    Properties:
      Description: This is Redis service
      Role: 'acs:ram::XXX:role/fc-public-test'
      LogConfig:
        Project: XXX
        Logstore: XXXX
      VpcConfig:
        VpcId: vpc-XXXXX
        VSwitchIds:
          - vsw-XXXX
        SecurityGroupId: sg-XXXX
      InternetAccess: true
    python-test:
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Initializer: 'index.initializer'
        Handler: 'index.handler'
        Runtime: python3
        Timeout: 10
        MemorySize: 128
        CodeUri: './'
        EnvironmentVariables:
          REDIS_HOST: r-XXXXX.redis.rds.aliyuncs.com
          REDIS_PASSWORD: XXXXX
          REDIS_PORT: '6379'
  1. 在該目錄下創建 Funfile 文件內容爲:
RUNTIME python3
RUN fun-install pip install redis
  1. 執行fun install命令安裝依賴:

    $ fun install
    using template: template.yml
    start installing function dependencies without docker
    
    building Redis-test/python-test
    Funfile exist, Fun will use container to build forcely
    Step 1/2 : FROM registry.cn-beijing.aliyuncs.com/aliyunfc/runtime-python3.6:build-1.7.7
     ---> 373f5819463b
    Step 2/2 : RUN fun-install pip install redis
     ---> Running in f26aef48f9e5
    Task => PipTask
    	 => PYTHONUSERBASE=/code/.fun/python pip install --user redis
    Removing intermediate container f26aef48f9e5
     ---> 809c6655f9e9
    sha256:809c6655f9e93d137840b1446f46572fbab7548c5c36b6ae66599dfc2e27555b
    Successfully built 809c6655f9e9
    Successfully tagged fun-cache-78c74899-5497-4205-a670-24e4daf88284:latest
    copying function artifact to /Users/txd123/Desktop/Redis/Python
    
    Install Success
    
    
  2. 在函數根目錄下新建代碼文件,例如 /tmp/code/index.py,在代碼中使用 redis :

    # -*- coding: utf-8 -*-
    import os,sys
    import redis
    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):
    	r = redis.Redis(connection_pool=conn_pool)
    	r.set('test','89898')
    	r.set('zyh_info','{"name":"Tanya","password":"123456","account":11234}')
    	print(r.get('test'))
    	return r.get('zyh_info')
    
  3. 使用 fun 工具部署:

    $ fun deploy
    using template: template.yml
    using region: cn-hangzhou
    using accountId: ***********3743
    using accessKeyId: ***********Ptgk
    using timeout: 60
    
    Waiting for service Redis-test to be deployed...
    		Waiting for function python-test to be deployed...
    				Waiting for packaging function python-test code...
    				The function python-test has been packaged. A total of 25 files files were compressed and the final size was 138.78 KB
    		function python-test deploy success
    service Redis-test deploy success
    

登錄控制檯,即可看到相關的服務、函數被創建成功,且觸發執行可以返回正確的結果。

總結

通過本文介紹可以快速實現函數計算訪問 Redis 數據庫。

使用函數計算帶來的優勢:

  1. 無需採購和管理服務器等基礎設施,只需專注業務邏輯的開發,可以大幅縮短項目交付時間和人力成本;
  2. 提供日誌查詢、性能監控、報警等功能快速排查故障;
  3. 免運維,毫秒級別彈性伸縮,快速實現底層擴容以應對峯值壓力,性能優異;
  4. 成本極具競爭力;

阿里巴巴雲原生技術圈關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的技術圈。”

發佈了247 篇原創文章 · 獲贊 39 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章