函數計算(Function Compute):函數計算 是事件驅動的全託管計算服務。使用函數計算,您無需採購與管理服務器等基礎設施,只需編寫並上傳代碼。函數計算爲您準備好計算資源,彈性地可靠地運行任務,並提供日誌查詢、性能監控和報警等功能。藉助函數計算,您能夠快速構建任何類型的應用和服務,而且只需爲任務實際消耗的資源付費。php
訪問 SQL Server 數據庫是指在函數計算中經過編寫代碼調用數據庫驅動庫經過 TCP 協議實現對數據庫進行的插入、查詢等操做。一般函數計算中運行的不一樣函數實例之間是不共享狀態的,對於結構化的數據能夠經過數據庫的形式進行持久化以實現狀態共享。因爲用戶函數運行在函數計算的 VPC 中,而用戶的數據庫運行在用戶所屬的 VPC 中,因此在函數計算平臺訪問數據庫會涉及到跨 VPC 訪問的場景,下面咱們先來介紹一下其工做機制。html
訪問 SQL Server 的原理、工做機制與訪問 Mysql 數據庫徹底相同,本文再也不重複闡述,更詳細的內容請參考 訪問 Mysql 數據庫 中的工做機制章節。前端
在安全組控制檯 新建安全組,點擊 建立安全組,設置安全組名稱,網絡類型選擇 專有網絡,並選擇剛纔建立的專有網絡。python
注意:建立雲數據庫 SQL Server 版實例須要選擇和函數計算配置相同的 VPC 實例,能夠配置和函數計算不一樣的可用區的交換機,由於相同的 VPC 實例下不一樣可用區交換機內網是互通的。
在彈出的對話框中,將函數計算所在的 VPC 網絡的網段地址配置在白名單輸入框中。算法
![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)
注意:函數計算服務所在區域與公共配置中建立的資源所在區域一致。
在 函數計算控制檯 建立服務。sql
【權限配置】選項中,選擇【新建角色】,點擊【點擊受權】,在角色快速建立頁面,點擊【贊成受權】。docker
下面演示 Python3 與 php7.2 開發語言訪問 SQL Server 數據庫函數示例建立:數據庫
使用 Fun 工具在創建存放代碼和依賴模塊目錄下安裝依賴和項目部署。
創建一個目錄,用於存放代碼和依賴模塊,在該目錄下新建 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 service Role: 'acs:ram::xxxxx:role/fc-public-test' LogConfig: Project: xxx Logstore: xxx VpcConfig: VpcId: vpc-xxx VSwitchIds:
SecurityGroupId: sg-xxx InternetAccess: true python-test: Type: 'Aliyun::Serverless::Function' Properties: Handler: 'index.handler' Runtime: python3 Timeout: 10 MemorySize: 128 CodeUri: './'
2. 在該目錄下建立 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
登陸控制檯,便可看到相關的服務、函數被建立成功,且觸發執行能夠返回正確的結果。
創建一個目錄,用於存放代碼和依賴模塊,在該目錄下新建 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 service Role: 'acs:ram::xxx:role/fc-public-test' LogConfig: Project: xxx Logstore: xxx VpcConfig: VpcId: vpc-xxx VSwitchIds:
SecurityGroupId: sg-xxx InternetAccess: true php-test: Type: 'Aliyun::Serverless::Function' Properties: Handler: 'index.handler' Runtime: php7.2 Timeout: 10 MemorySize: 128 CodeUri: './' EnvironmentVariables: ODBCINI: /code/.fun/root/etc/odbc.ini ODBCSYSINI: /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 2. 執行`fun install`命令安裝依賴後,修改 .fun/root/etc/odbc.ini 文件中 Driver 值指向.fun/root/opt/microsoft/msodbcsql17/lib64/目錄下的文件,如圖! ![3](http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/pic/154509/cn_zh/1582711162843/20200226175851.jpg) 3. php環境中須要使用 pdo_sqlsrv 擴展編譯能夠參考 [函數計算 php runtime 編譯非內置的擴展](https://statistics.functioncompute.com/?title=Serverless%20%E8%A7%A3%E6%83%91%E2%80%94%E2%80%94%E5%87%BD%E6%95%B0%E8%AE%A1%E7%AE%97%E5%A6%82%E4%BD%95%E8%AE%BF%E9%97%AE%20SQL%20Server%20%E6%95%B0%E6%8D%AE%E5%BA%93&author=%E7%94%B0%E5%B0%8F%E5%8D%95&src=&url=https%3A%2F%2Fyq.aliyun.com%2Farticles%2F686367) 文檔最後能夠下載已經編譯好的 pdo_sqlsrv 擴展。
經過本文介紹能夠快速實現函數計算訪問 SQL Server 數據庫。
使用函數計算帶來的優點:
阿里雲函數服務是一個全新的,支持事件驅動編程模式的計算服務。 他幫助用戶聚焦自身業務邏輯,以 Serverless的方式構建應用,快速的實現低成本,可擴展,高可用的系統,而無需考慮服務器等底層基礎設施的管理。 用戶可以快速的建立原型,一樣的架構能隨業務規模平滑伸縮。讓計算變得更高效,更經濟,更彈性,更可靠。不管小型創業公司,仍是大型企業,都受益其中。咱們的團隊正在迅速擴張,求賢若渴。咱們想尋找這樣的隊友:
基本功紮實。既能閱讀論文追蹤業界趨勢,又能快速編碼解決實際問題。
嚴謹的,系統化的思惟能力。既能總體考慮業務機會,系統架構,運維成本等諸多因素,又能掌控設計/開發/測試/發佈的完整流程,預判並控制風險。
好奇心和使命感驅動。樂於探索未知領域,不只是夢想家,也是踐行者。
堅韌、樂觀、自信。能在壓力和困難中看到機會,讓工做充滿樂趣!
若是您對雲計算充滿熱情,想要構建一個有影響力計算平臺和生態體系,請加入咱們,和咱們一塊兒實現夢想!
構建新一代 Serverless 計算平臺,包括:
yixian.dw AT alibaba-inc.com
「 阿里巴巴雲原生技術圈關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,作最懂雲原生開發者的技術圈。」