【Tutorial】Azure 新手村 — Azure Function init() | for Develpoer

Step-by-Step Tutorial for Azure Functions Beginners

Kellen
15 min readMar 16, 2024

Azure Functions 是事件驅動的 serverless 計算平台,可協助程式設計語言更有效率地進行開發。本篇主要說明使用 vsCode 進行 Azure Function 開發到佈署上線的整個流程,及提供一些週邊實用工具供第一次要上手 Azure 的開發者參考。

流程

✅ 前置準備說明
✅ 開始熟悉開發用的 Azure 工具
🔸初始化設定
🔸資料夾結構設計
✅ 啟動 Function運行
🔸 測試本地函數
✅ 佈署篇 — 發佈到 Azure
🔸 Create Function App
🔸 Deploy Function App

開發篇

前置準備說明(Linux — Ubuntu)

安裝 Azure Functions 核心工具,個人是使用 Visual Studio Code 進行開發,推薦先把 Azure Functions Core Tools 裝好,可以讓你在本機上開發和測試函數,還可以使用核心工具將程式碼專案部署到 Azure。
1️⃣ 安裝 Microsoft 軟體包儲存庫 GPG 金鑰,以驗證軟體包完整性

curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg

2️⃣ 在執行 APT 更新之前設定 APT 來源清單

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'

3️⃣ 確認 /etc/apt/sources.list.d/dotnetdev.list,要有 Linux 版本字串

4️⃣ Start the APT source update and Install the Core Tools package

sudo apt-get update

sudo apt-get install azure-functions-core-tools-4

建立開發用的 MyProjFolder 資料夾,並先建立 Python 虛擬環境,主要考量不同的 Function 對於 Python 的依賴各自不同,因此建議從虛擬環境這邊處理掉套件議題

# 選擇要建立虛擬環境的目錄,這將建立一個 .venv 的虛擬環境
/MyProjFolder (main) $ python3 -m venv .venv

# 啟動虛擬環境,之後虛擬環境啟動後,可以使用 'pip' 來安裝依賴項了
/MyProjFolder (main) $ source /MyProjFolder/.venv/bin/activate

# 之後會發現前面多了你建立的虛擬環境(.venv),接續都在這邊開發與處理套件依賴項吧
(.venv) /MyProjFolder (main) $

# 如果 Function 開發差不多,記得使用以下退出虛擬環境
deactivate

# 將關閉虛擬環境並回到全域 Python 環境中
或覺得 activate 麻煩可以 Shift + Ctrl + P: Select Interpreter 後選擇環境別

再至 Marketplace 安裝必要檔案

開始熟悉開發用的 Azure 工具

  • Function 版本選定:v2
  • func:工具說明
  • func init初始化設定,並提供範例的 Python 可以從範本開始改起
# 基本款式,後面採用選項帶出(虛擬環境下)
(.venv) @KellenJohn ➜ /workspaces/Azure_Lab/coingecko (main) $ func init
# 參考
Select a number for worker runtime:
1. dotnet
2. dotnet (isolated process)
3. node
4. python
5. powershell
6. custom
Choose option: 4
python
Found Python version 3.10.13 (python3).
The new Python programming model is generally available. Learn more at https://aka.ms/pythonprogrammingmodel
Writing requirements.txt
Writing .funcignore
Writing function_app.py
Writing .gitignore
Writing host.json
Writing local.settings.json
Writing /workspaces/Azure_Lab/coingecko/.vscode/extensions.json


# 先把預設的 Azure Function 套件安裝一下
/MyProjFolder (main) $ pip install -r requirements.txt

# 帶參數版型也可以
func init MyProjFolder --worker-runtime python --model V2

當您在 func init 沒有下 --worker-runtime 選項的情況下執行時,系統會提示您選擇專案語言,之後會在資料夾引入 Azure Function 的組態檔、main.py 等,像下面圖示

開始製作 Function 所需的檔案
系統會自動 writing 很多捆綁檔案進來,包含一個 function_app.py
  • 資料夾結構

Python 的 Azure Function 專案資料夾結構看起來像下列範例:

# v2 的資料夾格式,v1 有不同的組態檔,此次選比較簡易及功能更彈性的 v2 開發 
<project_root>/
| - .venv/
| - .vscode/
| - function_app.py
| - additional_functions.py
| - tests/
| | - test_my_function.py
| - .funcignore
| - host.json
| - local.settings.json
| - requirements.txt
| - Dockerfile # 此次範例不會用到
  • 建立一個函數 func new未帶參數會引導 template(http 或其他數種 trigger) 與 Auth level 選項
先選擇 5 HTTP trigge 及 Anonymous auth level

若要將函數新增至專案中,func new 請使用選項執行命令 --template 來選擇觸發器範本。以下範例建立一個名為 的 HTTP 觸發器 MyHttpTrigger

