2013年10月21日

[Azure]Role instance recycling、stuck in Busy/Unhealthy status

最近常常接到客戶反映類似的問題;通常這類的問題大概有幾個可能:

  1. 在Startup Task裡遇到問題,例如要跑的Script出錯(Exit code != 0),或是要安裝的元件安裝失敗等等。
  2. 在OnStart()裡面遇到問題,例如沒有處理Exception等
  3. 該reference的assembly沒有佈署到雲端上
  4. Windows Azure資料中心裡的問題

有幾個簡單方式可以讓我們快速的確認一下問題可能發生的原因。

  • 首先,為了要了解到底發生甚麼事情,先到Windows Azure Portal上啟用遠端連線(RDP),這可以在Cloud Service->你的服務->設定->遠端來做設定

image

  • 接下來RDP到出問題的Role Instance上。首先檢查一下C:\Logs裡的WaBootStrapper.log是不是有看到甚麼問題?
    • 一般來說,如果是Startup Task沒有執行完畢導致Role Recycle,在這裡應該可以看到Log的最後一行是停在執行Startup Task,且可以在這裡看到是哪一個Task無法完成。此時可以跟E:\或是F:\的RoleModel.xml來比對Startup Task的相關資料。
  • 接著可以檢查Task Manager裡面,WaIISHost.exe或是WaWorkerHost.exe是不是有正常執行?
    • WaIISHost與WaWorkerHost是Role Instance的Host Process,他們會先載入E:\或是F:\下的__RoleEntry這個檔案中所指定的Role Entry,如果無法載入,Role Instance也就無法順利啟動。
    • 如果需要Debug WaIISHost.exe與WaWorkerHost.exe,可以透過Windbg來attach到該process然後看看是否有甚麼錯誤。
  • 打開Event Viewer,看看裡面有沒有甚麼明顯的訊息。
    • 如果程式有丟出Exception,可以在這裡看到。
  • 瀏覽本機網頁,看看網站是不是有回報錯誤。
    • 如果看到Could not load xxx assembly or its depencies;表示網站所需要的DLL 沒有佈署到雲端上,這時要回到Visual Studio中將所有reference到的DLL都設定Copy Local,並確認該安裝的元件都有包在package裡面。

幾個比較常遇到的問題跟一般的Troubleshooting:

  1. 發現WaIISHost不斷重啟時,表示某些需要的DLL找不到;這時可以打開網頁(如果是Web Role)瀏覽本機,通常這裡可以看到是哪個DLL或他相關的DLL找不到,這時就要回去source code看一下可能少了甚麼。
  2. 發現WaBootstrapper.log停在startup task時,如果該startup task是個script,則可以將該script全部remark掉,然後用Task Manager把WaBootstrapper.exe砍掉,等他重啟後,看看問題有沒有解決。
  3. 如果Event Viewer裡就可以看到Unhandled Exception,請回到source code檢查可能出錯的地方。
  4. 另外要特別注意,雲端上只支援64位元的程式,所有的程式請務必compile為Any CPU。
  5. 如果以上皆非,那麼請快樂的聯絡微軟技術支援吧。

2013年7月31日

[Azure]設定Windows Azure Alert

  • 切換到Settings、Alert,按下方的加號開始新增規則

image

  • 輸入相關資料,服務型態有Cloud Service、WebSite、VM與Mobile Service可以選,這邊我先測試WebSites;按下一步。

image

  • 由於要監控的是網站服務,因此在網站服務上必須要先啟用Endpoint Monitoring的機制。這裡我已經啟用了,因此可以選擇要監測的端點;如果還沒啟用的,可以參考這一篇的方式啟用。這裡我設定的是,如果15分鐘內的平均Response Time大於等於10秒,則發出警告。另外,這裡除了可以設定要寄通知給Service Admin及Co-Admin外,也可以指定要送警告給其他的使用者。

image

  • 設定完成

image

2013年7月30日

[Azure]Setup Point-to-Site VPN

Setup Point-to-Site VPN is pretty easy follow this MSDN instruction.

  • First thing is to create a Virtual Network thru management portal, and check “Point-to-Site” checkbox

