概述
函數代碼一般包含公共庫和業務邏輯兩部分。對于公共庫,您可以打包成依賴包單獨管理,共享給多個函數使用,同時也減少了函數代碼包部署、更新時的體積。
FunctionGraph也提供了一些公共依賴包,公共依賴包在平臺內部緩存,消除了冷啟動加載的影響,推薦您優先使用。
依賴包管理模塊統一管理用戶所有的依賴包,用戶可以通過本地上傳和obs地址的形式上傳依賴包,并為依賴包命名。同時支持用戶針對同一依賴包進行迭代更新,即同一依賴包可擁有多個版本,便于用戶對依賴包進行系統化管理。
說明
依賴包內文件名不能以~結尾。
依賴包當前文件限制數為30000。
如果函數配置了私有依賴包且依賴包很大的話,建議在函數詳情頁的“設置 > 常規設置”重新設置函數執行時間,在原基礎上增加超時時間。
創建依賴包
-
登錄FunctionGraph控制臺,在左側導航欄選擇“函數 > 依賴包管理”,進入“依賴包管理”界面。
-
單擊的“創建依賴包”,彈出“創建依賴包”對話框。
-
設置以下信息。
依賴包配置參數說明
| 參數 | 說明 |
|---|---|
| 依賴包名稱 | 自定義的依賴包名稱,用于識別不同的依賴包。 |
| 代碼上傳方式 | 分為上傳ZIP文件和從OBS上傳文件。 上傳ZIP文件:需單擊“添加文件”,上傳ZIP文件。 OBS鏈接URL:需填寫“OBS鏈接URL”。 |
| 運行時語言 | 選擇運行時語言。 |
| 描述 | 對于依賴包的描述信息,可以不填。 |
單擊“確定”,完成依賴包的創建。默認首次創建的依賴包版本為“1”。
單擊列表中的依賴包名稱,進入版本歷史界面,可以查看當前依賴包下的所有版本和版本相關信息。當前支持針對同一依賴包,進行不同版本的系統化管理。
- 單擊“創建版本”,填寫相關信息,可以創建新的依賴包版本。
- 單擊具體的版本號,可以查看版本地址。
- 單擊版本號所在行的刪除,可以刪除該版本。
配置函數依賴
-
登錄FunctionGraph控制臺,在左側導航欄選擇“函數 > 函數列表”,進入函數列表界面。
-
單擊函數名稱,進入函數詳情界面。
-
在“代碼”頁簽,單擊“代碼依賴包”所在行的“添加依賴包”,彈出“選擇依賴包”對話框。
-
選擇依賴包,單擊“確定”。
依賴包配置說明
| 參數 | 說明 |
|---|---|
| 運行時語言 | 默認展示當前函數的運行時語言,無法修改。 |
| 依賴包源 | 根據實際業務,選擇“公共依賴包”或“私有依賴包”。 |
| 依賴包名稱 | 選擇當前運行時語言下的依賴包。 |
| 版本 | 選擇當前依賴包的具體版本。 |
說明
一個函數最多可添加20個依賴包。
除了您自行創建的依賴包(私有依賴包)以外,FunctionGraph還提供了一些常見的公共依賴包,您可以直接選擇使用。
刪除依賴包
依賴包當前無法在界面直接刪除,若需刪除,請刪除依賴包下的所有版本。當所有版本全部刪除完成后,依賴包會自動刪除。
-
登錄FunctionGraph控制臺,在左側導航欄選擇“函數 > 依賴包管理”,進入“依賴包管理”界面。
-
單擊依賴包名稱,進入版本歷史管理界面。
-
單擊版本號所在行的刪除 , 可以刪除該版本,存在多個版本請重復此操作。
刪除依賴包版本

