筆記:以指令部屬Azure function函數應用程式

Deploy Azure function by azure cli on Ubuntu 20.04

不知道為什麼,我的Azure帳號只要不是手動指令部屬它都會失敗。Portal和VSCode外掛跟都是一樣會失敗,錯誤訊息因為沒接觸過,所以也不好理解。

部屬流程整理如下

  1. Ubuntu安裝Azure CLI
    官方文件 https://docs.microsoft.com/zh-tw/cli/azure/install-azure-cli
    不要使用apt安裝,套件太舊。我用一鍵安裝完成
    curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
    確認版本
    az --version
  2. 登入Azure帳號
    az login
    它會開啟瀏覽器登入。只是我瀏覽器登入後,回到command line它顯示一些錯誤導致我無法用後續的功能。

    所以只好改用--user-devie-code來手動開瀏覽器登入
    az login --use-device-code
  3. 手動建立Azure function函數應用程式需要的資源
    這個步驟是因為

    3.1 建立資源群組 resource group
    az group create --name miroazrg --location southeastasia

    name只能小寫;區域這裡是設在東南亞

    3.2 建立儲存體帳號 storage account
    az storage account create --resource-group miroazrg --name miroazstore
    name只能小寫
  4. 建立函數應用程式Azure function
    az functionapp create --name myFunctionProj  --resource-group miroazrg  --consumption-plan-location southeastasia --runtime node  --runtime-version 16 --functions-version 4 --storage-account miroazstore
    要用node 16版就需要使用v4才支援
  5. 安裝Azure Functions Core Tools
    官方文件 https://docs.microsoft.com/zh-tw/azure/azure-functions/functions-run-local?tabs=v4%2Clinux%2Ccsharp%2Cportal%2Cbash
    依照文件指令安裝套件:
    curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
    sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg

    sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-$(lsb_release -cs)-prod $(lsb_release -cs) main" > /etc/apt/sources.list.d/dotnetdev.list'

    sudo apt-get update

    sudo apt-get install azure-functions-core-tools-4
    確認版本:
    func --version
  6. 建立函數應用程式Azure function專案
    func init MyFunctionProj
    進入MyFunctionProj目錄。
    使用範本處理
    func new --template "Http Trigger" --name MyHttpTrigger
    會再
    本機測試:
    func start
    非常神奇,我本機測試也有問題,沒顯示本機測試用URL。訊息只有...
    Azure Functions Core Tools
    Core Tools Version:       4.0.3971 Commit hash: d0775d487c93ebd49e9c1166d5c3c01f3c76eaaf  (64-bit)
    Function Runtime Version: 4.0.1.16815

    [2022-03-10T09:48:52.992Z] No job functions found. Try making your job classes and methods public. If you're using binding extensions (e.g. Azure Storage, ServiceBus, Timers, etc.) make sure you've called the registration method for the extension(s) in your startup code (e.g. builder.AddAzureStorage(), builder.AddServiceBus(), builder.AddTimers(), etc.).

    For detailed output, run func with --verbose flag.
    [2022-03-10T09:48:57.965Z] Host lock lease acquired by instance ID '000000000000000000000000BCD119C1'.

    不過我安裝VSCode的Azure function外掛,之後再用這指令就又可以用了,著實無言...

  7. 部屬專案
    func azure functionapp publish myFunctionProj

參考: https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local?tabs=v4%2Clinux%2Cnode%2Cazurecli%2Cbash

其他議題

  1. 讓任何人都可以存取這個函數應用程式
    可以在function.json中將bindings.authLevel設定為"anonymous"
  2. 只允許post不允許get
    可以在function.json中將bindings.methods拿掉get
  3. 本機開發設定CORS
    local.settings.json 加入Host
    "Host": {
       "CORS": "*",
       "CORSCredentials": false
    }
  4. 遠端完全開放存取
    參考: https://docs.microsoft.com/en-us/azure/azure-functions/functions-how-to-use-azure-function-app-settings?tabs=portal#cors
    偷懶的設定方法:
    az functionapp cors add --name myFunctionProj --resource-group miroazrg --allowed-origins '*'


留言