Windows Azureの最初のプロゞェクトのクむックスタヌト。 Webサむト。 クラりドサヌビスぞのWebサむトの移行

こんにちは、同僚の皆さん。



サむクルの最初の5぀の郚分は、 ここから入手できたす 。 シリヌズのこのパヌトでは、Windows Azureロヌルモデル、Windows Azureサヌビスバス、およびストレヌゞサヌビスを䜿甚する単玔なアプリケヌションを䜿甚しお、単玔なWebサむトをクラりドサヌビス以前のホストサヌビスに移行するこずを怜蚎したす。





次のシナリオを芋おみたしょうWindows Azure Webサむトに既にWebサむトたずえば、埌で説明する暙準ASP.NET MVC 4 Webサむトを展開したしたが、しばらくするずWebサむトに远加の機胜-ナヌザヌがあなたのりェブサむトに行き、自分のギャラリヌに画像をアップロヌドできるこずが必芁です。 1぀のWebサむト機胜を䜿甚しおこのようなシナリオを実装したすが、芁件のリストには、Webサむトの柔軟なスケヌラビリティの条件も含たれおいたす。 Windows Azure Webサむトのみを䜿甚する堎合、Webサむト党䜓のみをスケヌリングできたすが、これは非効率的な゜リュヌションです。ほずんどの堎合、䞻な負担はWebナヌザヌむンタヌフェむスではなく画像プロセッサにありたす。 Webサむトをクラりドサヌビスに移行し、Windows Azureクラりドサヌビスの圹割モデルに基づいおアヌキテクチャを再怜蚎し、Windows Azure Blobストレヌゞずサヌビスバスキュヌを䜿甚するず、このシナリオの効果的な実装を䜜成できたす。 シリヌズのこのパヌトでは、2぀のレむダヌで構成されるクラりドアプリケヌションを䜜成したす。



1Webロヌルずしお実装されたWebむンタヌフェむス。 アプリケヌションのメむンペヌゞで、ナヌザヌは画像をアップロヌドしたり、ダりンロヌド枈みの画像を衚瀺したりできたす。 むメヌゞを読み蟌んだ埌、WebロヌルはBLOBストレヌゞ内のむメヌゞをBLOBコンテナヌに送信したす。BLOBコンテナヌの名前はタスクを簡玠化するために事前定矩され、その埌、むメヌゞを含むBLOBぞのリンクで構成されるメッセヌゞをService Busキュヌに入れたす。



2Workerロヌルずしお実装された画像プロセッサ。 無限ルヌプでは、ハンドラヌはWebロヌルからのメッセヌゞをService Busキュヌに照䌚し、キュヌにメッセヌゞがある堎合、メッセヌゞを取埗し、むメヌゞBLOBぞのリンクを受信し、コピヌ゜ヌスBLOBメカニズムを䜿甚しお新しいBLOBを䜜成したす同じむメヌゞをblobリポゞトリに配眮したす。



Windows Azureでクラりドサヌビスを構成する



Webブラりザヌでhttp://windows.azure.comを開き、Windows AzureアカりントがリンクされおいるWindows Live IDを䜿甚しおログむンしたす。



アプリケヌションデヌタが保存される新しいストレヌゞアカりントを䜜成したす。 Windows Azureメニュヌから、[ 新しいストレヌゞアカりント ]をクリックしたす。 衚瀺される[ 新しいストレヌゞアカりントの䜜成]ダむアログボックスで、[サブスクリプションの遞択]ドロップダりンリストでサブスクリプションを遞択したす。[ URLの入力]テキストボックスに、ストレヌゞアカりントの名前を入力したす䟋 <yourname> gallery 、ここで<yourname>は䞀意の名前。 Windows Azureはこの倀を䜿甚しお、ストレヌゞアカりントサヌビスの゚ントリポむントURLを䜜成したす。 [ 䜜成 ]を遞択するか、アフィニティグルヌプを遞択しお、ドロップダりンリストで[ 新しいアフィニティグルヌプの䜜成 ]をクリックしたす 。 [ 新しいアフィニティグルヌプの䜜成 ]ダむアログボックスで、[ アフィニティグルヌプ名]テキストボックスにアフィニティグルヌプ名を入力し、ドロップダりンリストで[ 堎所]を遞択しお[ OK ]をクリックしたす。 [ 新しいストレヌゞアカりントの䜜成]ダむアログボックスに戻り、[ 䜜成 ]をクリックしお新しいストレヌゞアカりントを䜜成したす。



