當Function Compute平台的內建運行時無法滿足您的業務需求時,可以選擇自訂鏡像函數。本文介紹如何在Function Compute控制台或使用Serverless Devs工具建立自訂鏡像函數。
注意事項
在Function Compute中,建立自訂鏡像函數必須使用同一帳號下相同地區內阿里雲鏡像服務倉庫中的鏡像。針對搭載Apple晶片的Mac電腦(或其他ARM架構的機器),構建鏡像時需要指定鏡像的編譯平台為Linux/Amd64,樣本命令如
docker build --platform linux/amd64 -t $IMAGE_NAME .
。Function Compute在解析ACR企業版鏡像網域名稱時,使用鏡像倉庫執行個體配置的專用網路預設解析或雲解析PrivateZone自動解析的訪問IP地址。具體情境如下:
情境一:如果ACR企業版執行個體的存取控制頁面的訪問 IP中不存在預設解析標識時,該列表下的所有IP地址均為雲解析PrivateZone自動解析的IP地址,任意一個VPC配置均可使用。
情境二:如果ACR企業版執行個體的存取控制頁面的訪問 IP中存在預設解析標識的IP地址為專用網路預設解析的IP地址,以下圖為例,只能選擇第一個VPC。
使用企業版執行個體時只能選擇非加速鏡像,並且每次更新函數的鏡像配置時,都會基於最新選擇的原始鏡像產生最新的加速鏡像(如果加速鏡像已存在會覆蓋產生)。請不要刪除原始鏡像以及加速鏡像,否則會影響函數調用。
請確保您在函數配置中的鏡像在發生任何變化後,及時更新您的函數,否則函數調用會失敗。
請確保原始鏡像存在,否則函數會進入Failed狀態,並且無法調用。Function Compute雖然對您的函數做了緩衝以加速冷啟動速度,但是在調用過程中依然依賴您的原始鏡像的存在。
請確保您在任何函數中使用的鏡像不要被覆蓋,如果被覆蓋為其他的Digest,請及時使用最新的鏡像資訊重新部署您的函數。Function Compute會同時記錄您在建立和更新配置時所選擇的鏡像版本Tag和Digest,如果您的鏡像版本在別的地方被更新為其他的Digest,函數將調用失敗。
前提條件
Container Registry
- 說明
容器鏡像個人版ACR面向個人開發人員,公測限額免費試用,無SLA承諾和受損賠償,且有使用限制。關於使用限制說明,請參見建立個人版執行個體注意事項。
Serverless Devs(僅選擇使用Serverless Devs建立函數時需要)
- 說明
需安裝19.03及以上版本的Docker。
在控制台建立函數
登入Function Compute控制台,在左側導覽列,單擊函數。
在頂部功能表列,選擇地區,然後在函數頁面,單擊建立函數。
在建立函數頁面,選擇建立函數的方式,按需設定以下配置項,然後單擊建立。
基本設定:設定函數名稱。
函數代碼:配置建立函數的鏡像。
配置項
說明
運行環境
使用樣本鏡像:選擇Function Compute提供的樣本鏡像,快速體驗部署鏡像函數。您需要從配置項容器鏡像下方鏡像列表中選擇目標鏡像。
使用 ACR 中的鏡像:選擇ACR中的鏡像建立函數時,需單擊配置項容器鏡像下方的選擇 ACR 中的鏡像,在彈出的選擇容器鏡像面板,選擇已建立的容器鏡像執行個體和ACR 鏡像倉庫,然後在下方鏡像版本列表找到目標鏡像並單擊其右側操作列的選擇。
說明不支援使用跨賬戶ACR中的公開鏡像建立函數。
請確保您在函數配置中的鏡像在發生任何變化後,及時更新您的函數,否則函數調用會失敗。具體請參見注意事項。
使用企業版執行個體時,只能選擇非加速鏡像,請不要刪除原始鏡像以及加速鏡像,否則會影響函數調用。具體請參見注意事項。
使用企業版執行個體時,不支援自訂網域名格式的鏡像地址。
不支援使用ACR企業版(標準版和進階版)執行個體中開啟僅索引模式鏡像加速的倉庫中的鏡像建立函數。
自ACR新增僅索引模式功能起,企業版(基礎版)執行個體中建立的開啟鏡像加速開關的鏡像倉庫中的鏡像不支援用來建立函數,存量企業版(基礎版)執行個體中存量鏡像加速倉庫中的鏡像仍然支援用來建立函數。關於僅索引模式,請參見按需載入容器鏡像。
啟動命令
容器的啟動命令。如果不填寫,則預設使用鏡像中的Entrypoint或者CMD。
監聽連接埠
容器鏡像中的HTTP Server所監聽的連接埠。預設連接埠為9000。
進階配置:配置函數的執行個體相關資訊、執行逾時時間和網路設定等。
配置項
說明
是否使用GPU
根據您的業務情況,選擇是否使用GPU執行個體。預設使用CPU執行個體,不使用GPU執行個體。更多資訊,請參見執行個體類型及使用模式。關於各種執行個體類型的計費詳情,請參見計費概述。
使用GPU
不使用GPU
說明僅當您選擇建立事件函數、Web函數和任務函數時,需要設定此配置項。
GPU 卡型
選擇GPU卡型,關於GPU卡型介紹,請參見執行個體類型及使用模式。
規格方案
選擇使用GPU
根據您的業務情況,選擇合理的GPU規格。Function Compute將根據您選擇的GPU規格自動選定vCPU規格和記憶體規格,不支援靈活配比。
選擇不使用GPU
根據您的業務情況,選擇或手動輸入合理的vCPU規格和記憶體規格組合。
關於各資源使用的計費詳情,請參見計費概述。
說明vCPU大小(單位為核)與記憶體大小(單位為GB)的比例必須設定在1∶1到1∶4之間。
臨時硬碟大小
根據您的業務情況,選擇硬碟大小。Function Compute為您提供512 MB以內的磁碟免費使用額度。更多資訊,請參見計費概述。
執行逾時時間
設定逾時時間。預設為60秒,最長為86400秒,推薦您設定為600秒。
說明超過設定的逾時時間,函數將以執行失敗結束。如需更長的逾時時間限制,請加入DingTalk使用者群(DingTalk群號64970014484)申請。
單一實例並發度
設定函數執行個體的並發度。具體資訊,請參見設定執行個體並發度。
時區
選擇函數的時區。此處設定函數的時區後,將自動為函數添加一條環境變數TZ,其值為您設定的目標時區。
函數角色
如果您的代碼邏輯需訪問其他雲端服務,請建立角色並為角色最小化授予訪問其他雲端服務的許可權。更多資訊,請參見授予Function Compute訪問其他雲端服務的許可權。
允許訪問 VPC
是否允許函數訪問VPC內資源。更多資訊,請參見配置網路。
專用網路
允許訪問 VPC選擇是時必填。建立新的VPC或在下拉式清單中選擇要訪問的VPC ID。
交換器
允許訪問 VPC選擇是時必填。建立新的交換器或在下拉式清單中選擇交換器ID。
安全性群組
允許訪問 VPC選擇是時必填。建立新的安全性群組或在下拉式清單中選擇安全性群組。
允許函數預設網卡訪問公網
是否允許函數可以通過預設網卡訪問公網。關閉後,當前函數將無法通過Function Compute的預設網卡訪問公網。
重要使用固定公網IP地址功能時,您必須關閉允許函數預設網卡訪問公網,否則配置的固定公網IP地址不生效。更多資訊,請參見配置固定公網IP地址。
日誌功能
是否啟用日誌功能,取值說明如下:
啟用:啟用後,您可以查看函數的調用日誌,函數的調用日誌將通過Log Service儲存和查詢。
禁用:不啟用日誌功能。
環境變數:設定函數運行環境中的環境變數。更多資訊,請參見配置環境變數。
建立完成後,您可以在函數列表中查看和更新已建立的函數。
更新函數時,只能變更已設定的監聽連接埠,不能刪除或添加額外的監聽連接埠。如果建立函數時,配置了監聽連接埠,更新該函數時,不指定監聽連接埠,將保留建立函數時的監聽連接埠。
使用Serverless Devs建立函數
使用Serverless Devs可以一鍵構建、推送容器鏡像並部署函數。
執行以下命令,初始化專案。
sudo s init
根據介面提示,依次選擇阿里雲帳號、自訂鏡像模板和具體的語言(本文以Node.js為例),設定工程名稱、選擇專案部署地區並輸入您的ACR鏡像等。
執行以下命令,進入專案目錄。
cd start-fc3-custom-container-nodejs
編輯
s.yaml
檔案。關於YAML檔案的參數解釋,請參見YAML規範。樣本如下。
樣本中
image
為您的ACR鏡像,需要分別將<your namespace>、<your image>和<your tag>替換為實際的命名空間名稱、鏡像倉庫名稱和鏡像版本。如果您在步驟1初始化專案時已填入正確的ACR鏡像,此處無需修改。edition: 3.0.0 name: hello-world-app # access 是當前應用所需要的密鑰資訊配置: # 密鑰配置可以參考:https://www.serverless-devs.com/serverless-devs/command/config # 密鑰使用順序可以參考:https://www.serverless-devs.com/serverless-devs/tool#密鑰使用順序與規範 access: "default" vars: # 全域變數 region: "cn-hangzhou" resources: hello_world: # 如果只想針對 hello_world 下面的業務進行相關操作,可以在命令列中加上 hello_world,例如: # 只對 hello_world 進行構建:s hello_world build # 如果不帶有 hello_world ,而是直接執行 s build,工具則會對當前Yaml下,所有和 hello_world 平級的業務模組(如有其他平級的模組,例如下面注釋的next_function),按照一定順序進行 build 操作 component: fc3 # 組件名稱 actions: # 自訂執行邏輯 pre-deploy: # 在deploy之前運行 - component: fc3 build --dockerfile ./code/Dockerfile # 要啟動並執行組件,格式為“component: 組件名 命令 參數” props: region: ${vars.region} # 關於變數的使用方法,可以參考:https://docs.serverless-devs.com/serverless-devs/yaml#%E5%8F%98%E9%87%8F%E8%B5%8B%E5%80%BC functionName: "start-nodejs-ufrz" runtime: "custom-container" description: 'hello world by serverless devs' timeout: 30 memorySize: 512 cpu: 0.5 diskSize: 512 code: ./code customContainerConfig: image: 'registry.${vars.region}.aliyuncs.com/<your namespace>/<your image>:<your tag>' # 您的ACR鏡像,需要分別將<your namespace>、<your image>和<your tag>替換為實際的命名空間名稱、鏡像倉庫名稱和鏡像版本 # triggers: # - triggerName: httpTrigger # 觸發器名稱 # triggerType: http # 觸發器類型 # description: 'xxxx' # qualifier: LATEST # 觸發服務的版本 # triggerConfig: # authType: anonymous # 鑒權類型,可選值:anonymous、function # disableURLInternet: false # 是否禁用公網存取 URL # methods: # HTTP 觸發器支援的存取方法,可選值:GET、POST、PUT、DELETE、HEAD # - GET # - POST
執行以下命令,部署專案。
sudo s deploy
輸出樣本:
Steps for [deploy] of [hello-world-app] ==================== DEPRECATED: The legacy builder is deprecated and will be removed in a future release. BuildKit is currently disabled; enable it by removing the DOCKER_BUILDKIT=0 environment-variable. Sending build context to Docker daemon 5.12kB Step 1/7 : FROM node:14-buster 14-buster: Pulling from library/node 2ff1d7c41c74: Already exists b253aeafeaa7: Already exists 3d2201bd995c: Already exists 1de76e268b10: Already exists d9a8df589451: Already exists 6f51ee005dea: Already exists 5f32ed3c3f27: Already exists 0c8cc2f24a4d: Already exists 0d27a8e86132: Already exists Digest: sha256:a158d3b9b4e3fa813fa6c8c590b8f0a860e015ad4e59bbce5744d2f6fd8461aa Status: Downloaded newer image for node:14-buster ---> 1d12470fa662 Step 2/7 : WORKDIR /usr/src/ ---> Running in 70a8e2e4d1ea Removing intermediate container 70a8e2e4d1ea ---> 0d67b8fa2901 Step 3/7 : COPY package*.json ./ ---> 09eb15f8770a Step 4/7 : RUN npm install ---> Running in 8ae492be973b Step 5/7 : COPY . . ---> 7560c7b14431 Step 6/7 : EXPOSE 9000 ---> Running in 66b38e54ced0 Removing intermediate container 66b38e54ced0 ---> f73cce48d2ae Step 7/7 : ENTRYPOINT [ "node", "server.js" ] ---> Running in 2fb2f83fd6c0 Removing intermediate container 2fb2f83fd6c0 ---> fe51ae71448c Successfully built fe51ae71448c Successfully tagged registry.cn-hangzhou.aliyuncs.com/z****/z****:latest [2024-01-29 16:33:06][INFO][hello_world] get instanceName= and region=cn-hangzhou from registry.cn-hangzhou.aliyuncs.com/z****/z**** [2024-01-29 16:33:06][INFO][hello_world] try to docker push registry.cn-hangzhou.aliyuncs.com/z****/z**** ... WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded Using default tag: latest The push refers to repository [registry.cn-hangzhou.aliyuncs.com/z****/z****] 85c1ec915b45: Pushed 37c36543a431: Pushed e4afd7f70434: Pushed 0d5f5a015e5d: Layer already exists 3c777d951de2: Layer already exists f8a91dd5fc84: Layer already exists cb81227abde5: Layer already exists e01a454893a9: Layer already exists c45660adde37: Layer already exists fe0fb3ab4a0f: Layer already exists f1186e5061f2: Layer already exists b2dba7477754: Layer already exists latest: digest: sha256:6bf1ed4119d197a46c99082577632957056cb625f2ee0276d2af53f60d22837d size: 2841 [hello_world] completed (688.45s) Result for [deploy] of [hello-world-app] ==================== region: cn-hangzhou cpu: 0.5 customContainerConfig: image: registry.cn-hangzhou.aliyuncs.com/z****/z**** resolvedImageUri: registry.cn-hangzhou.aliyuncs.com/z****/z****@sha256:6bf1ed4119d197a46c99082577632957056cb625f2ee0276d2af53f60d22837d description: hello world by serverless devs diskSize: 512 functionName: start-nodejs-ufrz handler: handler instanceConcurrency: 1 internetAccess: true lastUpdateStatus: Successful memorySize: 512 role: runtime: custom-container state: Active timeout: 30 A complete log of this run can be found in: /root/.s/logs/0129162246
執行以下命令,調試函數。
sudo s invoke -e "{\"key\":\"val\"}"
輸出樣本:
Steps for [invoke] of [hello-world-app] ==================== ========= FC invoke Logs begin ========= FC Invoke Start RequestId: 1-65b764db-15eb737f-0c67ab5cd968 FC Invoke Start RequestId: 1-65b764db-15eb737f-0c67ab5cd968 hello world! FC Invoke End RequestId: 1-65b764db-15eb737f-0c67ab5cd968 Duration: 42.27 ms, Billed Duration: 43 ms, Memory Size: 512 MB, Max Memory Used: 47.77 MB ========= FC invoke Logs end ========= Invoke instanceId: c-65b764db-15fa2aa8-bc50f7839399 Code Checksum: undefined Qualifier: LATEST RequestId: 1-65b764db-15eb737f-0c67ab5cd968 Invoke Result: OK [hello_world] completed (4.96s) A complete log of this run can be found in: /root/.s/logs/0129164202
相關文檔
使用自訂鏡像函數,容器鏡像依賴的基礎環境會帶來額外的資料下載和解壓的時間,為了降低冷啟動時間,請參見Function Compute冷啟動最佳化最佳實務。
您也可以調用API來建立函數,更多資訊,請參見CreateFunction - 建立函數。
關於Function Compute提供的內建運行時、自訂運行時和自訂鏡像運行時適用情境及差異,請參見函數運行時選型。