如果函數正在使用此依賴包,則無法刪除。
引入依賴庫
支持的依賴庫說明
FunctionGraph支持引入標準庫及第三方依賴庫。
- 標準庫
對于標準庫,無論是在線編輯或是線下開發打包上傳至FunctionGraph,均可以直接在代碼中引入,使用其功能。
- FunctionGraph支持的非標準庫
FunctionGraph內置一些三方件,如下表所示。像標準庫一樣,在編寫代碼時直接引入,使用其功能。
Node.js Runtime集成的三方件
| 名稱 | 功能 | 版本號 |
|---|---|---|
| q | 異步方法封裝 | 1.5.1 |
| co | 異步流程控制 | 4.6.0 |
| lodash | 常用工具方法庫 | 4.17.10 |
| esdk-obs-nodejs | OBS sdk | 2.1.5 |
| express | 極簡web開發框架 | 4.16.4 |
| fgs-express | 在FunctionGraph和API Gateway之上使用現有的Node.js應用程序框架運行無服務器應用程序和REST API 。提供的示例允許您使用Express框架輕松構建無服務器Web應用程序/服務和RESTful API 。 | 1.0.1 |
| request | 簡化http調用,支持HTTPS并默認遵循重定向 | 2.88.0 |
Python Runtime支持的非標準庫
| 模塊 | 功能 | 版本號 |
|---|---|---|
| dateutil | 日期/時間處理 | 2.6.0 |
| requests | http庫 | 2.7.0 |
| httplib2 | httpclient | 0.10.3 |
| numpy | 數學計算 | 1.13.1 |
| redis | redis客戶端 | 2.10.5 |
| obsclient | OBS客戶端 | - |
| smnsdk | 訪問云smn服務 | 1.0.1 |
其他第三方庫(除了上面表格列舉的非標準三方庫,FunctionGraph沒有內置別的非標準三方庫)
將依賴的第三方庫打包,上傳至OBS桶,在創建函數時配置依賴包的OBS存儲地址,在函數代碼中即可使用其功能。
引入依賴庫示例
處理圖片的函數代碼如下。
# -*- coding: utf-8 -*-
from PIL import Image, ImageEnhance
from com.obs.client.obs_client import ObsClient
import sys
import os
current_file_path = os.path.dirname(os.path.realpath(__file__))
# append current path to search paths, so that we can import some third party libraries.
sys.path.append(current_file_path)
region = 'your region'
obs_server = 'obs.xxxxxxcloud.com'
def newObsClient(context):
ak = context.getAccessKey()
sk = context.getSecretKey()
return ObsClient(access_key_id=ak, secret_access_key=sk, server=obs_server,
path_style=True, region=region, ssl_verify=False, max_retry_count=5, timeout=20)
def downloadFile(obsClient, bucket, objName, localFile):
resp = obsClient.getObject(bucket, objName, localFile)
if resp.status < 300:
print 'download file', file, 'succeed'
else:
print('download failed, errorCode: %s, errorMessage: %s, requestId: %s' % resp.errorCode, resp.errorMessage,
resp.requestId)
def uploadFileToObs(client, bucket, objName, file):
resp = client.putFile(bucket, objName, file)
if resp.status < 300:
print 'upload file', file, 'succeed'
else:
print('upload failed, errorCode: %s, errorMessage: %s, requestId: %s' % resp.errorCode, resp.errorMessage,
resp.requestId)
def getObjInfoFromObsEvent(event):
s3 = event['Records'][0]['s3']
eventName = event['Records'][0]['eventName']
bucket = s3['bucket']['name']
objName = s3['object']['key']
print "*** obsEventName: %s, srcBucketName: %s, objName: %s", eventName, bucket, objName
return bucket, objName
def set_opacity(im, opacity):
"""設置透明度"""
if im.mode != "RGBA":
im = im.convert('RGBA')
else:
im = im.copy()
alpha = im.split()[3]
alpha = ImageEnhance.Brightness(alpha).enhance(opacity)
im.putalpha(alpha)
return im
def watermark(im, mark, opacity=0.6):
"""添加水印"""
try:
if opacity < 1:
mark = set_opacity(mark, opacity)
if im.mode != 'RGBA':
im = im.convert('RGBA')
if im.size[0] < mark.size[0] or im.size[1] < mark.size[1]:
print "The mark image size is larger size than original image file."
return False
x = (im.size[0] - mark.size[0]) / 2
y = (im.size[1] - mark.size[1]) / 2
layer = Image.new('RGBA', im.size, )
layer.paste(mark, (x, y))
return Image.composite(layer, im, layer)
except Exception as e:
print ">>>>>>>>>>> WaterMark EXCEPTION: " + str(e)
return False
def watermark_image(localFile, fileName):
im = Image.open(localFile)
watermark_image_path = os.path.join(current_file_path, "watermark.png")
mark = Image.open(watermark_image_path)
out = watermark(im, mark)
print "**********finish water mark"
name = fileName.split('.')
outFileName = name[0] + '-watermark.' + name[1]
outFilePath = "/tmp/" + outFileName
if out:
out = out.convert('RGB')
out.save(outFilePath)
else:
print "Sorry, Save watermarked file Failed."
return outFileName, outFilePath
def handler(event, context):
srcBucket, srcObjName = getObjInfoFromObsEvent(event)
outputBucket = context.getUserData('obs_output_bucket')
client = newObsClient(context)
# download file uploaded by user from obs
localFile = "/tmp/" + srcObjName
downloadFile(client, srcBucket, srcObjName, localFile)
outFileName, outFile = watermark_image(localFile, srcObjName)
# 將轉換后的文件上傳到新的obs桶中
uploadFileToObs(client, outputBucket, outFileName, outFile)
return 'OK'
對于標準庫和FunctionGraph支持的非標準庫,可以直接引入。
對于FunctionGraph暫沒有內置的非標準三方庫,通過以下步驟引入。
- 將依賴的庫文件壓縮成ZIP包,上傳至OBS存儲桶,獲得依賴包的OBS存儲鏈接。
- 登錄FunctionGraph控制臺,在左側導航欄選擇“函數 > 依賴包管理”,進入“依賴包管理”界面。
- 選擇“創建依賴包”,彈出“創建依賴包”對話框。
- 輸入依賴包名稱、運行時語言和OBS存儲鏈接,單擊“確定”。
設置依賴包

- 進入函數詳情頁面,在“代碼”頁簽,單擊“依賴代碼包”所在行的“添加依賴包”,選擇4中創建的依賴包,單擊“確定”。
添加依賴包

- 單擊“保存”,完成函數的修改。
注意各個依賴包和代碼包之間盡量不要有相同的目錄或文件,比如依賴包depends.zip,里面有index.py這個文件,如果代碼采用在線編輯方式,函數執行入口為index.handler,這樣在函數執行的時候會產生一個代碼文件index.py,跟依賴包里面的index.py文件同名,兩個文件可能會因覆蓋合并而出錯。