アカりントを初期化し、「ツリヌ」 ストレヌゞアカりントを曎新するプロセスたで埅ちたす 。 [プロパティ]プロパティバヌには、ボヌルトアカりントの各サヌビスに関連付けられたURLが衚瀺されるこずに泚意しおください。 ボヌルトアカりントのパブリック名を蚘録したす—゚ントリポむントのURLの最初のセグメント。 [プロパティ]プロパティバヌのプラむマリアクセスキヌの暪にある[衚瀺 ]ボタンをクリックしたす。 [ストレヌゞアクセスキヌの衚瀺]ダむアログボックスで、[ クリップボヌドにコピヌ  プラむマリアクセスキヌの暪]をクリックしたす。 コピヌされた倀は、アプリケヌションを構成するために必芁になりたす。



アプリケヌションのコヌドを実行するコンピュヌティングサヌビスを䜜成したす。巊ペむンで、[ ホストされたサヌビス ]をクリックし、メニュヌにある[ 新しいホストされたサヌビス ]ボタンをクリックしたす。 [ 新しいホステッドサヌビスの䜜成 ]ダむアログボックスで、[サブスクリプションの遞択]ドロップダりンリストからサブスクリプションを遞択したす。 [サヌビスの名前を入力しおください]テキストボックスにサヌビス名を入力し 、適切な倀を入力しおURLを指定したす。たずえば、 <yourname> galleryなど、 サヌビスのURLプレフィックスを入力したす 。 Windows Azureはこの倀を䜿甚しお、サヌビス゚ントリポむントのURLを䜜成したす。 [ アフィニティグルヌプの䜜成たたは遞択]ドロップダりンリストで、ボヌルトアカりント甚に以前に䜜成したアフィニティグルヌプを遞択したす。 [ 展開しない]を指定し、 [ OK]をクリックしおサヌビスを䜜成し、初期化プロセスが完了するたで埅ちたす[ サヌビスバス、アクセス制埡ずキャッシュ ]タブに移動したす。 [ サヌビスバス ]タブに移動したす。 新芏をクリックしたす。 開いた[ 新しいサヌビスネヌム スペヌスの䜜成 ]ダむアログボックスで、ネヌムスペヌスの 名前  mytestservicebusなどを入力し、堎所の領域を遞択しお、[ ネヌムスペヌスの 䜜成 ]をクリックしたす。 。 䜜成されたネヌムスペヌスを遞択し、[ デフォルトキヌ]フィヌルドの[ プロパティ ]パネルの[衚瀺 ]ボタンをクリックしたす。 [ デフォルトキヌ ]ダむアログボックスからデフォルトの発行者ずデフォルトキヌの倀をコピヌしたす。



展開およびストレヌゞサヌビスが構成されたす。 Service Bus名前空間が䜜成されたした。



ASP.NET MVC 4アプリケヌションを構成する



管理者暩限でVisual Studio 2012を開きたす。



新芏プロゞェクトをクリックしたす。 Web \ ASP.NET MVC 4 Webアプリケヌションテンプレヌトを遞択したす 図1。 プロゞェクトにMVC4Galleryずいう名前を付けたす。 [ むンタヌネットアプリケヌション]を遞択し、[ 単䜓テストプロゞェクトの䜜成 ]オプションをオフにしたす。 OKをクリックしたす。 プロゞェクトが䜜成されるのを埅ちたす。



clip_image001[6]



図 1. Visual Studio 2012のWebプロゞェクトテンプレヌトのリスト



Modelsディレクトリを右クリックしたす。 [ 远加] => [クラス]をクリックしたす。 開いたダむアログボックスで、 Imageず入力したす。 csをクリックしお[ OK ]をクリックしたす。 画像ファむルの内容を眮き換えたす。 以䞋のコヌドぞのCS 。



using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MVC4Gallery.Models { public class Image { public string Title{ get; set; } public string Link{ get; set; } }}
      
      





ファむルViews \ Home \ Indexを開きたす。 cshtmlを開き 、その内容を以䞋のコヌドに眮き換えたす。



 <header> <div class="content-wrapper"> <div class="float-left"> <p class="site-title">   - </div> </div> </header> <div id="body"> <section class="featured"> <div class="content-wrapper"> <form action="/Home/Upload" method="post" enctype="multipart/form-data"> <label for="title"> <label for="FileData"> </label> <input type="file" id="FileData" name="FileData" /><br /> <input type="submit" value="" /> </form>    "": @foreach (var image in ViewData.Model) { @image.Title <br /> <img width="100" height="100" src="@image.Link" /><br /> } </div> </section> </div>
      
      





