函數計算(Function Compute):函數計算 是事件驅動的全託管計算服務。使用函數計算,您無需採購與管理服務器等基礎設施,只需編寫並上傳代碼。函數計算為您準備好計算資源,彈性地可靠地運行任務,並提供日誌查詢、性能監控和報警等功能。藉助函數計算,您可以快速構建任何類型的應用和服務,並且只需為任務實際消耗的資源付費。
訪問 PostgreSQL 數據庫是指在函數計算中通過編寫代碼調用數據庫驅動庫通過 TCP 協議實現對數據庫進行的插入、查詢等操作。通常函數計算中運行的不同函數實例之間是不共享狀態的,對於結構化的數據可以通過數據庫的形式進行持久化以實現狀態共享。由於用戶函數運行在函數計算的 VPC 中,而用戶的數據庫運行在用戶所屬的 VPC 中,所以在函數計算平臺訪問數據庫會涉及到跨 VPC 訪問的場景,下面我們先來介紹一下其工作機制。
工作機制
訪問 PostgreSQL 的原理、工作機制與訪問 Mysql 數據庫完全相同,本文不再重複闡述,更詳細的內容請參考 訪問 Mysql 數據庫 中的工作機制章節。
配置與函數編寫
公共配置
創建專有網絡VPC
- 登錄 VPC控制檯。
- 參閱 VPC 搭建專有網絡 創建VPC和交換機。
創建安全組
在安全組控制檯 新建安全組,點擊 創建安全組,設置安全組名稱,網絡類型選擇 專有網絡,並選擇剛才創建的專有網絡。
注意:設置安全組策略的時候,需要在出口方向放行 PostgreSQL 實例的端口和配置的 VPC 內網 IP 段。
創建與配置 PostgreSQL 實例
- 創建適合業務需求的雲數據庫 PostgreSQL 版實例可以參考 雲數據庫 PostgreSQL 版。
注意:創建雲數據庫 PostgreSQL 版實例需要選擇和函數計算配置相同的 VPC 實例,可以配置和函數計算不同的可用區的交換機,因為相同的 VPC 實例下不同可用區交換機內網是互通的。
- 創建成功後,在實例信息頁面左側的導航欄中單擊數據安全性。
- 單擊 添加白名單分組 。
- 在彈出的對話框中,將函數計算所在的 VPC 網絡的網段地址配置在白名單輸入框中。登錄 VPC 控制檯,在專有網絡列表中找到應用所在的 VPC,單擊該 VPC 的名稱進入專有網絡詳情頁面。複製應用所在的 VPC 的 IPv4 網段。
在組內白名單設置框中粘貼該 VPC 的 IPv4 網段地址,然後單擊確定。 - 最後訪問 PostgreSQL 數據庫 host 為實例的內網地址,可以登錄阿里雲控制檯查看:
函數計算配置 VPC
注意:函數計算服務所在區域與公共配置中創建的資源所在區域一致。
- 在 函數計算控制檯 創建服務。創建服務步驟請參考文章 服務的增刪改查
- 【專有網絡配置】選項中,選擇您在步驟一中創建的 VPC 網絡,交換機、安全組。
- 【權限配置】選項中,選擇【新建角色】,點擊【點擊授權】,在角色快速創建頁面,點擊【同意授權】。這步的操作是授予函數計算對 ENI 的操作權限,函數計算訪問 VPC 中資源需要的權限請參考文章 配置函數計算訪問 VPC 內的資源
- 點擊確定,新建服務完畢。
函數編寫與調試
下面演示 Python3 開發語言訪問 PostgreSQL 數據庫。
使用 Fun 工具在建立存放代碼和依賴模塊目錄下安裝依賴和項目部署。
Python3
- 在本地建立一個目錄,用於存放代碼和依賴模塊,在該目錄下新建 template.yml 文件,例如 /tmp/code/template.yml,內容如下。ROSTemplateFormatVersion: '2015-09-01' Transform: 'Aliyun::Serverless-2018-04-03' Resources: PostgreSQL-test: Type: 'Aliyun::Serverless::Service' Properties: Description: This is PostgreSQL service Role: 'acs:ram::1986114430***:role/fc-public-test' SimpleRequest VpcConfig: VpcId: vpc-**** VSwitchIds: - vsw-*** SecurityGroupId: sg-*** InternetAccess: true python-test: Type: 'Aliyun::Serverless::Function' Properties: Handler: 'index.handler' Initializer: 'index.initializer' Runtime: python3 Timeout: 10 MemorySize: 128 CodeUri: './' EnvironmentVariables: HOST: pgm-bp1yawvyyu***.pg.rds.aliyuncs.com PASSWORD: Txd123** PORT: 1433 DATABASE: test_123 USER: ***
- 在該目錄下創建 Funfile 文件內容如下。RUNTIME python3 RUN fun-install pip install psycopg2
- 執行fun install命令安裝依賴:$ fun install using template: template.yml start installing function dependencies without docker 安裝過程。。。。 Install Success
- 在函數根目錄下新建代碼文件,例如 /tmp/code/index.py ,內容如下。# -*- coding: utf-8 -*- import logging import psycopg2 import os,sys logger = logging.getLogger() def getConnection(): try: conn = psycopg2.connect( database = os.environ['DATABASE'], user = os.environ['USER'], password = os.environ['PASSWORD'], host = os.environ['HOST'], port = os.environ['PORT'], ) return conn except Exception as e: logger.error(e) logger.error("ERROR: Unexpected error: Could not connect to PostgreSQL instance.") sys.exit() def conditionallyCreateUsersTable(): conn = getConnection() cur = conn.cursor() cur.execute('''CREATE TABLE COMPANY (ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL);''') conn.commit() conn.close() def initializer(context): conditionallyCreateUsersTable() def handler(event, context): try: conn = getConnection() cur = conn.cursor() cur.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \\ VALUES (1, 'Paul', 32, 'California', 20000.00 )"); conn.commit() return 'successfully' finally: conn.close()
- 執行以下命令部署函數。$ fun deploy -y using template: template.yml using region: cn-hangzhou using accountId: ***********3743 using accessKeyId: ***********Ptgk using timeout: 60 部署過程。。。 function python-test deploy success service PostgreSQL-test deploy success登錄控制檯,即可看到相關的服務、函數被創建成功,且觸發執行可以返回正確的結果。
總結
通過本文介紹可以快速實現函數計算訪問 PostgreSQL 數據庫。
使用函數計算帶來的優勢:
- 無需採購和管理服務器等基礎設施,只需專注業務邏輯的開發,可以大幅縮短項目交付時間和人力成本;
- 提供日誌查詢、性能監控、報警等功能快速排查故障;
- 免運維,毫秒級別彈性伸縮,快速實現底層擴容以應對峰值壓力,性能優異;
- 成本極具競爭力;
“阿里巴巴雲原生關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的技術圈。”
閱讀更多 阿里巴巴雲原生 的文章