func new --template "Http Trigger" --name MyHttpTrigger

然後這邊開始是 coding 的處理 🕔 ⏰,因為是測 end-to-end 所以直接使用預設 HelloWorld 範例程式碼帶過!

import azure.functions as func
import datetime
import json
import logging

app = func.FunctionApp()

@app.route="Investments", auth_level=func.AuthLevel.ANONYMOUS)
def Investments(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')

name = req.params.get('name')
if not name:
try:
req_body = req.get_json()
except ValueError:
pass
else:
name = req_body.get('name')

if name:
return func.HttpResponse(f"Hello, {name}. This HTTP triggered function executed successfully.")
else:
return func.HttpResponse(
"This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.",
status_code=200
)

啟動 Function 運行

在執行或偵錯專案內 Function 之前,需要從專案的根目錄啟動 Functions server。Server 可以為專案中的所有功能啟用觸發器,先切換 Function 所在的資料夾後,使用 func start 啟動本地運行即可

測試本地函數

Codespace 也可以測試

此次是使用 📚REST Book 測試,好處是 REST 呼叫並在vsCode 直接使用

REST Book is a Visual Studio Code extension that allows you to perform REST calls in a Notebook interface

Crtl + Shift + P 叫出 REST Book 功能列

👣Step1:Create a new bland New REST Book
👣Step2:Create Secret

以 Codespace 為例,要先拿到 token 否則會無法通過認證從而發生 401 異常
Codespace 記得帶 github token 否則會有 401 error
$SECRETS.github_token

佈署篇 — 發佈到 Azure

Deploy an API running on Azure Functions using IaC & Azure DevOps

作為 Azure 的小白,首先先推 az command line,與 GCP gcloud 一樣可以用作資源管理或創建,先 Install The Azure Command Line Interface (CLI)

👍👍👍
curl -L https://aka.ms/InstallAzureCli | bash

# 個人使用這個,忘了那邊有講到差異 @@~
curl -L https://aka.ms/InstallAzureCliDeb | sudo bash

# 登入,並建議開啟 2FA Login
az login

# 或這個也很方便
az login --use-device-code
會立即跳出登入畫面!

常用指令

az login
$ az account list --output table
Name CloudName SubscriptionId TenantId State IsDefault
-------------------------- ----------- -------------- --------- ------- ---------
Helleo World Subscriptions AzureCloud xxx xxxx Enabled True

$ az vm list --output table
Name ResourceGroup Location Zones
------------ ------------------- ---------- -------
swlab-demo THE-LEGEND-OF-ZELDA japaneast
swlab-lab-vm THE-LEGEND-OF-ZELDA japaneast

$ az vm list --resource-group The-Legend-of-Zelda --output table
Name ResourceGroup Location Zones
------------ ------------------- ---------- -------
swlab-demo The-Legend-of-Zelda japaneast
swlab-lab-vm The-Legend-of-Zelda japaneast

檢視目前的工作區塊

resource 與 terminal az login 是要分別登入喔

要佈署 Azure Function 有分不同的層級,此次先選擇 anonymous 快速作一個測試

切換到 Azure Function ⚡

Project / Function 我們在前面 init 已經使用 terminal 處理過,此次是要開始製作 Function App,這邊會有像是要綁在那個 Resource Group, Storage Account, Hosting Plan, … 等,大概就是一些設定檔的處理。接著會開始進行 Deploy to Function App 才是真正的佈署至 Azure 這邊

或是也可以在 Terminal 處理

az functionapp create --consumtpion-plan-location eastus \
--runtime python \
--runtime-version 3.10 \
--functions-version 4 \
--name function-name \
--os-type linux \
--resource-group resource-group-name \
--storage-account storage-account-name

# 簡寫方式
az functionapp create --consumption-plan-location eastus \
--runtime python \
--runtime-version 3.10 \
--functions-version 4 \
-n function-name \
--os-type linux \
-g resource-group-name \
-s storage-account-name


# Create 完接著 Deploy
func azure functionapp publish function-name

參閱 terminal docstring

檢查 Activity Log

❶ Activity Log 表示已經把設定檔進行處理完畢

❷ Activity Log 表示已完成佈署至 Azure 並會在 Resource 看到產生一個 Function HTTP 已成功完成此次端至端的佈署流程

URL 可至此查詢,若要客製化或是在疊加 Proxy 也是可以在另外處理!

驗證成功

花了一些時間把 Azure 工具都跑過一遍後,大概理解 Azure 佈署程序的規則後,接下來開發上就會比較熟悉!

--

--

Kellen

Backend(Python)/K8s and Container eco-system/Technical&Product Manager/host Developer Experience/早期投入資料創新與 ETL 工作,近期堆疊 Cloud☁️ 解決方案並記錄實作與一些雲端概念💡