全部產品
Search
文件中心

Function Compute:訪問RDS SQL Server樣本

更新時間:Jul 06, 2024

您可以參考本文提供的Function Compute訪問ApsaraDB RDS for SQL Server的操作指導,在函數中配置Virtual Private Cloud相關資訊並在資料庫中配置白名單,實現VPC內資料庫的訪問和操作。本文以Python 3為例,介紹如何使用Serverless Devs部署函數來訪問ApsaraDB RDS for SQL Server

前提條件

  • 快速建立RDS SQL Server執行個體

    重要
    • 請確保您所建立的資料庫執行個體與需要訪問該資料庫執行個體的函數在同一地區。

    • 建議您在Function Compute支援的可用性區域建立資料庫執行個體。更多資訊,請參見Function Compute支援的可用性區域

      如果您的資料庫執行個體不在Function Compute支援的可用性區域內,可以通過在您的VPC環境中建立一個與Function Compute相同可用性區域的vSwitch,並在函數的VPC配置中設定此vSwitch ID。由於同一VPC內不同vSwitch之間私網互連,因此Function Compute可以通過該vSwitch訪問在其他可用性區域的VPC內的資源。具體步驟,請參見遇到vSwitch is in unsupported zone的錯誤怎麼辦?

  • 建立名為users的表。

    本文index.py範例程式碼中代碼邏輯為查詢名為users的資料庫表中的所有資料,因此,需要提前建立該表。

操作步驟

  1. 安裝Serverless Devs和Docker,並添加密鑰資訊。

    具體操作,請參見快速入門添加密鑰資訊

  2. 執行以下命令初始化專案。

    sudo s init

    根據介面提示,依次選擇阿里雲廠商、快速建立模式和Python內建運行時,設定工程名稱以及選擇專案部署地區等,本文樣本為在杭州地區下部署start-fc-sql-server-python專案。

  3. 執行以下命令進入專案。

    cd start-fc-sql-server-python
  4. 根據實際情況修改目錄檔案。

    • 編輯s.yaml檔案,樣本如下。

      edition: 3.0.0
      name: hello-world-app
      access: "default"
      
      vars: # 全域變數
        region: "cn-hangzhou"
      
      resources:
        hello_world:
          component: fc3 # 組件名稱,Serverless Devs 工具本身類似於一種遊戲機,不具備具體的業務能力,組件類似於遊戲卡,使用者通過向遊戲機中插入不同的遊戲卡實現不同的功能,即通過使用不同的組件實現不同的具體業務能力
          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-xt8f"
            description: 'hello world by serverless devs'
            runtime: "python3.9"
            code: ./code
            handler: index.handler
            memorySize: 128
            timeout: 30
            vpcConfig:
              vpcId: vpc-bp11y195luy47h8cm****  # 資料庫執行個體所在的VPC ID
              securityGroupId: sg-bp1el3hto8hhkdup****  # 安全性群組ID
              vSwitchIds:
                - vsw-bp116uemmj7fniubi****  # 請確保該vSwitch對應的網段已配置到資料庫執行個體訪問白名單中
            environmentVariables:
              MSSQL_SERVER: rm-bp1gmz41ws982****.sqlserver.rds.aliyuncs.com  # 資料庫存取點
              MSSQL_PORT: "1433"  # 資料庫連接埠
              MSSQL_USER: sqlserver****  # 資料庫使用者名稱稱
              MSSQL_PASSWORD: z****  # 資料庫使用者密碼
              MSSQL_DATABASE: z****  # 資料庫名稱
      重要

      請確保您為函數配置的交換器網段已添加到資料庫執行個體訪問白名單中。具體操作,請參見設定資料庫IP訪問白名單

    • 編輯index.py代碼檔案,樣本如下,代碼邏輯為查詢資料庫的名稱為users的表中的所有資料。

      # -*- coding: utf-8 -*-
      import logging
      import pymssql   # 需先安裝pymssql庫
      import os
      
      logger = logging.getLogger()
      
      
      # 建立資料庫連接
      def getConnection():
          try:
              conn = pymssql.connect(
                  host=os.environ['MSSQL_SERVER'],
                  port=int(os.environ['MSSQL_PORT']),
                  user=os.environ['MSSQL_USER'],
                  password=os.environ['MSSQL_PASSWORD'],
                  database=os.environ['MSSQL_DATABASE'],
                  charset='utf8')
              return conn
          except Exception as e:
              logger.error(e)
              logger.error(
                  "ERROR: Unexpected error: Could not connect to SQL Server instance.")
              raise Exception(str(e))
      
      
      def handler(event, context):
          conn = getConnection()
          try:
              with conn.cursor() as cursor:
                  #  查詢user表的所有記錄
                  cursor.execute("SELECT * FROM users")
                  result = cursor.fetchone()
                  logger.info(result)
                  return result
          finally:
              # 關閉資料庫連結
              conn.close()
      
  5. 執行以下命令構建專案。

    sudo s build --use-docker
  6. 執行以下命令部署專案。

    sudo s deploy -y
  7. 執行以下命令調用函數。

    sudo s invoke -e "{}"

    預期輸出如下,以下返回結果表示已成功讀取資料庫中users表中的資料。

    ========= FC invoke Logs begin =========
    FunctionCompute python3 runtime inited.
    FC Invoke Start RequestId: 1-65d404e6-15b9013a-67628c1019d2
    2024-02-20T01:48:22.181Z 1-65d404e6-15b9013a-67628c1019d2 [INFO] None
    FC Invoke End RequestId: 1-65d404e6-15b9013a-67628c1019d2
    
    Duration: 90.16 ms, Billed Duration: 91 ms, Memory Size: 128 MB, Max Memory Used: 16.54 MB
    ========= FC invoke Logs end =========
    
    Invoke instanceId: c-65d404de-15f440b6-75331892ecca
    Code Checksum: 18155960032536767495
    Qualifier: LATEST
    RequestId: 1-65d404e6-15b9013a-67628c1019d2
    
    Invoke Result:
    null
    [hello_world] completed (0.32s)

設定資料庫IP訪問白名單

重要

請使用設定IP地址白名單方式授權函數訪問資料庫,請勿使用安全性群組方式。否則,可能導致函數偶爾串連不上資料庫的情況,影響業務正常運行。

  1. 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
  2. 在左側導覽列單擊白名單與安全性群組

    白名單設定頁面,可查看當前的IP白名單模式。

    說明

    較早建立的執行個體可能採用高安全模式。新建立的執行個體都採用通用白名單模式。

  3. 在預設顯示的白名單設定頁簽,找到default白名單分組,在其右側,單擊修改

  4. 修改白名單分組對話方塊,將目標IP地址或IP位址區段加入組內白名單,然後單擊確定

    image

    重要

    此處填寫的IP地址,為在Function Compute服務的網路設定中添加的vSwitch的IP位址區段。您可以在服務的網路設定中,單擊配置的專用網路名稱跳轉到專用網路控制台擷取。

更多資訊