用 Azure Management Libraries 操作 Azure Web Site



郭家齊 (Edward Kuo)


2015年5月


簡介

一般來說我們都會使用Azure Portal 操作或管理Azure上面Web Site的狀況,而若不透過Azure Portal,也可以用PowerShell進行管理。想要把這些機制與自己系統整合起來那樣要怎樣做呢?這時候就可以透過Azure Management Libraries去進行開發

安裝套件

首先,我們必須透過NuGet安裝Azure Management Libraries套件

PM> Install-Package Microsoft.WindowsAzure.Management.Libraries

一次會安裝許多元件進來,可以發現能控制Azure東西還真多,不過,這次只會用到Namespace是WebSite

前置作業

當安裝好套件後,在呼叫Azure時候,必須用到Subscriptions ID和X509Certificate2憑證,Subscriptions ID可以到Azure平台取得,Certificate作法有兩種,第一:自行製作然後上傳到Azure上面,第二:透過產生publishsettings file,在file內去取得Certificate,然而,要下載publishsettings file可以到 https://manage.windowsazure.com/publishsettings/index?client=vs&schemaversion=2.0 產生並且下載,建議一個做法就是先開一個視窗登入到Azure裡面,再開一個視窗去執行上面網址,這樣就會自動產生檔案下載

檔案是XML檔案,從這檔案中能找到ManagementCertificate屬性的值,也同時可以找到Subscriptions ID

透過這一組資料,就能建立一個X509Certificate2憑證,所以,還必須撰寫一個產生X509Certificate2憑

證功能,記得須先引用System.Security.Cryptography.X509Certificates & Microsoft.WindowsAzure 這兩個Namespace,這樣就完成輸出Azure上使用的憑證了

string subID = "301599fe-ec9e-4720-8933-XXXXXX";

string CER = @"MIIKLAIBAzCCCewGCSqGSIbXXXX";

public static SubscriptionCloudCredentials getCredentials(string subscrtionID, string Base64Encodedcert)

{

     return new CertificateCloudCredentials(subscrtionID, new X509Certificate2(Convert.FromBase64String(Base64Encodedcert)));

}

Azure的Web Space下可以擁有多個Web Site,換句話說WebSpace等同web hosting plan,就所謂的Group的概念,圖中顯示Default0,這邊是指Web Hosting Plan的名稱,同時也是會代表該WebSites所隸屬的ServerFarm名稱

所以,透過關係圖就可知道,取得一個Web Site資訊前,必須先取得Web Hosting Plan或是WebSpace的資訊之後,再繼續往下找出對應到所有該網站的資訊。

查詢Web Site

接下來,就可以進行一列串動作,先來做查詢的功能,有了剛剛的憑證之後,就是透過這個憑證去和Azure進行溝通。如前面所說,要先取得WebSpace的列表,再由每個

WebSpace下去取得Web Site資訊

var cred = getCredentials(subID, CER);

var client = CloudContext.Clients.CreateWebSiteManagementClient(cred);

var listWebSpacesResponse = client.WebSpaces.List();

有了WebSpace資訊,將WebSapce Name放入,就可以了

foreach (var ss in listWebSpacesResponse)

{

    var ppp = client.WebSpaces.ListWebSites(ss.Name, new WebSiteListParameters { PropertiesToInclude = new List<string>() });

    foreach (var dk in ppp)

    {

        Console.WriteLine(string.Format("Web site Name : {0},Location : {1}. Status :{2},Server farm:{3},Plan:{4}", dk.Name, ss.GeoRegion, dk.State,dk.ServerFarm,ss.Plan));

    }

}

若是,你執行完畢的結果,跟Azure Portal上面資訊不太一樣時候,因為你可能擁有多組的Subscriptions ID,且這些Web Site是用不同Subscriptions ID去建立,因為,這做法一次只能去查詢一組Subscriptions ID資訊,再取得多一點資訊

foreach (var ss in listWebSpacesResponse)

{

    var ppp = client.WebSpaces.ListWebSites(ss.Name, new WebSiteListParameters { PropertiesToInclude = new List<string>() });

    Console.WriteLine("Web Hosting Plan Name:" +ss.Name);

    Console.WriteLine("Web Hosting Plan:" +ss.Plan);

    Console.WriteLine("Web Hosting Plan Status: " +ss.Status);

    Console.WriteLine("Web Hosting Plan Local: " +ss.GeoLocation);

    Console.WriteLine("Web Hosting Plan Region : "+ss.GeoRegion);

    Console.WriteLine("---------------------------------");

    foreach (var dk in ppp)

    {

        Console.WriteLine("Web Site Name : " + dk.Name);

        Console.WriteLine("Web Site SKU : " + dk.Sku);

        Console.WriteLine("Web Site Status: " + dk.State);

        Console.WriteLine("###############################");

    }

     Console.WriteLine("==================================");

}

