流程
✅ 前置準備說明
✅ 開始熟悉開發用的 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 環境中
再至 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 等,像下面圖示
- 資料夾結構
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 選項
若要將函數新增至專案中,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 直接使用
Crtl + Shift + P
叫出 REST Book 功能列
👣Step1:Create a new bland New REST Book
👣Step2:Create Secret
佈署篇 — 發佈到 Azure
作為 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 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
檢視目前的工作區塊
要佈署 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 佈署程序的規則後,接下來開發上就會比較熟悉!