通过Runbook启停Azure Function App执行PowerShell脚本报错求助
Azure Function App 计划启停的PowerShell Runbook实现
直接用单条Update-AzFunctionAppSetting命令没法直接搞定,因为自动化账户的Runbook得先连上Azure订阅才行,不然命令找不到你的Function App,就会抛出那个“空值表达式”的错误。
错误根源
你碰到的You cannot call a method on a null-valued expression错误,本质是Runbook执行时没成功登录Azure,导致命令定位不到目标资源。
正确实现流程
1. 先完成Azure身份验证
Runbook里必须先加一段登录Azure的代码,用自动化账户自带的服务主体身份验证:
# 调用自动化账户的Azure连接资产(默认名称是AzureRunAsConnection) $connectionName = "AzureRunAsConnection" try { $servicePrincipalConn = Get-AutomationConnection -Name $connectionName Connect-AzAccount ` -ServicePrincipal ` -TenantId $servicePrincipalConn.TenantId ` -ApplicationId $servicePrincipalConn.ApplicationId ` -CertificateThumbprint $servicePrincipalConn.CertificateThumbprint } catch { if (!$servicePrincipalConn) { throw "找不到连接资产 $connectionName,请检查自动化账户配置" } else { throw $_.Exception } }
2. 用命令设置单个函数启停
验证通过后,再执行修改应用设置的命令,建议把Function App名、资源组名设成变量(或者Runbook参数),方便后续修改:
# 定义变量 $funcAppName = "MyFUNCTION_APP_NAME" $rgName = "MyRESOURCE_GROUP_NAME" $targetFuncName = "MyFunctionName" # 禁用指定函数 Update-AzFunctionAppSetting -Name $funcAppName -ResourceGroupName $rgName -AppSetting @{"AzureWebJobs.$targetFuncName.Disabled" = "true"} # 要启用的话,把值改成"false"就行 # Update-AzFunctionAppSetting -Name $funcAppName -ResourceGroupName $rgName -AppSetting @{"AzureWebJobs.$targetFuncName.Disabled" = "false"}
3. 额外:启停整个Function App(不是单个函数)
如果你要控制的是整个Function App服务,而不是单个函数,用Start-AzFunctionApp和Stop-AzFunctionApp更直接:
# 停止整个Function App Stop-AzFunctionApp -Name $funcAppName -ResourceGroupName $rgName # 启动整个Function App Start-AzFunctionApp -Name $funcAppName -ResourceGroupName $rgName
注意点
- 得确保自动化账户的服务主体有Function App所在资源组的Contributor权限,不然会提示权限不够。
- 检查Runbook用的Az模块版本,尽量用新一点的版本(可以在自动化账户的“模块”页面查看和更新)。
内容的提问来源于stack exchange,提问作者zeeka
相关产品推荐
相关产品推荐