image

  • Follow the wizard and finish the creating process, don’t forget to add “Gateway Address space” in the last step

image

  • Upon create,click “Create Gateway” to create a gateway tenant for this Virtual Network

image

  • After the gateway created,we then need to upload our certificate to Windows Azure;Remember,Windows Azure P2S VPN authenticate clients by certificate,so we need a root certificate uploaded to Windows Azure, and for each client, we need to generate a client certificate for it. To generate  a root certificate, launch visual studio command prompt and execute the following command:

makecert -sky exchange -r -n "CN=Michael Azure Root Cert" –pe -a sha1 -len 2048 -ss My -sk MichaelCAContainer azure_root.cer

This will create a root certificate and save in current working directory. We then can double click on it to bring up installation wizard, follow the instruction to install the root certificate to “My “ store

  • Then again, execute the following command to create a client certificate

makecert.exe -n "CN=My Azure P2S Client Cert" -pe -sky exchange -m 96 -ss My -in "Michael Azure Root Cert" -is my -a sha1

Again, double click on it and follow the wizard to install it into “My” certificate store

  • Now, go to Azure portal, go to VNet and switch to Certificate tab, click “Upload” to upload root certificate

image

  • Go back to Dashboard, now we have completed all required steps, we can now export client certificate to PFX format, dispatch it to clients so they can connect to WA VNET
  • Once client certificate is installed on client machine, we can then go to WA management portal, and download appreciate package and dispatch it to client machine

image

  • Upon download, double click on it to install the package

image

  • Once installed, you can open up your network adapter panel, the P2S VPN is there

image

  • Click connect, a VPN connection windows shows up, click on Connect

image

  • Click on OK

image

  • It takes couple seconds to establish the connection

image

2013年6月25日

[IIS]用ARR將http://www.domain.com/sub1的要求轉給另一個IIS Server來處理

遇到一個需求,客戶希望自己架一個multi-tenant的環境,把不同sub domain的http request交給不同的server負責。例如,假設客戶瀏覽http://www.mydomain.com/michisvr1,則把request轉給內網的另一台sub1-server處理。

當然我們可以自己寫程式來處理這樣的需求,不過,也可以透過ARR來協助處理。

假設我有三台Server,一台做Front-End(Server-Front),另兩台分別是michisvr1與michisvr2,各負責sub domain 1 (michisvr1)與sub domain 2(michisvr2)的需求。

那麼我們會需要再Server-Front上安裝ARR,並且設定兩個server farm分別對應到sub domain 1與sub domain 2的需求。將兩台Server分別加入各自的server farm後,透過設定routing rule來將request route到不同的server farm來處理。

首先下載透過Web Platform Installer下載並安裝Application Request Routing。

image

我的方式是,為每一個sub domain建立一個Server Farm,然後透過判斷Request URL,如果是www.mydomain.com/michisvr1,就把需求轉給負責處理michisvr1這個sub domain的server farm。

當然一定還有其他的做法,這個方法只是為了驗證可行的一個簡單的PoC。

安裝完成後打開IIS Manager,建立Server Farm,給予一個簡單的名稱,由於我想利用naming conversion的方式來做routing,因此這裡的名稱要設定為michisvr1以配合我的sub domain名稱。

image

然後將負責sub domain的server加入server farm,如果有很多台server就一直加下去。

image

重複這個步驟,直到所有的Server Farm建立完成。

image

接著要來設定Routing Rule;所謂的routing rule,也就是當HTTP request符合某個規則時,針對這個request做一些動作,可能是redirect到其他server或是把request丟給server farm等等。

點選IIS manager上的本機Server,然後double click “URL Rewrite”

image

新增一個空白的規則。

image

在URL的地方指定Requested URL要”Matches the pattern”,然後指定要使用Regular Expression或擇其他的方式;在Pattern的地方輸入”.*”表示任何URL。

image

接著輸入Conditions,因為我想要的方式是,如果客戶要求http://www.mydomain.com/michisvr1,就把需求轉給michisvr1這個server farm處理;亦即,我是看”michisvr1”這個字串來決定我要把request轉給哪個server farm的;因此在這邊,我要指定,當{PATH_INFO}符合^/michisvr1/(.*)?這樣的規則時,就把request轉給michisvr1處理。

