Azure Functions 命令
Azure Functions 实战:Core Tools 工作流、项目与函数创建、本地调试与部署、触发器配置。
学习目标
本文是「云计算」模块的第 49 篇,难度定位为入门。重点内容:Azure Functions 实战:Core Tools 工作流、项目与函数创建、本地调试与部署、触发器配置。
主要章节:
- 核心工具安装
- 项目创建
- 函数创建
- 本地运行
- 部署到 Azure
- 应用服务计划
- ……共 12 个章节
核心工具安装
基本写法:安装 Azure Functions Core Tools
npm install -g azure-functions-core-tools@<版本>
# 安装 Azure Functions Core Tools v4
npm install -g azure-functions-core-tools@4 --unsafe-perm true
基本写法:查看版本
func --version
# 查看 Core Tools 版本
func --version
基本写法:查看帮助
func --help
# 查看所有可用命令
func --help
基本写法:登录 Azure
az login
# 通过浏览器交互登录 Azure
az login
基本写法:设置默认订阅
az account set --subscription <订阅ID>
# 切换到指定订阅
az account set --subscription 00000000-0000-0000-0000-000000000000
项目创建
基本写法:创建项目
func init <项目名> [--worker-runtime <运行时>]
# 创建 Node.js v18 项目
func init my-functions --worker-runtime node --language javascript
基本写法:创建 Python 项目
func init <项目名> --worker-runtime python --model V2
# 创建 Python V2 编程模型项目
func init my-py-funcs --worker-runtime python --model V2
基本写法:创建 .NET 项目
func init <项目名> --worker-runtime dotnet
# 创建 .NET 隔离工作进程项目
func init my-dotnet-funcs --worker-runtime dotnet-isolated
基本写法:创建 Docker 项目
func init <项目名> --docker
# 创建带 Dockerfile 的项目
func init my-docker-funcs --worker-runtime node --docker
函数创建
基本写法:创建函数
func new --name <函数名> --template <模板>
# 创建 HTTP 触发函数
func new --name HttpExample --template "HTTP trigger"
基本写法:创建定时函数
func new --name <函数名> --template "Timer trigger"
# 创建定时触发函数
func new --name DailyJob --template "Timer trigger"
基本写法:创建队列触发函数
func new --name <函数名> --template "Azure Queue Storage trigger"
# 创建队列触发函数
func new --name QueueHandler --template "Azure Queue Storage trigger"
基本写法:创建 Cosmos DB 触发函数
func new --name <函数名> --template "Azure Cosmos DB trigger"
# 创建 Cosmos DB 变更触发函数
func new --name CosmosTrigger --template "Azure Cosmos DB trigger"
基本写法:查看可用模板
func templates list
# 列出所有可用函数模板
func templates list
本地运行
基本写法:本地运行项目
func start [--port <端口>]
# 在 7071 端口启动本地运行时
func start --port 7071
基本写法:指定运行时
func start --runtime <运行时>
# 强制使用 node 运行时启动
func start --runtime node
基本写法:使用本地设置文件
func start --functions <函数名>
# 仅启动指定函数
func start --functions HttpExample
基本写法:连接本地存储模拟器
func start
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "node"
}
}
部署到 Azure
基本写法:部署函数应用
func azure functionapp publish <应用名>
# 部署到已有函数应用
func azure functionapp publish my-func-app
基本写法:发布并显示部署脚本
func azure functionapp publish <应用名> --publish-local-settings
# 同时部署本地设置
func azure functionapp publish my-func-app --publish-local-settings
基本写法:使用 zip 部署
az functionapp deployment source config-zip --name <应用名> --resource-group <组> --src <zip>
# 通过 zip 包部署
az functionapp deployment source config-zip \
--name my-func-app \
--resource-group my-rg \
--src deploy.zip
基本写法:从 Git 部署
az functionapp deployment source config --name <应用名> --resource-group <组> --repo-url <URL> --branch <分支>
# 从 GitHub 持续部署
az functionapp deployment source config \
--name my-func-app \
--resource-group my-rg \
--repo-url https://github.com/myorg/myrepo \
--branch main \
--manual-integration
基本写法:启用部署槽
az functionapp deployment slot create --name <应用名> --resource-group <组> --slot <槽名>
# 创建 staging 部署槽
az functionapp deployment slot create \
--name my-func-app \
--resource-group my-rg \
--slot staging
应用服务计划
基本写法:创建消费计划
az functionapp plan create --name <计划名> --resource-group <组> --location <区域> --sku <SKU>
# 创建消费计划(按需计费)
az functionapp plan create \
--name my-plan \
--resource-group my-rg \
--location eastus \
--sku Y1 \
--is-linux
基本写法:创建高级计划
az functionapp plan create --name <计划名> --sku EP1
# 创建 EP1 高级计划(预置实例)
az functionapp plan create \
--name my-premium-plan \
--resource-group my-rg \
--location eastus \
--sku EP1 \
--is-linux
基本写法:创建函数应用
az functionapp create --name <应用名> --storage-account <存储> --plan <计划> --resource-group <组> --runtime <运行时>
# 创建 Node.js 函数应用
az functionapp create \
--name my-func-app \
--storage-account mystorage123 \
--plan my-plan \
--resource-group my-rg \
--runtime node \
--runtime-version 20 \
--functions-version 4
基本写法:查看函数应用
az functionapp list --resource-group <组>
# 列出资源组下所有函数应用
az functionapp list --resource-group my-rg --output table
基本写法:删除函数应用
az functionapp delete --name <应用名> --resource-group <组>
# 删除函数应用
az functionapp delete --name my-func-app --resource-group my-rg
配置与连接
基本写法:设置应用设置
az functionapp config appsettings set --name <应用名> --resource-group <组> --settings <键=值>
# 设置数据库连接字符串
az functionapp config appsettings set \
--name my-func-app \
--resource-group my-rg \
--settings DB_CONNECTION="Server=...;Database=..."
基本写法:查看应用设置
az functionapp config appsettings list --name <应用名> --resource-group <组>
# 列出所有应用设置
az functionapp config appsettings list \
--name my-func-app \
--resource-group my-rg
基本写法:删除应用设置
az functionapp config appsettings delete --name <应用名> --resource-group <组> --setting-names <键>
# 删除指定配置项
az functionapp config appsettings delete \
--name my-func-app \
--resource-group my-rg \
--setting-names OLD_KEY
基本写法:绑定存储账户
az functionapp config appsettings set --name <应用名> --settings AzureWebJobsStorage=<连接串>
# 设置运行时所需的存储连接
az functionapp config appsettings set \
--name my-func-app \
--resource-group my-rg \
--settings AzureWebJobsStorage="DefaultEndpointsProtocol=https;AccountName=..."
触发器与绑定配置
基本写法:HTTP 触发器配置
{
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": ["get", "post"]
},
{
"type": "http",
"direction": "out",
"name": "res"
}
]
}
基本写法:定时触发器配置
{
"bindings": [
{
"type": "timerTrigger",
"direction": "in",
"name": "myTimer",
"schedule": "0 0 * * * *"
}
]
}
基本写法:队列输出绑定
{
"bindings": [
{
"type": "queue",
"direction": "out",
"name": "outputQueueItem",
"queueName": "myqueue",
"connection": "AzureWebJobsStorage"
}
]
}
基本写法:Python V2 模型触发器
# Python V2 编程模型的装饰器触发器
import azure.functions as func
import logging
app = func.FunctionApp()
@app.route(route="hello")
def hello(req: func.HttpRequest) -> func.HttpResponse:
return func.HttpResponse("Hello, World!")
监控与诊断
基本写法:查看函数日志
az functionapp log tail --name <应用名> --resource-group <组>
# 实时查看应用日志流
az functionapp log tail \
--name my-func-app \
--resource-group my-rg
基本写法:启用 Application Insights
az monitor app-insights component create --app <名称> --location <区域> --resource-group <组>
# 创建 Application Insights 资源
az monitor app-insights component create \
--app my-ai \
--location eastus \
--resource-group my-rg
基本写法:关联 Application Insights
az functionapp config appsettings set --name <应用名> --settings APPINSIGHTS_INSTRUMENTATIONKEY=<键>
# 将 Application Insights 连接到函数应用
az functionapp config appsettings set \
--name my-func-app \
--resource-group my-rg \
--settings APPINSIGHTS_INSTRUMENTATIONKEY=00000000-0000-0000-0000-000000000000
基本写法:执行函数
az functionapp function invoke --name <应用名> --resource-group <组> --function-name <函数>
# 通过 Azure CLI 远程调用函数
az functionapp function invoke \
--name my-func-app \
--resource-group my-rg \
--function-name HttpExample
持久化函数
基本写法:安装 Durable Functions 扩展
func extensions install --package Microsoft.Azure.WebJobs.Extensions.DurableTask --version <版本>
# 安装 Durable Functions 扩展
func extensions install \
--package Microsoft.Azure.WebJobs.Extensions.DurableTask \
--version 2.13.0
基本写法:存储提供者配置
{
"extensions": {
"durableTask": {
"storageProvider": {
"type": "AzureStorage",
"connectionStringName": "AzureWebJobsStorage"
},
"hubName": "MyTaskHub"
}
}
}
基本写法:Netherite 存储提供者
{
"extensions": {
"durableTask": {
"storageProvider": {
"type": "Netherite",
"storageConnectionName": "AzureWebJobsStorage",
"eventHubName": "durable-event-hub"
}
}
}
}
部署槽与 CI/CD
基本写法:交换部署槽
az functionapp deployment slot swap --name <应用名> --resource-group <组> --slot <槽名> --target-slot production
# 将 staging 槽交换到生产
az functionapp deployment slot swap \
--name my-func-app \
--resource-group my-rg \
--slot staging \
--target-slot production
基本写法:列出部署槽
az functionapp deployment slot list --name <应用名> --resource-group <组>
# 查看应用所有部署槽
az functionapp deployment slot list \
--name my-func-app \
--resource-group my-rg
基本写法:删除部署槽
az functionapp deployment slot delete --name <应用名> --resource-group <组> --slot <槽名>
# 删除指定部署槽
az functionapp deployment slot delete \
--name my-func-app \
--resource-group my-rg \
--slot staging
基本写法:配置 GitHub Actions 部署
az functionapp deployment github-actions add --repo <仓库> --resource-group <组> --name <应用名> --branch <分支>
# 为函数应用配置 GitHub Actions CI
az functionapp deployment github-actions add \
--repo myorg/myrepo \
--resource-group my-rg \
--name my-func-app \
--branch main
密钥管理
基本写法:列出函数密钥
az functionapp function keys list --name <应用名> --resource-group <组> --function-name <函数>
# 查看 HttpExample 函数的密钥
az functionapp function keys list \
--name my-func-app \
--resource-group my-rg \
--function-name HttpExample
基本写法:设置函数密钥
az functionapp function keys set --name <应用名> --resource-group <组> --function-name <函数> --key-name <键名> --key-value <值>
# 设置自定义函数密钥
az functionapp function keys set \
--name my-func-app \
--resource-group my-rg \
--function-name HttpExample \
--key-name MyKey \
--key-value MySecretValue123
基本写法:设置主机密钥
az functionapp keys set --name <应用名> --resource-group <组> --key-name <键名> --key-value <值> --key-type masterKey
# 设置主机密钥(所有函数共用)
az functionapp keys set \
--name my-func-app \
--resource-group my-rg \
--key-name MyHostKey \
--key-value MyHostKeyValue123 \
--key-type masterKey
基本写法:使用函数密钥调用
# 通过 URL 查询参数传递密钥调用 HTTP 函数
curl "https://my-func-app.azurewebsites.net/api/HttpExample?code=MySecretValue123"