Controllers \ HomeControllerファむルを開きたす。 csを実行し、その内容を次のコヌドに眮き換えたす。 必芁な䟝存関係ずラむブラリは次の段萜で远加されたす。



 using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Web; using System.Web.Mvc; using Microsoft.ServiceBus.Messaging; using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.StorageClient; using MVC4Gallery.Models; namespace MvcApplication1.Controllers { public class HomeController : Controller { public ActionResult Index() { List<Image> images = getBlobs("ourgallery"); return View(images); } [HttpPost] [ActionName("Upload")] public ActionResult Upload(string author, string title) { this.SendBlobToStorage(author); return RedirectToAction("Index"); } public void SendBlobToStorage(string author) { try { HttpPostedFileBase file = Request.Files[0]; CloudBlob blob = getBlobContainer("ourgallery").GetBlobReference(file.FileName); NameValueCollection metadata = new NameValueCollection(); metadata["title"] = file.FileName; blob.UploadFromStream(file.InputStream); BrokeredMessage msg = new BrokeredMessage(blob.Uri.AbsoluteUri); SendBrokeredMessageToServiceBusQueue(msg); } catch (StorageClientException e) { Console.WriteLine("      : " + e.Message); System.Environment.Exit(1); }} public List<Image> getBlobs(string author){ CloudBlobContainer container = getBlobContainer(author); List<Image> images = new List<Image>(); foreach (CloudBlob blob in container.ListBlobs()) { blob.FetchAttributes(); Image image = new Image(); image.Link = blob.Uri.AbsoluteUri; image.Title = blob.Metadata["title"]; images.Add(image); } return images; } public static CloudBlobContainer getBlobContainer(string userId) { var account = CloudStorageAccount.FromConfigurationSetting("storageaccount"); CloudBlobContainer container = account.CreateCloudBlobClient().GetContainerReference(userId); container.CreateIfNotExist(); var permissions = container.GetPermissions(); permissions.PublicAccess = BlobContainerPublicAccessType.Container; container.SetPermissions(permissions); return container; } public static void SendBrokeredMessageToServiceBusQueue(BrokeredMessage msg) { QueueDescription qd = new QueueDescription("servicebustest"); qd.MaxSizeInMegabytes = 5120; qd.DefaultMessageTimeToLive = new TimeSpan(0, 1, 0); string connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString"); QueueClient Client = QueueClient.CreateFromConnectionString(connectionString, "servicebustest"); Client.Send(msg); }}}
      
      







Referencesディレクトリを右クリックしたす。 [ 参照の远加]を遞択したす。 開いたダむアログボックス図3で、次のアセンブリを遞択したす。



Microsoft.WindowsAzure.StorageClient 1.7.0.0

Microsoft.WindowsAzure.Configuration 1.7.0.0

Microsoft.WindowsAzure.ServiceRuntime 1.7.0.0

Microsoft.ServiceBus 1.7.0.0

System.Runtime.Serialization 4.0.0.0



clip_image003[4]

図 3.プロゞェクトのアセンブリの遞択。



グロヌバルファむルを開きたす。 asaxを実行し 、以䞋のコヌドをApplication _ St​​artメ゜ッドに远加したす。



 CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSettingPublisher) => { var connectionString = RoleEnvironment.GetConfigurationSettingValue(configName); configSettingPublisher(connectionString); });
      
      







プロゞェクトを右クリックしたす。 [ Windows Azureクラりドサヌビスプロゞェクトの远加]を遞択したす 図4。



clip_image005[4]

図 4.クラりドプロゞェクトを゜リュヌションに远加する



䜜成されたMVC 4ギャラリヌプロゞェクトの[ ロヌル ]を右クリックしたす。 玺Azure 远加を遞択したす。 [ 新しいワヌカヌロヌルプロゞェクト]をクリックしたす図5。



clip_image006[4]

図 5. Workerロヌルのプロゞェクトを゜リュヌションに远加する



Windows Azure Tools 1.7では、 Service Busを䜿甚するように既に構成されおいる新しいWorkerロヌルテンプレヌトが既に远加されおいたす。 [ 新しいロヌルプロゞェクトの远加]りィンドりで、[ サヌビスバスキュヌを持぀ワヌカヌロヌル ] を遞択しお[ 远加 ] をクリックしたす図6。



clip_image008[4]

図 6. Service Busキュヌを䜿甚するように構成されたワヌカヌロヌルプロゞェクトの远加



WorkerRole.csファむルを開き、その内容を以䞋のコヌドに眮き換えたす。



 using System; using System.Collections.Specialized; using System.Diagnostics; using System.Net; using System.Threading; using Microsoft.ServiceBus; using Microsoft.ServiceBus.Messaging; using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.ServiceRuntime; using Microsoft.WindowsAzure.StorageClient; namespace WorkerRoleWithSBQueue1 { public class WorkerRole : RoleEntryPoint { // The name of your queue const string QueueName = "servicebustest"; // QueueClient is thread-safe. Recommended that you cache // rather than recreating it on every request QueueClient Client; bool IsStopped; public override void Run() { while (!IsStopped) { try { //   BrokeredMessage receivedMessage = null; receivedMessage = Client.Receive(); if (receivedMessage != null) { //  .       ,      ,     . GetBlobFromStorage("ourgallery", receivedMessage.GetBody<string>()); receivedMessage.Complete(); }} catch (MessagingException e) { if (!e.IsTransient) { Trace.WriteLine(e.Message); throw; } Thread.Sleep(10000); } catch (OperationCanceledException e) { if (!IsStopped) { Trace.WriteLine(e.Message); throw; }}}} public override bool OnStart() { CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSettingPublisher) => { var connectionString = RoleEnvironment.GetConfigurationSettingValue(configName); configSettingPublisher(connectionString); }); //      ServicePointManager.DefaultConnectionLimit = 12; //     ,      string sbconnectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString"); var namespaceManager = NamespaceManager.CreateFromConnectionString(sbconnectionString); if (!namespaceManager.QueueExists(QueueName)) { namespaceManager.CreateQueue(QueueName); } //     Service Bus Client = QueueClient.CreateFromConnectionString(sbconnectionString, QueueName); IsStopped = false; return base.OnStart(); } public override void OnStop() { //     Service Bus IsStopped = true; Client.Close(); base.OnStop(); } public void GetBlobFromStorage(string author, string title) { try { CloudBlob sourceBlob = getBlobContainer("ourgallery").GetBlobReference(title); CloudBlob newBlob = getBlobContainer("ourgallery").GetBlobReference(title + "small_copy"); newBlob.CopyFromBlob(sourceBlob); NameValueCollection metadata = new NameValueCollection(); metadata["title"] = title + "small_copy"; } catch (StorageClientException e) { Console.WriteLine(" : " + e.Message); System.Environment.Exit(1); }} public static CloudBlobContainer getBlobContainer(string userId) { var account = CloudStorageAccount.FromConfigurationSetting("storageaccount"); CloudBlobContainer container = account.CreateCloudBlobClient().GetContainerReference(userId); container.CreateIfNotExist(); return container; }}}
      
      





WebRole.csファむルをMVC4Galleryプロゞェクトに远加し、そのコンテンツを以䞋のコヌドで眮き換えたす。



 using System; using System.Collections.Generic; using System.Linq; using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.Diagnostics; using Microsoft.WindowsAzure.ServiceRuntime; using Microsoft.WindowsAzure.StorageClient; namespace MVC4Gallery { public class WebRole : RoleEntryPoint { public override bool OnStart() { RoleEnvironment.Changing += RoleEnvironmentChanging; return base.OnStart(); } private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e) { if (e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange)) { e.Cancel = true; }}}}
      
      





RolesクラりドプロゞェクトのMVC 4ギャラリヌでマりスの右ボタンをダブルクリックしお、Webロヌルを管理するためのGUIを開きたす図7。



clip_image010[4]

図 7. Webロヌル管理のグラフィカルむンタヌフェむス



[ 構成 ]タブで、[ 蚺断を有効にする ]オプションをオフにしたす。 [蚭定 ]タブに移動し、 [蚭定の 远加 ]をクリックしお、 storageaccountずいう新しい構成蚭定を䜜成したす。 そのタむプを接続文字列ずしお指定し、省略蚘号ボタンをクリックしお接続文字列を蚭定したす。 必芁なデヌタはパヌト1で蚘録されたした。 [ 蚭定の远加]をクリックし、 Microsoft.ServiceBus.ConnectionStringずいう名前タむプはStringを入力し、[ 倀]フィヌルドに次の行を挿入したす。



゚ンドポむント= sb// [名前空間] .servicebus.windows.net; SharedSecretIssuer = owner; SharedSecretValue = [DefaultKey]



Endpoint郚分の名前空間名、 SharedSecretIssuerの デフォルト発行者 、およびSharedSecretValueの デフォルトキヌはどこにありたすか。 OKをクリックしたす。 RolesクラりドプロゞェクトでWorkerRoleWithSBQueue 1を2回右クリックしお、Workerロヌルを管理するためのGUIを開きたす。



[ 構成 ]タブで、[ 蚺断を有効にする ]オプションをオフにしたす。 [蚭定 ]タブに移動し、 [蚭定の 远加 ]をクリックしお、 storageaccountずいう新しい構成蚭定を䜜成したす。 そのタむプを接続文字列ずしお指定し、省略蚘号ボタンをクリックしお接続文字列を蚭定したす。 必芁なデヌタはパヌト1で蚘録されたした。 [ OK]をクリックしたす。 接続文字列に必芁な倀を貌り付けお、 Microsoft.ServiceBus.ConnectionStringを構成したす。 必芁なデヌタはパヌト1に蚘録されたした- ゚ンドポむントパヌトのネヌムスペヌス名、 SharedSecretIssuerの デフォルト発行者 、およびSharedSecretValueの デフォルトキヌ 。 倉曎を保存しお、Workerロヌル管理のグラフィカルむンタヌフェむスを閉じたす。



F5キヌを抌しおプロゞェクトを開始したす。 プロゞェクトはロヌカルコンピュヌティング゚ミュレヌタで開始され、 ホヌム/むンデックスビュヌでブラりザが起動したす。



画像を遞択しお[ 保存 ]をクリックしたす 。 画像を読み蟌んだ埌、ペヌゞが曎新されたす。 珟時点では、アップロヌドした画像は1぀しか衚瀺されおいないこずに泚意しおください。 しばらくしおわずか数秒ペヌゞを曎新したす-今床は、むメヌゞプロセッサがキュヌをポヌリングし、Webロヌルからメッセヌゞを受信し、ブロブをダりンロヌドし、そのコピヌを䜜成しお、新しいブロブをリポゞトリに配眮する必芁がありたす。



Visual Studio 2012からクラりドサヌビスのWindows AzureプラットフォヌムにASP.NET MVC 4アプリケヌションを展開する





Windows Azureプラットフォヌムのクラりドサヌビスにアプリケヌションをデプロむするには、それに応じおVisual Studio 2012の発行機胜を構成する必芁がありたす。



MVC 4 Galleryクラりドプロゞェクトを右クリックしたす。 玺Azure [ 発行]をクリックしたす。 開いたダむアログボックスで、[ サブスクリプションの遞択 ]の䞋のリストを展開し、[ <管理...>]を遞択したす図12。



clip_image012[4]

図 12。



衚瀺されるWindows Azureクラりドサヌビスのプロゞェクト管理ダむアログボックスで、[ 新芏 ]をクリックしたす。 アプリケヌションのデプロむに䜿甚される新しい蚌明曞の適切な名前を入力したす。 [ OK]をクリックしたす。 [ フルパスのコピヌ]リンクをクリックしたす。 Windows Azure管理ポヌタルに移動したす。 [ ホステッドサヌビス、ストレヌゞアカりント、CDN ]タブをクリックしたす。 。 [ 管理蚌明曞 ]タブをクリックしたす。 。 [ 管理蚌明曞 ]タブで、[ 蚌明曞の远加 ]をクリックしたす。 開いた[ 新しい管理蚌明曞の远加 ]ダむアログボックスで、[ 参照 ]をクリックし、Visual Studioからコピヌした蚌明曞パスを[ファむル名]フィヌルドに貌り付けたす。 開くをクリックしたす。 OKをクリックしたす。 [ ホステッドサヌビス ]タブに移動し、[ プロパティ ]パネルからサブスクリプションIDをコピヌしたす 。 Visual Studio 2012に移動したす。コピヌしたサブスクリプション識別子を察応するフィヌルドに貌り付けたす図13。 OKをクリックしたす。



clip_image014[4]

図 13。



閉じるをクリックしたす 。 次ぞをクリックしたす。 [Windows Azureの公開蚭定]ペヌゞで、远加の展開オプションを構成できたす。 [ 公開]をクリックしたす。 Windows Azureアクティビティログビュヌで展開プロセスを確認できたす図14。



clip_image016[4]

図 14. Windows Azureアクティビティログの衚瀺



[ ホストされたサヌビス ]タブのWindows Azure管理ポヌタルに移動したす。 デプロむされたアプリケヌションを遞択し、[ プロパティ ]パネルの[ DNS名]フィヌルドのリンクをクリックしお、Webサむトに移動したす図15。

clip_image018

図 15. Windows Azure管理ポヌタル



サむトは、ロヌカルコンピュヌティング゚ミュレヌタヌに展開した埌ず同じように芋えるこずに泚意しおください。 これは、どちらの堎合もWindows Azureの実際のストレヌゞが䜿甚されるためです。 新しい画像を远加しお、結果を芳察したす。




All Articles