^/michisvr1/(.*)?是一組Regular Expression,詳細的說明網路上都可以查到,這裡就不多做說明了。

image

最後,當以上條件符合時,設定Action為把需求route到Server Farm。其中Path的部分設定為{C:0}。如果客戶要求的URL是http://www.mydomain.com/michisvr1/test.htm,{C:0}就是michisvr1/test.htm;套用到以下的設定,會把需求轉給http://[michisvr1這個Server Farm裡的任一台Server]/michisvr1/test.htm。

image

設定完成後按下右上角的Apply完成設定。

重複以上步驟設定完michisvr2的規則。

image

ARR的設定到此就完成了,接著我們要設定michisvr1與michisvr2這兩台IIS Server。

由於需求會被轉到各伺服器的[WWWROOT]/michisvr1或是[WWWROOT]/michisvr2,因此要在個別的IIS上將相對應的Virtual Directory或Application設定好。

image

設定完成後就可以了。

2013年6月24日

[Azure]Azure Site-to-Site VPN - 2

上次建立完Site-to-Site VPN後,心裡總覺得這也太複雜了點,應該有比較簡單的方式才對…

果然,上一次我所建立的方式,是把RRAS Server當成VPN Server來用,由Windows Azure Virtual Network Gateway與RRAS建立VPN Tunnel後,on-prem的Client端透過VPN先連到RRAS,再透過VPN Tunnel連到Windows Azure VNet。

比較簡單的方式,是把RRAS當成Router來用。

首先到Windows Azure Portal上建立Local Network與Virtual Network,並設定Site-to-Site VPN。

image

image

建立Dynamic Route Gateway

image

建立完成後,下載VPN Device Script

image

修改Script內的變數為實際資料後,到RRAS Server上執行這個powershell;接著一樣要記得開啟防火牆,允許IKE v2所需要的Port跟Protocol。

image

然後回到Windows Azure Portal,按下連線。

image

立刻就成功地建立Tunnel了…那我之前搞那麼久到底是為什麼啊你說說看!?

image

回到on-prem的機器上,記住,在Windows Azure Local Network中,我所設定的Local Network的Address space是10.10.11.X,因此我在本地的VM也必須在這個網段

修改網路設定,把default gateway指定到10.10.11.1,也就是RRAS Server的Local IP Address,

特別注意Subnet mask也要符合Windows Azure Local Network上的設定。

image

然後測試一下,可以從Azure裡的VM Ping到On-Prem的機器;

image

在on-prem也ping得到Azure裡的VM了!

image

2013年6月19日

[Azure]設定Site to Site VPN

Windows Azure Virtual Network支援Windows Server 2012 RRAS作為on-prem VPN Server,這讓沒有錢買VPN設備的我們提供了一個非常方便的開發或測試的環境。

要設定Windows Azure Site-to-Site VPN,首先我們需要兩台local的機器,其中一台要作為RRAS Server,這台機器必須不在NAT,並且必須要有public IP。另外一台機器作為虛擬的內網機器,只需要有可以跟RRAS Server連線的內網網路連線就可以了。

機器 IP位址
RRAS 10.10.10.1/124.124.X.X (public ip)
Client 10.10.10.2

首先我們要先在RRAS Server上安裝RRAS服務,打開Server Manager,新增角色

image

這裡基本上就一直下一步就可以了

image

安裝完成後,其實還需要做一些設定,不過我在實作時因為想說Windows Azure Portal上可以下載設定檔的template,裡面應該有設定的Script,於是安裝完後就放著。(事實證明並不是這樣,也因為這樣繞了許多路)

接著,我們需要設定防火牆。Windows Azure VPN走的是IKE v2,因此需要開啟幾個port的Inbound rule,詳細的port在這裡,這邊就不截圖了,比較要注意的是其中一個規則是protocol 50。

IP Protocol Type=UDP, UDP Port Number=500
IP Protocol Type=UDP, UDP Port Number=4500
IP Protocol Type=ESP (value 50)

