[Azure] 使用 Azure Functions 來重新啟動 Azure Web App

Azure Function 真的太好用了,以往 Web Job 能做的事都可以交給它來做,包含日常的維護,本文的重新啟動 Azure Web App 就是個例子。

這篇是我看到 【Azure】Web App 固定時間重新啟動 這篇的內容,除了驗證文章內的內容是哪裡有問題外,也順便測試了一下 Azure Functions 的 PowerShell,看起來一點問題也沒有。

Azure Functions 除了一般的 C#, node.js 外,還可以執行其他程式語言寫的程式,目前包含了像 Bash (Linux 的 Shell), Batch (批次檔), C#, JavaScript (node.js), PHP, Python 以及 F# 都能在 Azure Functions 上使用,本文是以 PowerShell 下重新啟動 Web App 的指令做的示範。

若要重新啟動 Azure Web App,首先要先取得 Azure Web App 的管理存取權,這點可以用 Login-AzureRmAccount 指令實作,不過它預設是採使用者互動的方式,也就是它會跳出對話盒要求使用者登入,若要在背景程式上做,那麼一定要用變數方式處理,這點也不用太擔心,因為 Login-AzureRmAccount 也可以用參數方式登入,不過密碼必須要是 Secure String,因此自動登入可以寫成下列指令:

$username = "your-azure-login-name"
$password = ConvertTo-SecureString "your-azure-login-password" -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username, $password
Login-AzureRmAccount -Credential $cred

取得了 Azure 登入狀態之後,就可以使用 Restart-AzureRmWebApp 來重啟 Web App 了。

Restart-AzureRmWebApp -Name $webappName -ResourceGroupName $resourceGroupName

當然,你也可以使用 Stop-AzureRmWebApp Start-AzureRmWebApp 來做到重啟的工作。

指令很簡單,再來就是把它搬到 Azure Functions 上,這次我使用的是定時的函數,並且將它設定為每天一次:

然後在函數本體中輸入下列指令:

$resourceGroupName = "your-azure-web-app-resource-group-name"
$webappName = "your-azure-web-app-name"
$username = "your-azure-login-name"
$password = ConvertTo-SecureString "your-azure-login-password" -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username, $password

Write-Output "Login to azure environment"

Login-AzureRmAccount -Credential $cred

Write-Output "Restarting Web App..."

Restart-AzureRmWebApp -Name $webappName -ResourceGroupName $resourceGroupName

Write-Output "Operation Completed."

測試執行一下:

成功的執行了。

另外,來源的那篇文章提到了 Save-AzureRmContext Import-AzureRmContext,是分別用來匯出與匯入登入狀態旳指令,微軟的官方文件並沒有提到匯出的狀態的有效期限,不過我個人認為它不是永久的有效,應該和一般使用時的登入時效相同才是,故它並不適合用在背景處理程序中,還是使用 Login-AzureRmAccount 處理登入較佳。