函數計算(Function Compute):函數計算是事件驅動的全託管計算服務。使用函數計算,您無需採購與管理服務器等基礎設施,只需編寫並上傳代碼。函數計算爲您準備好計算資源,彈性地可靠地運行任務,並提供日誌查詢、性能監控和報警等功能。藉助函數計算,您能夠快速構建任何類型的應用和服務,而且只需爲任務實際消耗的資源付費。html
訪問 PostgreSQL 數據庫是指在函數計算中經過編寫代碼調用數據庫驅動庫經過 TCP 協議實現對數據庫進行的插入、查詢等操做。一般函數計算中運行的不一樣函數實例之間是不共享狀態的,對於結構化的數據能夠經過數據庫的形式進行持久化以實現狀態共享。因爲用戶函數運行在函數計算的 VPC 中,而用戶的數據庫運行在用戶所屬的 VPC 中,因此在函數計算平臺訪問數據庫會涉及到跨 VPC 訪問的場景,下面咱們先來介紹一下其工做機制。 python
訪問 PostgreSQL 的原理、工做機制與訪問 Mysql 數據庫徹底相同,本文再也不重複闡述,更詳細的內容請參考訪問 Mysql 數據庫中的工做機制章節。sql
在安全組控制檯新建安全組,點擊建立安全組,設置安全組名稱,網絡類型選擇專有網絡,並選擇剛纔建立的專有網絡。docker
注意:設置安全組策略的時候,須要在出口方向放行 PostgreSQL 實例的端口和配置的 VPC 內網 IP 段。
注意:建立雲數據庫 PostgreSQL 版實例須要選擇和函數計算配置相同的 VPC 實例,能夠配置和函數計算不一樣的可用區的交換機,由於相同的 VPC 實例下不一樣可用區交換機內網是互通的。
在彈出的對話框中,將函數計算所在的 VPC 網絡的網段地址配置在白名單輸入框中。數據庫
注意:函數計算服務所在區域與公共配置中建立的資源所在區域一致。
在函數計算控制檯建立服務。安全
【權限配置】選項中,選擇【新建角色】,點擊【點擊受權】,在角色快速建立頁面,點擊【贊成受權】。服務器
下面演示 Python3 開發語言訪問 PostgreSQL 數據庫。網絡
使用 Fun工具在創建存放代碼和依賴模塊目錄下安裝依賴和項目部署。
在本地創建一個目錄,用於存放代碼和依賴模塊,在該目錄下新建 template.yml 文件,例如 /tmp/code/template.yml,內容以下。less
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:
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 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,作最懂雲原生開發者的技術圈。」