設定完防火牆,接著回到Windows Azure管理網站的Virtual Network,開始建立Virtual Network。

image

首先設定我的Local Network,

指定VPN Device的IP位址,也就我們RRAS Server的Public IP。

image

我希望我的本地網路的網段是10.10.11.X

image

按下確定完成建置,接著開始建立Virtual Network。

image

設定名稱、資料中心等

image

如果要指定DNS可以在這裡指定,另外本地網路需要設定為剛剛建置完成的Local Network。

image

設定Windows Azure上的機器的Subnet以及Gateway Subnet間。Gateway Subnet是另外加的,記得一定要點那個Add Gateway subnet的按鈕就可以了。Gateway Subnet至少需要三個位址,所以一定要預留。

image

這樣我們就設定完成了,接下來要建立Gateway,這個過程會需要一段時間,所以我們可以先把VPN Script下載下來研究一下。

image

選擇Server 2012 RRAS

image

接著就可以建立Gateway了,因為是使用RRAS,一定要選Dynamic Route;根據MSDN,只要情況允許,建議都是用Dynamic Routing。

image

建立完成後,就可以開始來修改VPN Script了,打開剛剛下載的VPNDeviceScript.cfg,會發現其實他是一個Powershell指定檔。裡面會看到類似<SP_AzureNetworkCIDR>這樣的變數,我們要做的,就是用真的資料來取代這些變數。

  • 將<SP_AzureGatewayIpAddress>取代為Gateway IP Address

image

  • 將<SP_AzureNetworkCIDR>取代為Windows Azure VNet的Address space。

image

  • 將<SP_AzureNetworkMetric>取代為Metric,例如1。
  • 將<SP_PresharedKey>取代為Shared Key

image

接著把這個檔案rename成.ps1,copy到RRAS Server上,開啟powershell並執行他。

由於Script中會去安裝Remote Access的腳色,但是因為我一開始就安裝過了,所以這裡會報錯誤,可以忽略他。

image

如此一來就大功告成了嗎?…當然不是…

到目前為止,我們主要都是在設定Windows Azure與RRAS的連線而已;我們指定了Windows Azure VNet與Local Network、設定Azure要透過哪個VPN Device根本地網路連線,並且也安裝RRAS。

接下來我們來要設定RRAS,讓使用者可以透過他跟Azure上的機器透過VPN溝通,

回到RRAS Server上,建立一個使用者testremot,並且允許Dial-In

image

同時為了避免不必要的困擾,修改一下密碼永不過期與無須變更。

image

接著,打開Routing and Remote Access。點選Server Name、右鍵、Property。

image

確定IP v4 Remote server有打勾

image

切到IP v4頁簽,設定要指派給Local Network中的機器的DHCP位址範圍,這個位址必須與Azure上設定的Local Network位址一致,以我的例子來說,是10.10.11.0~10.10.11.255

image

點選Ports、右鍵、Property

image

點選相對應的Port,然後按Configure;由於Windows Azure走IKE v2,這邊理論上應該只需要設定IKE V2的Port,不過我是都設定了。

image

確定Remote access connections(Inbound only)有打勾

image

全部都設定完成後,回到Azure Portal上啟用本地網路連線;

image

過一會我們應該會看到連線成功。

image

在RRAS上,Interface也已經連線了。

image

到了這裡,大功已經快要告成了!!

回到10.10.10.2這台機器上,現在我們要設定連線了。

打開網路共享中心,新增一個連線。

image

連線到Work place

image

image

不需要設定Internet Connection

image

這邊要輸入RRAS的Local IP Address,以我的例子來說,10.10.10.1

image

輸入完後按下Create,

然後回到網路與共享中心,Change Adapter Settings

image

點選剛剛建立完成的連線,Property

image

修改安全性設定

image

接著就可以連線了。

image

到這裡已經大功告成了,接下來當然是要測試一下。

回到Windows Azure Portal,建立一台Virtual Machine作為Web Server並加入剛剛建立的Virtual Network。

image

image

安裝Web Server,回到10.10.10.2的本地客戶端電腦。打開瀏覽器瀏覽看看。

image

Blog Archive

About Me