Serverless 解惑——函数计算如何访问 SQL Server 数据库
函數計算(Function Compute):函數計算 是事件驅動的全托管計算服務。使用函數計算,您無需采購與管理服務器等基礎設施,只需編寫并上傳代碼。函數計算為您準備好計算資源,彈性地可靠地運行任務,并提供日志查詢、性能監控和報警等功能。借助函數計算,您可以快速構建任何類型的應用和服務,并且只需為任務實際消耗的資源付費。
訪問 SQL Server 數據庫是指在函數計算中通過編寫代碼調用數據庫驅動庫通過 TCP 協議實現對數據庫進行的插入、查詢等操作。通常函數計算中運行的不同函數實例之間是不共享狀態的,對于結構化的數據可以通過數據庫的形式進行持久化以實現狀態共享。由于用戶函數運行在函數計算的 VPC 中,而用戶的數據庫運行在用戶所屬的 VPC 中,所以在函數計算平臺訪問數據庫會涉及到跨 VPC 訪問的場景,下面我們先來介紹一下其工作機制。
工作機制
訪問 SQL Server 的原理、工作機制與訪問 Mysql 數據庫完全相同,本文不再重復闡述,更詳細的內容請參考 訪問 Mysql 數據庫 中的工作機制章節。
配置與函數編寫
公共配置
創建專有網絡VPC
創建安全組
在安全組控制臺 新建安全組,點擊 創建安全組,設置安全組名稱,網絡類型選擇 專有網絡,并選擇剛才創建的專有網絡。
創建與配置 SQL Server 實例
注意:創建云數據庫 SQL Server 版實例需要選擇和函數計算配置相同的 VPC 實例,可以配置和函數計算不同的可用區的交換機,因為相同的 VPC 實例下不同可用區交換機內網是互通的。
創建成功后,在實例信息頁面左側的導航欄中單擊數據安全性。
單擊 添加白名單分組 。
在彈出的對話框中,將函數計算所在的 VPC 網絡的網段地址配置在白名單輸入框中。
最后訪問 SQL Server 數據庫 host 為實例的內網地址,可以登錄阿里云控制臺查看:
函數計算配置 VPC
注意:函數計算服務所在區域與公共配置中創建的資源所在區域一致。
- 創建服務步驟請參考文章 服務的增刪改查
- 這步的操作是授予函數計算對 ENI 的操作權限,函數計算訪問 VPC 中資源需要的權限請參考文章 配置函數計算訪問 VPC 內的資源
###函數編寫與調試
下面演示 Python3 與 php7.2 開發語言訪問 SQL Server 數據庫函數示例創建:
使用 Fun 工具在建立存放代碼和依賴模塊目錄下安裝依賴和項目部署。
Python3
在該目錄下創建 Funfile 文件內容為:
RUNTIME python3 RUN fun-install pip install pymssql執行fun install命令安裝依賴:
$ fun install using template: template.yml start installing function dependencies without docker 安裝過程。。。。 Install Success在函數根目錄下新建代碼文件,例如 /tmp/code/index.py:
# -*- coding: utf-8 -*- import pymssql def handler(event, context):conn = pymssql.connect(host='rm-xxx.sqlserver.rds.aliyuncs.com',user='xxx,password='xxx',database='xxx',charset='utf8')cursor = conn.cursor()cursor.execute('SELECT * FROM inventory WHERE quantity > 152')result = ''for row in cursor:result += 'row = %r\n' % (row,)conn.close()return result使用 fun 工具部署:
$ fun deploy using template: template.yml using region: cn-hangzhou using accountId: ***********3743 using accessKeyId: ***********Ptgk using timeout: 60部署過程。。。function python-test deploy success service SQL-Server-test deploy success登錄控制臺,即可看到相關的服務、函數被創建成功,且觸發執行可以返回正確的結果。
PHP7.2
建立一個目錄,用于存放代碼和依賴模塊,在該目錄下新建 template.yml 文件,例如 /tmp/code/template.yml,內容為:
ROSTemplateFormatVersion: '2015-09-01' Transform: 'Aliyun::Serverless-2018-04-03' Resources:SQL-Server-test:Type: 'Aliyun::Serverless::Service'Properties:Description: This is SQL-Server serviceRole: 'acs:ram::xxx:role/fc-public-test'LogConfig:Project: xxxLogstore: xxxVpcConfig:VpcId: vpc-xxxVSwitchIds:- vsw-x'x'x'xSecurityGroupId: sg-xxxInternetAccess: truephp-test:Type: 'Aliyun::Serverless::Function'Properties:Handler: 'index.handler'Runtime: php7.2Timeout: 10MemorySize: 128CodeUri: './'EnvironmentVariables:ODBCINI: /code/.fun/root/etc/odbc.iniODBCSYSINI: /code/.fun/root/opt/microsoft/msodbcsql17/etc在該目錄下創建 Funfile 文件內容為:
RUNTIME php7.2 RUN apt-get update && apt-get install -y apt-transport-https apt-utils RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - RUN curl https://packages.microsoft.com/config/debian/8/prod.list > /etc/apt/sources.list.d/mssql-release.list RUN fun-install apt-get install unixodbc-dev RUN fun-install apt-get install msodbcsql17執行fun install命令安裝依賴:
$ fun install using template: template.yml start installing function dependencies without docker 安裝過程。。。。 Install Success在函數根目錄下新建代碼文件,例如 /tmp/code/index.php:
<?php function handler($event, $context) {try {$conn = new PDO("sqlsrv:Server=rm-xxx.sqlserver.rds.aliyuncs.com;Database=xxx","xxx","xxx");// set the PDO error mode to exception$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);$conn->query("set names utf-8");$sql="SELECT * FROM inventory WHERE quantity > 152";$result = $conn->prepare($sql);$result->execute();print($result);return ("Connection successed.");} catch (PDOException $e) {return ("Connection failed: " . $e->getMessage());} }使用 fun 工具部署:
$ fun deploy using template: template.yml using region: cn-hangzhou using accountId: ***********3743 using accessKeyId: ***********Ptgk using timeout: 60部署過程。。。function php-test deploy success service SQL-Server-test deploy success登錄控制臺,即可看到相關的服務、函數被創建成功,且觸發執行可以返回正確的結果。
ODBCINI: /code/.fun/root/etc/odbc.ini
ODBCSYSINI: /code/.fun/root/opt/microsoft/msodbcsql17/etc
總結
通過本文介紹可以快速實現函數計算訪問 SQL Server 數據庫。
使用函數計算帶來的優勢:
加入我們
團隊介紹
阿里云函數服務是一個全新的,支持事件驅動編程模式的計算服務。 他幫助用戶聚焦自身業務邏輯,以 Serverless的方式構建應用,快速的實現低成本,可擴展,高可用的系統,而無需考慮服務器等底層基礎設施的管理。 用戶能夠快速的創建原型,同樣的架構能隨業務規模平滑伸縮。讓計算變得更高效,更經濟,更彈性,更可靠。無論小型創業公司,還是大型企業,都受益其中。我們的團隊正在迅速擴張,求賢若渴。我們想尋找這樣的隊友:
基本功扎實。既能閱讀論文追蹤業界趨勢,又能快速編碼解決實際問題。
嚴謹的,系統化的思維能力。既能整體考慮業務機會,系統架構,運維成本等諸多因素,又能掌控設計/開發/測試/發布的完整流程,預判并控制風險。
好奇心和使命感驅動。樂于探索未知領域,不僅是夢想家,也是踐行者。
堅韌、樂觀、自信。能在壓力和困難中看到機會,讓工作充滿樂趣!
如果您對云計算充滿熱情,想要構建一個有影響力計算平臺和生態體系,請加入我們,和我們一起實現夢想!
職位描述
構建新一代 Serverless 計算平臺,包括:
職位要求
通過“阿里巴巴編碼規范” 認證的同學優先錄取,認證地址:https://edu.aliyun.com/certification/cldt02
簡歷提交
yixian.dw AT alibaba-inc.com
“阿里巴巴云原生技術圈關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦云原生流行技術趨勢、云原生大規模的落地實踐,做最懂云原生開發者的技術圈。”
總結
以上是生活随笔為你收集整理的Serverless 解惑——函数计算如何访问 SQL Server 数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Golang 1.14 发布 | 云原生
- 下一篇: 从零开始入门 K8s | Kuberne