建立Web Site

Web Site透過介面去建立其步驟是很簡單。背後其實有做兩個動作,先建立虛擬主機方案,後建立Web Site,然後,Web Site資源會對應到虛擬主機方案所設定的資源,而虛擬主機方案又叫做Web Hosting Plan,一個虛擬主機方案中可以對應到很多個Web Site,也因此每個Web Hosting Plan也是可以自定義資源的

程式開發上,第一步驟就是建立Web Hosting Plan。在建立Web Hosting Plan時候,就必須透過屬性去設定相關資源的使用

var webhostingPlanParameter2 = new WebHostingPlanCreateParameters();

webhostingPlanParameter2.Name = "Test2";

webhostingPlanParameter2.WorkerSize = WorkerSizeOptions.Large;

webhostingPlanParameter2.NumberOfWorkers = 3;

webhostingPlanParameter2.SKU = SkuOptions.Shared;

client.WebHostingPlans.Create(WebSpaceNames.EastUSWebSpace, webhostingPlanParameter2);

  • Name : 設定Hosting Plan名稱
  • WorkSize : 主要就是設定執行個體的大小,這邊可以分為Small, Medium , Large, 這些大小必須當你的Web Hosting Plan是Basic以上才有意義。不然是無法 作用的
  • NameOfWorke rs : 就是控制Hosting Plan的執行個體,這部分也不是隨便輸入就可以,這邊執行個體個數,會依照你的虛擬主機方案來決定最大值,換句話說若是你方案最大值是3,你要設定超過最大值也不會有效的
  • SKU : 就是設定虛擬主機方案的大小

以上設定完成後,就是建立Web Site,這邊必須注意,不管是Web Hosting Plan還是Web Site其Name都是不可以重複的,其程式碼如下

var SiteParamter2 = new WebSiteCreateParameters();

SiteParamter2.Name = "CodetoTestWebsite2";

SiteParamter2.ServerFarm = "Test2";

SiteParamter2.WebSpace = new WebSiteCreateParameters.WebSpaceDetails() { GeoRegion = GeoRegionNames.EastUS, Name = WebSpaceNames.EastUSWebSpace, Plan = WebSpacePlanNames.VirtualDedicatedPlan };

client.WebSites.Create(WebSpaceNames.EastUSWebSpace, SiteParamter2);

  • ServerFarm : 就是填入Web Hosting Plan的Name
  • WebSpace : 主要就是定義這個Web Site被放在哪一個資料中心的位置和Plan,這邊Plan都是選定VirtualDedicatedplan

這樣就可以建立Web Site,同時,也可以做到在同一個Hosting Plan對應多個Web Site。

更新Web Site

更新Web Site & Host Plan,這裏能使用變更的參數也不多,雖然,HostName可以變動,不過,一般比較不會去變動到HostName,且也不能變動原有的

XXXX.azurewebsites.net的HostName

IList<string> olist = new WebSiteUpdateParameters().HostNames;

olist.Add("codetotestwebsite1.azurewebsites.net");

client.WebSites.Update(WebSpaceNames.EastUSWebSpace, "codetotestwebsite1", new WebSiteUpdateParameters() { HostNames = olist, ServerFarm = "Test3", State = "Stopped" });

把原本Web Site是被放在Web Host Plan為Test1地方,搬移到Test3,同時停到這個Web Site

Web Host Plan可變動的東西又更少了,只能變動資源大小而已

變動Plan的執行個體數和資源大小,下圖為原本的設定

client.WebHostingPlans.Update(WebSpaceNames.EastUSWebSpace, "Test3", new WebHostingPlanUpdateParameters() { NumberOfWorkers = 1, SKU = SkuOptions.Standard, WorkerSize = WorkerSizeOptions.Medium });

透過上面指令,修改後如下圖所示

刪除Web Site

在刪除部分,有一點必須注意的就是若是Web Host Plan裡面的Web Site不是空的是無法被刪除的,因此,若是刪除最後一個Web Site同時刪除Web Host Plan指令可以這樣下

client.WebSites.DeleteAsync(WebSpaceNames.EastUSWebSpace, "CodetoTestWebsite22", new WebSiteDeleteParameters() { DeleteEmptyServerFarm=true });

刪除指令可用到只有下面幾個,

其實並不多,剛剛提到想要把最後一個Web Site刪除就直接刪除Host Plan只要把DeleteEmptyServerFarm設定為True就可以,此外,指令中有client.WebHostingPlans.Delete,但是,不建議這樣做操作,畢竟,在不能很確定當下此Plan是否是空的,若非空的就去砍掉是很可怕的


技術文章 | 社群翻譯