用雲就是為了省錢 之 定時自動開啟與關閉Azure VM
最近越來越多朋友們開始使用Azure VM,比起自己搭建一個Hyper-V的服務器環境,Azure VM使用起來方便很多,你隨時可以建立或移除一台VM,而且在線上還有現成的範本(例如下圖中MSDN中的Win10搭配VS2015RC環境)讓你直接測試使用。
也開始有一些朋友聽了我的建議,用VM當作正式的工作環境,這有幾個好處,首先,你只需要一台輕便的surface pro 3,不再需要扛著厚重的超級筆電,只要有網路,你可以同時開好幾個開發環境,在不同的專案工作中切換遊走,這對於我們這種身兼多職的工作者來說,相當實際好用。
此外,再也不需要為了安裝而傷腦筋,不喜歡隨時可以砍掉重練(當然不是重新從頭,而是從儲存好的VM範本開始)。
不過,用VM當作工作環境,我自己的經驗,最少需要開到3.5G RAM的大小,本錢雄厚一點7G RAM的大小才能讓專業人士工作效率更加提升。
然而,參考了底下的定價之後,你可能會發現,我們這種市井小民若真想要靠azure VM渡日,恐怕會覺得稍稍有一點點的奢侈:
# 透過憑證建立連線
Connect-Azure -AzureConnectionName AzureAutomation
Select-AzureSubscription -SubscriptionName AzureAutomation
InlineScript
{
# 取得所有VM
$VMS = Get-AzureVM
ForEach ($VM in $VMS)
{
#取得單一VM
$VMName = $VM.Name
Write-Output "To Start-AzureVM VM: $VMName"
#開啟VM
Start-AzureVM -ServiceName $VM.ServiceName -Name $VM.Name
}
}
}
也開始有一些朋友聽了我的建議,用VM當作正式的工作環境,這有幾個好處,首先,你只需要一台輕便的surface pro 3,不再需要扛著厚重的超級筆電,只要有網路,你可以同時開好幾個開發環境,在不同的專案工作中切換遊走,這對於我們這種身兼多職的工作者來說,相當實際好用。
此外,再也不需要為了安裝而傷腦筋,不喜歡隨時可以砍掉重練(當然不是重新從頭,而是從儲存好的VM範本開始)。
不過,用VM當作工作環境,我自己的經驗,最少需要開到3.5G RAM的大小,本錢雄厚一點7G RAM的大小才能讓專業人士工作效率更加提升。
然而,參考了底下的定價之後,你可能會發現,我們這種市井小民若真想要靠azure VM渡日,恐怕會覺得稍稍有一點點的奢侈:
但我曾經說過,我們長時間以來,一直都是直接開立azure VM給外包或海外的開發人員,難道微軟有給我們特別的優惠或折扣嗎? 還是我們有什麼撇步可以省錢呢?
這,是當然的,用雲就是為了省錢,透過底下介紹的方式,可以當場讓您常開型的VM每個月下來節省一半的費用。
秘訣只有一個,就是:VM沒用的時候不要開。
VM用到的時候才開,每逢假日或下班時間,自動關起來,如此一來,立即省了超過一半的時間(費用),雲時代,時間就是金錢。除此之外,對於安全也更有掌控,不僅僅隨時可以看到委外人員的進度和操作狀況,也可以避免外包人員知道太多(我們會把相關安全性已組件的方式是先安裝好,避免委外開發人員接觸),我們也可以更便利的搭建CI/CD環境,以及標準的開發套件。同時,這也可以鼓勵委外開發人員時間到了就下班,不要加班(我們是良心企業)。
因此,定時開關VM有著眾多好處,要實現這件事情,有很多種作法,我們的做法如下:
- 撰寫powershell script,自動開啟或關閉VM。
- 建立一個azure automation,自動執行上述的script。
- 為了能夠在azure automation當中自動執行,你得先搞定認證問題。
當然,利用powershell script自動開啟或關閉VM,也可以從你的PC或Local的Server上設定排程自動執行,但本公司一直號稱除了azure之外完全不架Server,如果這時候還要在local用PC或Server執行排程,不就很遜嗎?
因此,我們上面的步驟2,採用的是azure automation(azure 自動化服務),這是一個讓您可以透過script來管理azure服務的機制。
在開始之前,我們先用最簡單的方法建立一個憑證,你可以透過VS2013裡面內建的工具makecert.exe來建立憑證(後面azure automation會用到),建立的指令是:
==================================
cd "C:\Program Files (x86)\Windows Kits\8.0\bin\x64"
makecert -sky exchange -r -n "CN=AzureAutomation" -pe -a sha1 -len 2048 -ss My "AzureAutomation.cer"
==================================
過程如下(我的環境是VS2013):
建立好了之後,可以透過mmc.exe,看到憑證:
先把憑證匯出,待會會用到,操作動作是點選憑證,右鍵,所有工作,匯出...
請匯出.cer(X.509)以及.pfx,匯出.pfx的時候,會要求你輸入密碼(請自己定一個密碼,並且自己記好,待會會用到):
完成之後,接著,你就有了憑證和金鑰檔案。(其實還有更高檔的作法,就是用Azure AD做認證機制,不過,有鑑於我猜應該不多人有用Azure AD,所以我們先用這個比較平民的做法)
建立好之後,請先將.cer上傳到azure憑證管理的地方(azure portal-->設定-->管理憑證):
這是為了讓後面我們所建立的script可以管理此訂閱。
接著,我們要建立Azure Automation,以便自動化管理訂閱。
請直接從Azure Portal中,新增一個Runbook,新增時,請選擇『從組件庫』:
接著,在組件庫中找到 "Connect to an Azure Subscription using Certificates":
接著,按下一步,直到看到底下畫面。注意不要修改預設的『Connect-Azure』明稱,並且選擇『建立新的自動化帳戶』,底下帳戶名稱請隨意輸入一個你自己取的名字即可:
建立好之後,開啟這個automaton,你會看到裡面已經有剛才我們從組件庫選擇的Connect-Azure:
請點開Connect-Azure,接著選擇『製作』→『發行』:
接著,在同一個Automation(剛才範例中我們叫做NewAutomation)當中,建立另一個Runbook,這次,建立的時候,請選擇『快速建立』(上次是從組件庫),我們這次建立的RunBook名稱為StartVM(要用來自動啟動VM),並且選擇建立在先前的自動化帳戶(NewAutomation)中:
建立好之後,請選擇『編輯Runbook』:
並且輸入底下指令:
workflow StartVM
{# 透過憑證建立連線
Connect-Azure -AzureConnectionName AzureAutomation
Select-AzureSubscription -SubscriptionName AzureAutomation
InlineScript
{
# 取得所有VM
$VMS = Get-AzureVM
ForEach ($VM in $VMS)
{
#取得單一VM
$VMName = $VM.Name
Write-Output "To Start-AzureVM VM: $VMName"
#開啟VM
Start-AzureVM -ServiceName $VM.ServiceName -Name $VM.Name
}
}
}
完成後按下『發行』:
接著,切換到NewAutomation的『資產』,選擇『加入設定』:
我們先建立認證,待會還要建立連線:
在接下來的畫面中,選擇認證類型,並輸入認證名稱(我用AzureAutomation):
接著,上傳我們剛才準備好,等了很久的憑證檔案:
完成後,再建立另一個『資產』,這次選擇連線:
注意,建立時,底下『連線』的『名稱』必須跟剛才StartVM的script中的AzureConnectionName相同,範例中我們用的是『AzureAutomation』:
下一步要輸入的是該連線所用的憑證名稱(也就是剛才我們建立的那個憑證資產名稱,我剛才用的是AzureAutomation),以及azure 訂閱ID:
完成之後,你就有了一個名稱為StartVM的Runbook,該Runbook用到了另一個Connect-Azure Runbook,以及兩個資產(連線與憑證)。
這時候,你可以試著執行StartVM這個Runbook,他會將你所指定的訂閱中的所有VM給啟動,確定無誤之後,你可以設定此Runbook的排程,例如固定早上七點執行:
如此一來,每天早上七點就可以自動開啟所有VM了。
有了自動啟動VM,當然也必須要能夠自動停止VM,自動停止和啟動的做法幾乎完全一樣,唯一的不同是你只需要再建立一個StopVM的Script,內容把原本的StartVM指令,改成底下這樣:
Stop-AzureVM -ServiceName $VM.ServiceName -Name $VM.Name -Force
就可以囉,這部分,就交給讀者自行試試吧。
留言