- FunctionGraph是什么?
- 函數中如何讀寫文件?
- FunctionGraph函數是否支持擴展?
- IAM子帳號使用FunctionGraph需要設置哪些權限?
- 依賴包是什么?
- 什么場景下需要引入依賴?
- 使用依賴包時,有哪些注意事項?
- 函數支持引入的依賴庫有哪些?
- 如何在FunctionGrap上使用第三方依賴?
- 如何制作函數依賴包?
- 如何在函數平臺創建依賴包?
- 如何為函數添加依賴包?
- 如何通過域名訪問專享版APIG中注冊的接口?
- 函數工作流的常見使用場景?
- 函數工作流是否支持修改運行時語言?
- 已創建的函數是否支持修改函數名稱?
- 如何獲取上傳的文件?
- 同步調用響應未收到的可能原因?
- os.system("command &")執行日志未采集,應如何處理?
- 自定義運行時,都能操作哪些目錄?
- 用戶想使用vpc功能,但不想配置VPC Administrator委托,應配置哪些授權項?
- 函數執行超時的可能原因有哪些?
- 如何獲取函數代碼?
- 是否有initializer的代碼示例?
- 函數服務是否支持在函數中啟動TCP的監聽端口,通過EIP接收外部發送過來的TCP請求?
FunctionGraph是什么?
函數工作流(FunctionGraph)是一項基于事件驅動的函數托管計算服務。使用FunctionGraph函數,只需編寫業務函數代碼并設置運行的條件,無需配置和管理服務器等基礎設施,函數以彈性、免運維、高可靠的方式運行。
函數中如何讀寫文件?
函數工作目錄權限說明
函數可以讀取代碼目錄下的文件,函數工作目錄在入口文件的上一級,例如用戶上傳了文件夾backend,需要讀取與入口文件同級目錄的文件test.conf,可以用相對路徑“code/backend/test.conf”,或者使用絕對路徑(相關目錄為RUNTIME_CODE_ROOT環境變量對應的值)。如果需要寫文件(如創建新文件或者下載文件等),可以在/tmp目錄下進行或者使用函數提供的掛載文件系統功能。
說明
若容器回收,文件的讀寫就會失效。
函數目前不支持持久化。
典型場景
- 需要對OBS上的文件進行處理,可以先把文件下載到/tmp目錄。
- 函數運行過程中產生了一些數據想保存到OBS,可以先在/tmp目錄下創建新文件,然后把這些數據寫到里面,接下來上傳該文件到OBS。
FunctionGraph函數是否支持擴展?
FunctionGraph目前已經集成了一些非標準庫如:redis、http、obs_client等,開發函數時可以直接使用。
用戶可以通過維護屬于自己的依賴代碼庫,供所有函數使用。
IAM子帳號使用FunctionGraph需要設置哪些權限?
使用IAM子帳號登錄、使用函數工作流服務,對函數和函數下的觸發器進行增刪改查,如果出現權限不足情況,需要主帳號對IAM子帳號所屬的用戶組設置相應的權限。同時,若您想通過函數調用其他云服務,如OBS服務時,需要您配置委托并根據實際業務需求配置服務相關權限。為保障服務的安全,請您按照最小權限原則配置權限。
依賴包是什么?
依賴包是程序包,可以理解為某軟件包運行所需的依賴環境,軟件包和依賴環境相互依賴,若無此依賴環境,則軟件包無法正常使用。
什么場景下需要引入依賴?
當您安裝了某個程序或開發了某段代碼,需要依賴某個環境運行時,此時您需要引入依賴。
使用依賴包時,有哪些注意事項?
- 依賴包內文件名不能以~結尾。
- 依賴包當前文件限制數為30000。
- 在函數頁面上傳依賴包的ZIP包文件大小限制為10M,如超過10M,需通過OBS上傳(依賴包大小限制為最大300M)。
- 如果函數配置了私有依賴包且依賴包很大,建議在函數詳情頁的“設置 > 常規設置”重新設置函數執行時間,在原基礎上增加超時時間。
函數支持引入的依賴庫有哪些?
支持的依賴庫說明
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桶或在函數界面上傳,在函數代碼中即可使用其功能。
如何在FunctionGrap上使用第三方依賴?
- 將依賴的第三方庫打包成zip包。
- 在函數平臺,完成依賴包創建。
- 進入待配置依賴包的函數配置詳情頁,在“代碼”頁簽下,添加制作成功的私有依賴包。在函數代碼中即可使用其功能。
如何制作函數依賴包?
制作函數依賴包推薦在EulerOS環境中進行。 使用其他系統打包可能會因為底層依賴庫的原因,運行出問題,比如找不到動態鏈接庫。
說明如果安裝的依賴模塊需要添加依賴庫,請將依賴庫歸檔到zip依賴包文件中,例如,添加.dll、.so、.a等依賴庫。
為Python函數制作依賴包
打包環境中的Python版本要和對應函數的運行時版本相同,如Python2.7建議使用2.7.12及以上版本,Python3.6建議使用3.6.3以上版本。
為Python 2.7安裝PyMySQL依賴包,并指定此依賴包的安裝路徑為本地的/tmp/pymysql下,可以執行如下命令。
pip install PyMySQL --root /tmp/pymysql
執行成功后,執行以下命令。
cd /tmp/pymysql/
進入子目錄直到site-packages路徑下(一般路徑為usr/lib64/python2.7/site-packages/),接下來執行以下命令。
zip -rq pymysql.zip *
所生成的包即為最終需要的依賴包。
說明如果需要安裝存放在的本地wheel安裝包,直接輸入:
pip install piexif-1.1.0b0-py2.py3-none-any.whl --root /tmp/piexif
//安裝包名稱以piexif-1.1.0b0-py2.py3-none-any.whl為例,請以實際安裝包名稱為準
為Nodejs函數制作依賴包
需要先保證環境中已經安裝了對應版本的Nodejs。
為Nodejs 8.10安裝MySQL依賴包,可以執行如下命令。
npm install mysql --save
可以看到當前目錄下會生成一個node_modules文件夾。
- Linux系統
Linux系統下可以使用以下命令生成zip包。
zip -rq mysql-node8.10.zip node_modules
即可生成最終需要的依賴包。
- windows系統
用壓縮軟件將node_modules目錄壓縮成zip文件即可。
如果需要安裝多個依賴包,也可以先新建一個package.json文件,例如在package.json中填入如下內容后,執行如下命令。
{
"name": "test",
"version": "1.0.0",
"dependencies": {
"redis": "~2.8.0",
"mysql": "~2.17.1"
}
}
npm install --save
不要使用CNPM命令制作nodejs依賴包。
然后將node_modules打包成zip即可生成一個既包含MySQL也包含redis的依賴包。
Nodejs其他版本制作依賴包過程與上述相同。
為Java函數制作依賴包
使用Java編譯型語言開發函數時,依賴包需要在本地編譯。
如何在函數平臺創建依賴包?
- 登錄FunctionGraph控制臺,在左側導航欄選擇“函數 > 依賴包管理”,進入“依賴包管理”界面。
- 單擊的“創建依賴包”,彈出“創建依賴包”對話框。
- 設置以下信息。
依賴包配置參數說明
| 參數 | 說明 |
|---|---|
| 依賴包名稱 | 自定義的依賴包名稱,用于識別不同的依賴包。 |
| 代碼上傳方式 | 分為上傳ZIP文件和從OBS上傳文件。 |
| 上傳ZIP文件:需單擊“添加文件”,上傳ZIP文件。 | - |
| OBS鏈接URL:需填寫“OBS鏈接URL”。 | - |
| 運行時語言 | 選擇運行時語言。 |
| 描述 | 對于依賴包的描述信息,可以不填。 |
- 單擊“確定”,完成依賴包的創建。默認首次創建的依賴包版本為“1”。
- 單擊列表中的依賴包名稱,進入版本歷史界面,可以查看當前依賴包下的所有版本和版本相關信息。當前支持針對同一依賴包,進行不同版本的系統化管理。單擊“創建版本”,填寫相關信息,可以創建新的依賴包版本。單擊具體的版本號,可以查看版本地址。單擊版本號所在行的刪除,可以刪除該版本。
如何為函數添加依賴包?
- 進入函數詳情頁面,在“代碼”頁簽,單擊“依賴代碼包”所在行的“添加依賴包”。
公共依賴包:此處的依賴包為函數平臺提供,您可以直接添加使用。
私有依賴包:此處的依賴包為用戶自行制作上傳的依賴包。
- 完成后單擊“保存”,完成依賴包的添加。
如何通過域名訪問專享版APIG中注冊的接口?
以域名www.test.com為例 ,具體請參考如下步驟。
- 登錄API網關控制臺,在左側導航欄選擇“專享版”,單擊實例名稱,進入“實例概覽”頁面,在“入口地址”區域查看“彈性IP地址”,獲取APIG的訪問地址(ip格式)。
- 在DNS控制臺,配置用戶域名www.test.com解析到apig地址的ipv4規則。
- 最后在函數服務配置該域名的解析配置,這樣就能在函數中通過域名(www.test.com)訪問專享版APIG中注冊的接口了。
函數工作流的常見使用場景?
- Web類應用:比如小程序、網頁/App、聊天機器人、BFF等。
- 事件驅動類應用:文件處理、圖片處理、視頻直播/轉碼、實時數據流處理、IoT規則/事件處理等。
- AI類應用:三方服務集成、AI推理、車牌識別。
函數工作流是否支持修改運行時語言?
不支持。函數一旦創建完成,就不能修改運行時語言。
已創建的函數是否支持修改函數名稱?
不支持,函數一旦創建完成,就不能修改函數名稱。
如何獲取上傳的文件?
以Python語言為例,如果用戶用os.getcwd()查看當前目錄的話,會發現當前目錄是/opt/function,但實際代碼是傳到/opt/function/code里的。
有2種方法可以獲取到上傳的文件:
- 函數里使用cd命令切換路徑到**/opt/function/code**
- 使用全路徑(相關目錄為RUNTIME_CODE_ROOT環境變量對應的值)
同步調用響應未收到的可能原因?
如果函數執行端到端時延超過90s,建議使用異步不使用同步,否則會因為網關限制,超過90s后無法收到同步響應。
os.system("command &")執行日志未采集,應如何處理?
不建議使用os.system("command &")后臺運行命令,其產生的輸出函數不進行采集。如果要得到后臺運行命令的輸出,建議使用subprocess.Popen的方式獲取其輸出。
自定義運行時,都能操作哪些目錄?
目前默認只能操作/tmp目錄,在/tmp下可以寫文件(如創建新文件或者下載文件等)。
用戶想使用vpc功能,但不想配置VPC Administrator委托,應配置哪些授權項?
用戶若不想配置VPC Administrator委托,可授予最小權限,如下表所示。
授權項配置
| 權限 | 授權項 |
|---|---|
| 刪除端口 | vpc:ports:delete |
| 查詢端口 | vpc:ports:get |
| 創建端口 | vpc:ports:create |
| 查詢VPC | vpc:vpcs:get |
| 查詢子網 | vpc:subnets:get |
函數執行超時的可能原因有哪些?
- 自身代碼執行邏輯超時,建議優化代碼或增加超時時間。
- 網路請求超時,建議增加超時時間。
函數進行冷啟動時,Java加載類時間過長,建議增加超時時間或增加內存。
如何獲取函數代碼?
- 登錄函數工作流控制臺,單擊函數名稱進入函數詳情頁,單擊右上方操作欄下的“導出函數”,繼續單擊“導出函數代碼”。
- 通過導出函數API接口獲取函數代碼。
是否有initializer的代碼示例?
有,請參考如下示例。
-
Node.js
exports.initializer = function(context, callback) { callback(null, ''); }; -
Python
def my_initializer(context):
print("hello world!")
- Java
public void my_initializer(Context context)
{
RuntimeLogger log = context.getLogger();
log.log(String.format("ak:%s", context.getAccessKey()));
}
- PHP
函數服務是否支持在函數中啟動TCP的監聽端口,通過EIP接收外部發送過來的TCP請求?
目前函數暫不支持這種方式。函數的理念是無服務器計算,計算資源只會在運行期分配,這種自定義監聽端口的場景并不適合。