概述
使用自定義鏡像開發HTTP函數時,用戶需要在鏡像中實現一個http server,并監聽8000端口接收請求。
說明HTTP函數只支持APIG觸發器。
步驟一:準備環境
本章節所有操作均默認具有操作權限,請確保您登錄的用戶已有“FunctionGraph Administrator”權限,即FunctionGraph服務管理員權限。
步驟二:制作鏡像
以在linux x86 64位系統上制作鏡像為例。
- 創建一個空文件夾
mkdir custom_container_http_example && cd custom_container_http_example
- 以Nodejs語言為例,實現一個Http Server,創建一個main.js文件,引入express框架,接收POST請求,打印請求Body到標準輸出并返回Hello FunctionGraph, method POST給客戶端。
const express = require('express');
const PORT = 8000;
const app = express();
app.use(express.json());
app.post('/*', (req, res) => {
console.log('receive', req.body);
res.send('Hello FunctionGraph, method POST');
});
app.listen(PORT, () => {
console.log(`Listening on //localhost:${PORT}`);
});
- 創建一個package.json文件,此文件用于向npm提供信息,使其能夠識別項目以及處理項目的依賴關系。
{
"name": "custom-container-http-example",
"version": "1.0.0",
"description": "An example of a custom container http function",
"main": "main.js",
"scripts": {},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.17.1"
}
}
name:值為項目名。
version:值為項目版本。
main:列舉文件為庫的主入口。
dependencies:列出npm上可用的項目的所有依賴項。
- 創建Dockerfile文件
FROM node:12.10.0
ENV HOME=/home/custom_container
GROUP_ID=1003
GROUP_NAME=custom_container
USER_ID=1003
USER_NAME=custom_container
RUN mkdir -m 550 ${HOME} &&
groupadd -g ${GROUP_ID} ${GROUP_NAME} &&
useradd -u ${USER_ID} -g ${GROUP_ID} ${USER_NAME}
COPY --chown=${USER_ID}:${GROUP_ID} main.js ${HOME}
COPY --chown=${USER_ID}:${GROUP_ID} package.json ${HOME}
RUN cd ${HOME} && npm install
RUN chown -R ${USER_ID}:${GROUP_ID} ${HOME}
RUN find ${HOME} -type d | xargs chmod 500 &&
find ${HOME} -type f | xargs chmod 500
USER ${USER_NAME}
WORKDIR ${HOME}
EXPOSE 8000
ENTRYPOINT ["node", "main.js"]
FROM:指定基礎鏡像為node:12.10.0,基礎鏡像必須設置,值可修改。
ENV:設置環境變量,設置HOME環境變量為/home/custom_container,設置GROUP_NAME和USER_NAME為custom_container,USER_ID和GROUP_ID為1003,這些環境變量必須設置,值可修改。
RUN:格式為RUN <命令>,例如RUN mkdir -m 550 {HOME}表示構建容器時創建{USER_NAME}用戶的home目錄。
USER:切換${USER_NAME}用戶。
WORKDIR:切換工作目錄到${USER_NAME}用戶的home目錄下。
COPY:將main.js和package.json拷貝到容器的${USER_NAME}用戶的home目錄下。
EXPOSE:暴露容器的8000端口,請勿修改。
ENTRYPOINT:使用node main.js命令啟動容器,請勿修改。
說明1. 可以使用任意基礎鏡像。
2. 在云上環境會默認使用uid 1003,gid 1003 啟動容器。uid、gid可以在函數頁面的設置 > 常規設置 >容器鏡像覆蓋板塊中修改,但不可以是root或其他保留id。
- 構建鏡像
指定鏡像的名稱為custom_container_http_example,版本為latest,“.”指定Dockerfile所在目錄,鏡像構建命令將該路徑下所有的內容打包給容器引擎幫助構建鏡像。
docker build -t custom_container_http_example:latest .
步驟三:本地驗證
- 啟動docker容器
docker run -u 1003:1003 -p 8000:8000 custom_container_http_example:latest
- 打開一個新的命令行窗口,向開放的8000端口發送消息,訪問模板代碼中指定的/invoke路徑
curl -XPOST -H 'Content-Type: application/json' -d '{"message":"HelloWorld"}' localhost:8000/helloworld
按照模塊代碼中返回
Hello FunctionGraph, method POST
- 在容器啟動端口可以看到
receive {"message":"HelloWorld"}

或者使用docker logs命令獲取容器的日志

步驟四:上傳鏡像
- 登錄容器鏡像服務控制臺,在左側導航欄選擇“我的鏡像”。
- 單擊右上角的“客戶端上傳”或“頁面上傳”。
- 根據指示上傳鏡像。

- 上傳成功后,在“我的鏡像”界面可查看。
步驟五:創建函數
-
登錄函數工作流控制臺,在左側的導航欄選擇“函數 > 函數列表”。
-
單擊右上方的“創建函數”,進入“創建函數”頁面,使用容器鏡像部署函數。
-
填寫基本信息。
- 函數類型:選擇“HTTP函數”
- 函數名稱:輸入“custom_container_http”
- 容器鏡像:選擇上一步上傳到SWR的鏡像。
- 現有委托:使用包含SWR Admin權限的委托。
-
完成后單擊“創建函數”。
步驟六:測試函數
- 在函數詳情頁,單擊“測試”,在彈窗中創建新的測試事件。
- 選擇“apig-event-template”,事件名稱輸入“helloworld”,測試事件修改為如下所示,完成后單擊“創建”。
{
"body": "{\"message\": \"helloworld\"}",
"requestContext": {
"requestId": "11cdcdcf33949dc6d722640a13091c77",
"stage": "RELEASE"
},
"queryStringParameters": {
"responseType": "html"
},
"httpMethod": "POST",
"pathParameters": {},
"headers": {
"Content-Type": "application/json"
},
"path": "/helloworld",
"isBase64Encoded": false
}
步驟七:查看執行結果
單擊helloworld事件的“測試”,執行后,在右側查看執行結果,執行結果如下圖。
執行結果

- “函數返回”顯示函數的返回結果。
- “日志”部分顯示函數執行過程中生成的日志。
- “執行摘要”部分顯示“日志”中的關鍵信息。
步驟八:查看監控指標
在函數詳情頁面,選擇“監控”頁簽。
- 在“監控”頁簽,先選擇“指標”,再選擇時間粒度(5分鐘、15分鐘、1小時),查看函數運行狀態。
- 可以查看的指標有:調用次數、錯誤次數、運行時間(包括最大運行時間、最小運行時間、平均運行時間)、被拒絕次數。
步驟九:刪除函數
- 在函數詳情頁面,單擊右上角的“操作 > 刪除函數”。
- 在確認框繼續單擊“確認”,及時釋放資源。