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

edward-howell-ch0bdm8v4Bc-unsplash.jpg

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

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

工做機制

訪問 PostgreSQL 的原理、工做機制與訪問 Mysql 數據庫徹底相同,本文再也不重複闡述,更詳細的內容請參考 訪問 Mysql 數據庫 中的工做機制章節。sql

配置與函數編寫

公共配置

建立專有網絡VPC

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

建立安全組

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

注意:設置安全組策略的時候,須要在出口方向放行 PostgreSQL 實例的端口和配置的 VPC 內網 IP 段。

建立與配置 PostgreSQL 實例

  1. 建立適合業務需求的雲數據庫 PostgreSQL 版實例能夠參考 雲數據庫 PostgreSQL 版
注意:建立雲數據庫 PostgreSQL 版實例須要選擇和函數計算配置相同的 VPC 實例,能夠配置和函數計算不一樣的可用區的交換機,由於相同的 VPC 實例下不一樣可用區交換機內網是互通的。
  1. 建立成功後,在實例信息頁面左側的導航欄中單擊數據安全性
  2. 單擊 添加白名單分組

1

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

    1. 登陸 VPC 控制檯,在專有網絡列表中找到應用所在的 VPC,單擊該 VPC 的名稱進入專有網絡詳情頁面。
    2. 複製應用所在的 VPC 的 IPv4 網段
![2](http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/pic/148798/cn_zh/1578988602523/20200114155608.jpg)
3. 在**組內白名單**設置框中粘貼該 VPC 的 **IPv4 網段**地址,而後單擊**肯定**。
![3](http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/pic/148798/cn_zh/1578988685829/20200114155742.jpg)
  1. 最後訪問 PostgreSQL 數據庫 host 爲實例的內網地址,能夠登陸阿里雲控制檯查看:

    2

函數計算配置 VPC

注意:函數計算服務所在區域與公共配置中建立的資源所在區域一致。
  1. 函數計算控制檯 建立服務。安全

  2. 【專有網絡配置】選項中,選擇您在步驟一中建立的 VPC 網絡,交換機、安全組。
  3. 【權限配置】選項中,選擇【新建角色】,點擊【點擊受權】,在角色快速建立頁面,點擊【贊成受權】。服務器

  4. 點擊肯定,新建服務完畢。

函數編寫與調試

下面演示 Python3 開發語言訪問 PostgreSQL 數據庫。網絡

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

Python3

  1. 在本地創建一個目錄,用於存放代碼和依賴模塊,在該目錄下新建 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: ***

```
  1. 在該目錄下建立 Funfile 文件內容以下。運維

    RUNTIME python3
    RUN fun-install pip install psycopg2
  2. 執行fun install命令安裝依賴:

    $ fun install
    using template: template.yml
    start installing function dependencies without docker
    安裝過程。。。。
    Install Success
  3. 在函數根目錄下新建代碼文件,例如 /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()
  4. 執行如下命令部署函數。

    $ 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 數據庫。

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

  1. 無需採購和管理服務器等基礎設施,只需專一業務邏輯的開發,能夠大幅縮短項目交付時間和人力成本;
  2. 提供日誌查詢、性能監控、報警等功能快速排查故障;
  3. 免運維,毫秒級別彈性伸縮,快速實現底層擴容以應對峯值壓力,性能優異;
  4. 成本極具競爭力;
阿里巴巴雲原生關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,作最懂雲原生開發者的技術圈。」
相關文章
相關標籤/搜索