阿裡雲 函數計算服務 (FunctionCompute,FC)是一個事件驅動的全托管計算服務。通過函數計算與雲端各個服務的廣泛內建,開發者隻需要編寫函數代碼,就能夠快速地開發出彈性高可用的後端系統。接下來我們使用FC,來快速實作一個圖檔轉換服務, 并把這個圖檔轉換服務作為支付寶小程式的後端。
支付寶小程式demo前端效果圖:

資源下載下傳及準備工作
示例代碼附件【必須】
支付寶小程式開發工具下載下傳【非必須】
函數計算FC 快捷入口 對象存儲OSS 快捷入口 日志服務Log Service 快捷入口簡明架構圖
函數入口
普通函數入口
def my_handler(event, context):
return 'hello world'
- 函數名
my_handler需要與建立函數時的"Handler"字段相對應:例如建立函數時指定的 Handler 為main.my_handler,那麼函數計算會去加載main.py中定義的my_handler函數
- event 參數
event 參數是使用者調用函數時傳入的資料,其類型是str
- context 參數
context 參數中包含一些函數的運作時資訊(例如 request id/臨時 AK 等)。其類型是FCContext,具體結構和使用在下面的使用 context介紹
- 傳回值
函數的傳回值會作為調用函數的結果傳回給使用者,它可以是任意類型:對于簡單類型會函數計算會把它轉換成 str 傳回,對于複雜類型會把它轉換成 JSON 字元串傳回
HTTP 觸發器的函數入口
HELLO_WORLD = b"Hello world!\n"
def handler(environ, start_response):
context = environ['fc.context']
status = '200 OK'
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
return [HELLO_WORLD]
- environ : environ 參數是一個 python 字典,裡面存放了所有和用戶端相關的資訊,具體詳情參考 environ 參數 ,函數計算增加了兩個自定義的 key,分别是
和fc.context
fc.request_uri
- fc.context : 和普通函數入口的 context 意義一樣
- fc.request_uri : string 類型,request 的 url
需要注意的點:environ 中的
HTTP_Variables
,裡面包含 request 中 header, 比如某個請求的 header 的為
'x-Custom-key':'value'
, 在 environ 中會表現為:
environ['HTTP_X_CUSTOM_KEY']='value'
, 可以了解為,對于 request header 中的 key,WSGI 做如下處理:
key = "HTTP_" + k.upper().replace("-","_")
- start_response : start_response 參數是一個可調用者(callable), 具體參考 the-start-response-callable , 這個是 FC runtime 提供的,它接受兩個必要的位置參數和一個可選參數。
更多詳細介紹請參考
python runtime具體操作步驟
假定這次實驗所有操作在華東2 上海region 完成,所有實驗相關的資源請從
附件中下載下傳
這裡介紹兩種部署函數的方法:
準備工作
-
準備存儲圖檔的 oss bucket
比如在華東2建立了一個名叫
的bucketxcx-demo
利用fun工具進行自動部署
Fun是用于在阿裡雲上定義 serverless 應用的模型。
Serverless 應用是由事件觸發功能組成的應用。一個典型的 serverless 應用由一個或多個由諸如向 阿裡雲 OSS 上傳對象,在 阿裡雲 OTS 上執行資料操作以及 API 操作等事件觸發的阿裡雲函數計算組成。這些函數可以獨立使用。也可以利用其它資源,例如阿裡雲 OTS 的表和 OSS 的 buckets。最基本的 serverless 應用可以隻有一個函數。
比如對于這個案例,定義的yaml檔案如下:
ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
sh-pro:
Type: 'Aliyun::Serverless::Log'
Properties:
Description: 'image process log pro'
fc-log:
Type: 'Aliyun::Serverless::Log::Logstore'
Properties:
TTL: 362
ShardCount: 1
pydemo:
Type: 'Aliyun::Serverless::Service'
Properties:
Description: 'fc xiaochengxu demo'
Policies:
- AliyunOSSFullAccess
LogConfig:
Project: 'sh-pro'
Logstore: 'fc-log'
upload:
Type: 'Aliyun::Serverless::Function'
Properties:
Handler: upload.handler
CodeUri: './'
Description: 'http function for upload image'
Runtime: python2.7
Timeout: 60
MemorySize: 256
Events:
http-trigger:
Type: HTTP
Properties:
AuthType: ANONYMOUS
Methods: ['POST']
proc:
Type: 'Aliyun::Serverless::Function'
Properties:
Handler: proc.handler
CodeUri: './'
Description: 'http function for process image'
Runtime: python2.7
Timeout: 60
MemorySize: 256
Events:
http-trigger:
Type: HTTP
Properties:
AuthType: ANONYMOUS
Methods: ['GET']
上面的定義的yaml檔案要做以下幾件事情:
- 建立日志資源:logproject:
, logstore:sh-pro
fc-log
- 建立service:
以及function:xcxdemo
upload
, 函數添加了一個類型為proc
,名叫HTTP
的triggerhttp-trigger
- 配置service role以及logconfig, 其中role的權限為
和函數執行日志寫到fc-log的權限AliyunOSSFullAccess
具體操作
npm install @alicloud/fun -g
- 修改template.yml中的logproject的名字和.env中的相關配置,執行指令
fun deploy
執行成功後,應該可以看到如下資源被建立, 截圖:
控制台setup
建立函數,并且配置http trigger
- 在 上海 region 先建立好日志資源,用于函數計算的日志收集
- 建立service,配置service一個具有通路oss權限的role
- 點選授權
十分鐘上線 - 函數計算建構支付寶小程式的後端
- 點選授權
- 點選确定
十分鐘上線 - 函數計算建構支付寶小程式的後端
- 建立一個函數,并設定Http trigger, 使用的代碼包為附件中 server 目錄下的
code.zip
測試函數
curl https://1186202104331798.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/pydemo/upload/ -F "lena.png=@/Users/songluo/work/shworkshop/wp/lena.png" -v
curl https://1186202104331798.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/pydemo/proc/rotate/10/lena.png >> 1.png
将函數作為支付寶小程式的後端
- 下載下傳安裝支付寶小程式 IDE
- 打開代碼包中的client, 将代碼中的 url 替換成自己函數的 url
然後打開 調試器 和 模拟器
總結
函數計算有如下優勢:
- 無需采購和管理伺服器等基礎設施
- 專注業務邏輯的開發
- 提供日志查詢、性能監控、報警等功能快速排查故障
- 以事件驅動的方式觸發應用響應使用者請求
- 毫秒級别彈性伸縮,快速實作底層擴容以應對峰值壓力
- 按需付費。隻需為實際使用的計算資源付費,适合有明顯波峰波谷的使用者通路場景
歡迎大家通過掃碼加入我們使用者群中,搭建過程中有問題或者有其他問題可以在群裡提出來。
函數計算官網客戶群(11721331)。