全部產品
Search
文件中心

Function Compute:建立Custom Container函數

更新時間:Jul 06, 2024

當Function Compute平台的標準運行時無法滿足您的業務需求時,可以選擇自訂容器函數。本文介紹如何在Function Compute控制台或使用Serverless Devs工具建立Custom Container函數。

注意事項

  • 在Function Compute中,建立Custom Container函數必須使用相同地區內阿里雲鏡像服務倉庫中的鏡像。針對搭載Apple晶片的Mac電腦(或其他ARM架構的機器),構建鏡像時需要指定鏡像的編譯平台為Linux/Amd64,樣本命令如docker build --platform linux/amd64 -t $IMAGE_NAME .

  • Function Compute在解析ACR企業版鏡像網域名稱時,使用鏡像倉庫執行個體配置的專用網路預設解析或雲解析PrivateZone自動解析的訪問IP地址。具體情境如下:

    • 情境一:如果ACR企業版執行個體的存取控制頁面的訪問 IP中不存在預設解析標識時,該列表下的所有IP地址均為雲解析PrivateZone自動解析的IP地址,任意一個VPC配置均可使用。

      image

    • 情境二:如果ACR企業版執行個體的存取控制頁面的訪問 IP中存在預設解析標識的IP地址為專用網路預設解析的IP地址,以下圖為例,只能選擇第一個VPC。

      image

  • 使用企業版執行個體時只能選擇非加速鏡像,並且每次更新函數的鏡像配置時,都會基於最新選擇的原始鏡像產生最新的加速鏡像(如果加速鏡像已存在會覆蓋產生)。請不要刪除原始鏡像以及加速鏡像,否則會影響函數調用。

  • 請確保您在函數配置中的鏡像在發生任何變化後,及時更新您的函數,否則函數調用會失敗。

    • 請確保原始鏡像存在,否則函數會進入Failed狀態,並且無法調用。Function Compute雖然對您的函數做了緩衝以加速冷啟動速度,但是在調用過程中依然依賴您的原始鏡像的存在。

    • 請確保您在任何函數中使用的鏡像不要被覆蓋,如果被覆蓋為其他的Digest,請及時使用最新的鏡像資訊重新部署您的函數。Function Compute會同時記錄您在建立和更新配置時所選擇的鏡像版本Tag和Digest,如果您的鏡像版本在別的地方被更新為其他的Digest,函數將調用失敗。

前提條件

在控制台建立函數

  1. 登入Function Compute控制台,在左側導覽列,單擊函數

  2. 在頂部功能表列,選擇地區,然後在函數頁面,單擊建立函數

  3. 建立函數頁面,選擇使用容器鏡像方式,按需設定以下配置項,然後單擊建立

    • 基本設定:設定函數名稱。

    • 鏡像配置:配置建立函數的鏡像。

      配置項

      說明

      鏡像選擇方式

      您可以使用樣本鏡像或者您自己的鏡像建立函數。

      • 使用樣本鏡像:選擇Function Compute內建的樣本鏡像。

      • 使用 ACR 中的鏡像:單擊配置項容器鏡像下方的選擇 ACR 中的鏡像,在彈出的選擇容器鏡像面板,選擇已建立的容器鏡像執行個體ACR 鏡像倉庫,然後在下方選擇鏡像地區找到目標鏡像並在其右側操作列單擊選擇

        說明
        • 請確保您在函數配置中的鏡像在發生任何變化後,及時更新您的函數,否則函數調用會失敗。具體請參見注意事項

        • 使用企業版執行個體時只能選擇非加速鏡像,請不要刪除原始鏡像以及加速鏡像,否則會影響函數調用。具體請參見注意事項

      啟動命令

      容器的啟動命令。如果不填寫,則預設使用鏡像中的Entrypoint或者CMD。

      監聽連接埠

      容器鏡像中的HTTP Server所監聽的連接埠。預設連接埠為9000。

    • 進階配置:配置函數的執行個體相關資訊、執行逾時時間和網路設定等。

      配置項

      說明

      是否使用GPU

      根據您的業務情況,選擇是否使用GPU執行個體。預設使用彈性執行個體,不使用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可以一鍵構建、推送容器鏡像並部署函數。

  1. 執行以下命令,初始化專案。

    sudo s init

    根據介面提示,依次選擇阿里雲帳號、Custom Container模板和具體的語言(本文以Node.js為例),設定工程名稱、選擇專案部署地區並輸入您的ACR鏡像等。

    image

  2. 執行以下命令,進入專案目錄。

    cd start-fc3-custom-container-nodejs
  3. 編輯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
  4. 執行以下命令,部署專案。

    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
  5. 執行以下命令,調試函數。

    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

相關文檔

  • 如果您要使用GPU執行個體,則只能建立Custom Container函數。關於GPU執行個體規格的選擇,請參見建立Web函數

  • 使用Custom Container函數,容器鏡像依賴的基礎環境會帶來額外的資料下載和解壓的時間,為了降低冷啟動時間,請參見Function Compute冷啟動最佳化最佳實務

  • 您也可以調用API來建立函數,更多資訊,請參見CreateFunction - 建立函數

  • 關於Function Compute提供的內建運行時、自訂運行時和自訂容器運行時適用情境及差異,請參見函數運行時選型