[Azure][Automation]透過 Azure Automation 將 Azure SQL Database 資料定時匯出

Azure SQL Database 中原本可以設定自動匯出,但目前已經取消該功能了,因此本文介紹如何透過  Azure Automation 來達到定時自動匯出到所想要的  Storage 中來保存。

前幾天有個社群的朋友,來詢問是否有方法可以定時將 Azure SQL Database 的資料庫給匯出,因為原本是否這個功能的,但後來微軟因故把這個功能給取消了,因此朋友來詢問該如何解決。

而這個問題在之前也有困擾過我,只是想說反正原本我都只保留一個月的資料,而目前 Azure SQL Database 就已經可以隨時還原  35 天內任一時間點的資料庫,那我備份那個是有甚麼用處呢 ? 就算東亞的資料中心異常了,我還有個異地複寫的資料庫在其他資料中心,所以也就沒有特別去注意了。後來有一陣子開始流行 Azure Function ,當時我也有試著用 Azure Function + Power Shell 來解決,只是這樣要處理認證的管理,以及如何控制 Power Shell 相關模組的版本,實在是有點麻煩,因此後來有測試過一下做個 Lab ,就沒有往下進行了。後來再查看 Azure 相關文章的時候,剛好有看到 Azure Automation 的介紹,發現雖然他的彈性沒有向 Azure Function 那麼大,但之前我所困擾的問題,在 Azure Automation 上都沒有問題了,因此就拿來測試一下看看是否真的如文章上所說明的,果然真的沒有令人失望,因此後來我們在一些針對 Azure 資源也都可以改用它來進行了。

回到正題,那我們要如何設定使用 Azure Automation 來完成我們的工作呢 ? 當然要先進入 Azure Portal 管理介面,選擇 New 的時候,這個時候我們可以手動輸入 Automation 

可以看一下簡介,透過這個 Automation Account ,可以來幫助我們使用 PowerShell 來做一些自動化的流程處理,看起來應該就是我們所要的,因此就選擇下方的 Create

而跟 Azure 上大部分的服務類似,你要去指定名稱、訂閱、資源群組和定區等資料,只是這裡要比較注意兩個地方:

1. 目前 Azure Automation 並不是所有的資料中心都可以提供這樣的服務,而我平常最常使用的東亞的資料中心就沒有提供,因此我就只能選擇東南亞的資料中心,但雖然這個 Automation Account 和我的 Azure SQL Database 分在不同的資料中心,但依然是可以運作的。

2. 透過建立  Run As account 的方式,就可以讓 Azure Automation 透過這樣的方式取得我們 Azure 訂閱的權限,進行來做相關的 Azure 管理,而不用考慮再去另外建立  Azure AD 來做授權和權限管理。

建立這個 Automation Account 不用花很多的時間,一下子就在我們所指定的資源群組下建立好了。建立 Automation Account 的同時,Azure 也很貼心的幫你建立五個 Runbook 。那甚麼是 Runbook 呢 ? 你可以當成就是你要執行的指令腳本,你可以手動、定時或者是用 Webhook 的方式來呼叫,而每次執行的一個單位,就是一個 Runbook ,當然如果您覺得礙眼,也是可以把所提供的那幾本給刪除,是沒有影響的。


透過前面的方式,我們已經先建立好 Automation Account 了,那麼接下來我們要來設定我們的 Automation Account ,並且產品一個我們所要的 Runbook 來完成我們所想要的工作了。

 

此時我們先到 Automation Account 下,查看 PowerShell 的模組版本,此時我們選擇「Modules」中可以看到,預設的 PowerShell 所使用的 Azure 相關模組都是很早期的版本,因此我們所想要使用的 cmdlet ,就沒有辦法來使用了。

然而在這點上,Automation Account 就比  Azure Function 來的方便取多了,我們可以執行在這個畫面上,選擇「Update Azure Modules」,然後再按下「Yes」,那麼我們不需要做甚麼太複雜的處理,Azure Automation 就會去啟動一個內含的 Runbook ,產生一個新的  Job 來更新

差不多等了 8 分鐘左右,你可以重新按下 Refresh ,重新取一下  Azure 相關模組的版本。此時我們會發現我們等一下所需要的 AzureRM.SQL 的模組,也已經被升級到新的版本,那麼接下來就只要煩惱怎麼寫出我們想要的  Rubbook 了。


那接下來就是我們要來產生所需要使用的  Runbook 了,而在這一個部分,Azure 也在 Automation Account 的選單上,很貼心的提供了「Runbook gallery」,我們可以去找一些人家已經寫好的  Runbook ,我們可以直接拿來使用或修改,這樣就可以更為方便了。

正常來說應該可以找到 3-4 的類似的功能,而在這裡我自己是找到一個「Backup Azure SQL Database to Blob storage」,從它的簡述中看起來蠻符合我所想到的。

看起來野蠻多人下載來使用的,因此看一下它的 Powershell Script ,可以提供匯出的功能,也同時具有刪除舊的備份檔案的功能,確認無誤之後,就可以選擇右上方的「Import」,將這個  PowerShell 的腳本,匯入到我們的資源群組下一個新的 Runbook 了。

而剛匯入的是還無法直接使用,因此我們選擇該 Runbook 之後,就按下上方的「Edit

選擇上方的 Publish 的按鈕,確認要來使用該 Runbook 來執行我們要的工作了。


接下來我們就要來執行我們的 Runbook 了,而我們選的這個  Runbook 因為設計要符合大部分人的使用,因此相關參數會來的比較多,稍微說明一下一些比較要注意的參數

1, 資源群組,這個主要是要放要備份資料庫是在哪個資源群組中的。

2. 要匯出的是哪個 Azure SQL Database Server

3. 資料庫伺服器帳號名稱

4. 資料庫伺服器密碼

5. 要備份那些資料庫,如果同一個 Server 下有多個資料庫要備份,可以用「,」分隔每個要備份的資料庫名稱

6. 儲存體帳號

7. 備份的端點名稱,這點會比較要注意,可能作者考量到一些特殊資料中心,因此這裡要自己指定備份的  URI 位置,基本上它會是 https://{儲存體帳號}.blob.core.windows.net/ ,這個部分要注意一下。

8. 儲存體金鑰

9. BLOB Container 名稱

10. 備份保留期限

把這些設定好之後,就可以送出去執行了,而就前面的範例,透過將這些參數輸入之後,看您資料庫和資料的多寡,可能會執行的時間不一定相同,因為我的測試資料庫內並沒有太多資料,所以執行差不多 1mins 之後,我就可以在 Storage 內看到我所要的 bacpac 檔案了。

當然如果測試沒有問題,您就可以將該 Runbook 設定週期執行的時間和執行參數,也就很容易的完成我們所想要的定時匯出資料庫的功能了。