2015年6月29日 星期一

用雲就是為了省錢 之 定時自動開啟與關閉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渡日,恐怕會覺得稍稍有一點點的奢侈:
 
但我曾經說過,我們長時間以來,一直都是直接開立azure VM給外包或海外的開發人員,難道微軟有給我們特別的優惠或折扣嗎? 還是我們有什麼撇步可以省錢呢?
 
這,是當然的,用雲就是為了省錢,透過底下介紹的方式,可以當場讓您常開型的VM每個月下來節省一半的費用。
 
秘訣只有一個,就是:VM沒用的時候不要開。
 
VM用到的時候才開,每逢假日或下班時間,自動關起來,如此一來,立即省了超過一半的時間(費用),雲時代,時間就是金錢。除此之外,對於安全也更有掌控,不僅僅隨時可以看到委外人員的進度和操作狀況,也可以避免外包人員知道太多(我們會把相關安全性已組件的方式是先安裝好,避免委外開發人員接觸),我們也可以更便利的搭建CI/CD環境,以及標準的開發套件。同時,這也可以鼓勵委外開發人員時間到了就下班,不要加班(我們是良心企業)。
 
因此,定時開關VM有著眾多好處,要實現這件事情,有很多種作法,我們的做法如下:
  1. 撰寫powershell script,自動開啟或關閉VM。
  2. 建立一個azure automation,自動執行上述的script。
  3. 為了能夠在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
 
就可以囉,這部分,就交給讀者自行試試吧。