テスターですが何か?

ホビープログラマ略してHPです

【日本語訳】Exploring Windows Azure Storage part21

leave a comment »

このエントリーはMSDNのチュートリアル「Exploring Windows Azure Storage」の「Task2 – Using a Windows Azure Drive to Move the Application to the Cloud」の日本語訳になります。このコンテンツ、日本語訳全体については、こちらのエントリーを参照してください。

 

Task 2 – Using a Windows Azure Drive to Move the Application to the Cloud

アプリケーションをWindows Azureへ移行する際、画像の保存場所として自然な選択肢はBlobストレージです。しかしながら、アプリケーションで利用する画像がファイルシステム上に保存されていることを期待されることは多いはずです。保存されている画像にアクセスする部分のコードを書き換えてBlobサービスAPIを使用するように変更することは、どんなアプリケーションであっても可能です。本チュートリアルのような単純なアプリケーションであれば、コードを書き換えることはそれほど大変ではないかもしれませんが、もっと複雑なアプリケーションであれば非常に大変な作業なはずです。Windows Azure Drive を利用することで、ページBlob上のドライブをマウントすること以外は一切のコードの変更を伴わずにクラウド上へアプリケーションを移行することができます。

このエントリーでは、アプリケーションを変更し Windows Azure クラウドサービスとして動作し、Windows Azure Drive をストレージとして利用するようにします。

1.ソリューションにクラウドサービスプロジェクトを追加します。ソリューションエクスプローラーから、ソリューションのルートを右クリックし、[追加]-[新しいプロジェクト]を選択します。

2.新しいプロジェクトダイアログにて、お好みの言語(C# or VB)のインストールされたテンプレートをを展開し、Cloud を選択します。Windows Azure プロジェクト テンプレートを選択し、プロジェクトの名前を「PhotoAlbumService」、場所はデフォルトのまま「OK」をクリックします。

image

図36.Windows Azure Projectの作成(C#)

image

図37.Windows Azure Projectの作成(VB)

3.Windows Azure Project ダイアログにて、新しいロールの追加を行わずに「OK」をクリックします。既存のアプリケーションをWebロールとして利用します。

4.Windows Azure サポートアセンブリへの参照を追加します。ソリューションエクスプローラーより、PhotoAlbum プロジェクトを右クリックし、[参照の追加]を選択します。参照の追加ダイアログにて.NETタブへ移動し、Microsoft.WindowsAzure.CloudDrive, Microsoft.WindowsAzure.Diagnostics, Microsoft.WindowsAzure.ServiceRuntime, Microsoft.WindowsAzure.StorageClient を選択して[OK]をクリックします。

image

図38.Windows Azure サポートアセンブリへの参照を追加

5.ソリューションエクスプローラーから、PhotoAlbumService プロジェクトの Role を右クリックし、[追加]-[ソリューション内のWebロールプロジェクト]を選択します。

6.ロールプロジェクトとの関連付けダイアログから、PhotoAlbum プロジェクトを選択し、[OK]をクリックします。

7.Webロールの設定を行います。PhotoAlbumService プロジェクトのロールの下にある PhotoAlbum ロールをダブルクリックします。

8.PhotoAlbum[ロール] プロパティウィンドウにて、[設定]タブを選択し[設定の追加]をクリックします。名前を「DataConnectionString」、種類を「接続文字列」に設定し、[…]ボタンをクリックしてストレージエミュレーターを利用するように設定します。

9.2つめの設定としてBlobストレージ上のクラウドドライブのURLの設定を行います。名前に「ImageStoreBlobUri」、種類に「文字列」、値を「mydrives/SamplePictures.vhd」とします。

image

図39.Webロールの設定

Note: 設定「ImageStoreBlobUri」はBlobサービスURIを識別し、大文字小文字を区別します。正確に入力されているか確認してください。

10.[ローカルストレージ]タブへ移動し、[ローカルストレージの追加]をクリックします。新しいストレージの設定の名前に「LocalDriveCache」サイズを120と入力し、「ロールのリサイクル時に消去」のチェックは未選択状態のままとします。

image

図40.Webロールのローカルストレージ設定

Note: 「ロールのリサイクル時に消去」のチェックがOFFの場合、ロールのインスタンスがリサイクルされてもキャッシュは永続化されたままとなります。
システムがローカルストレージを割り当てる方法に起因して、要求された領域の一部はキャッシュとして利用することはできません。Windows Azure Guest OS 1.8に関して言えば、全Windows Azure Driveキャッシュは事前に割当てられ、ローカルにキャッシュ用の十分な領域がなかった場合は、マウント処理が失敗します。この問題を回避するために、Azure Driveキャッシュ用のサイズの設定の際には、明示的にサイズを上乗せします。例えば、1000MBのキャッシュを利用するためには、キャッシュサイズを1020MBに設定します。

11.CTRL+Sを押下して、ロールの設定を保存します。

12.Windows Azure ログに診断情報を出力するためにTraceListenerの設定を行います。ソリューションエクスプローラーからWeb.config ファイルをダブルクリックしてファイルを開き、以下の system.diagnostics セクションを設定ファイルに追加します。

(コードスニペット – ExploringWindowsAzureStorage-Ex04-01-DiagnosticMonitorTraceListener)

<?xml version="1.0"?>
<configuration>
  <system.diagnostics>
    <trace>
      <listeners>
        <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
          name="AzureDiagnostics">
          <filter type="" />
        </add>
      </listeners>
    </trace>
  </system.diagnostics>
</configuration>

13.Webロールプロジェクトにロールの初期化と終了を行うためのクラスを追加します。ソリューションエクスプローラーから、PhotoAlbum プロジェクトを右クリックし、[追加] – [既存の項目]を選択します。既存項目の追加ダイアログより「Ex04-WorkingWithDrives\Assets」へ移動し WebRole.cs / WebRole.vb を選択して[追加]をクリックします。

Note: WebRole(.cs|.vb)ファイルは標準の RoleEntryPoint から派生したクラスです。Visual Studio の 新規Webロールプロジェクトから自動生成されたファイルと同じです。

14.Global.asax.cs / Global.asax.vb ファイルの Application_Start メソッドへ移動し、以下のコードを追加します。

(コードスニペット – ExploringWindowsAzureStorage-Ex04-02-ApplicationStartMethod-CS)

        protected void Application_Start(object sender, EventArgs e)
        {
            if (imageStorePath == null)
            {
                ImageStorePath = WebConfigurationManager.AppSettings["ImageStorePath"];
            }

            // initialize storage account configuration setting publisher
            CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
            {
                string connectionString = RoleEnvironment.GetConfigurationSettingValue(configName);
                configSetter(connectionString);
            });
            try
            {
                // initialize the local cache for the Azure drive
                LocalResource cache = RoleEnvironment.GetLocalResource("LocalDriveCache");
                CloudDrive.InitializeCache(cache.RootPath + "cache", cache.MaximumSizeInMegabytes);
                // retrieve storage account 
                CloudStorageAccount account = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
                // retrieve URI for the page blob that contains the cloud drive from configuration settings 
                string imageStoreBlobUri = RoleEnvironment.GetConfigurationSettingValue("ImageStoreBlobUri");
                // unmount any previously mounted drive.
                foreach (var drive in CloudDrive.GetMountedDrives())
                {
                    var mountedDrive = account.CreateCloudDrive(drive.Value.PathAndQuery);
                    mountedDrive.Unmount();
                }
                // create the Windows Azure drive and its associated page blob
                CloudDrive imageStoreDrive = account.CreateCloudDrive(imageStoreBlobUri);
                try
                {
                    imageStoreDrive.Create(16);
                }
                catch (CloudDriveException)
                {
                    // drive already exists
                }
                // mount the drive and initialize the application with the path to the image store on the Azure drive
                Global.ImageStorePath = imageStoreDrive.Mount(cache.MaximumSizeInMegabytes / 2, DriveMountOptions.None);
            }
            catch (CloudDriveException driveException)
            {
                Trace.WriteLine("Error: " + driveException.Message);
            }
        }

(コードスニペット – ExploringWindowsAzureStorage-Ex04-02-ApplicationStartMethod-VB)

    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        If imageStorePath Is Nothing Then
            imageStorePath = WebConfigurationManager.AppSettings("ImageStorePath")
        End If

        ' initialize storage account configuration setting publisher
        CloudStorageAccount.SetConfigurationSettingPublisher(Function(configName, configSetter) ConfigurationSettingPublisher(configName, configSetter))

        Try
            ' initialize the local cache for the Azure drive
            Dim cache As LocalResource = RoleEnvironment.GetLocalResource("LocalDriveCache")
            CloudDrive.InitializeCache(cache.RootPath & "cache", cache.MaximumSizeInMegabytes)
            ' retrieve storage account
            Dim account As CloudStorageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString")
            ' retrieve URI for the page blob that contains the cloud drive from configuration settings 
            Dim imageStoreBlobUri As String = RoleEnvironment.GetConfigurationSettingValue("ImageStoreBlobUri")
            ' unmount any previously mount drive
            For Each drive In CloudDrive.GetMountedDrives()
                Dim mountedDrive = account.CreateCloudDrive(drive.Value.PathAndQuery)
                mountedDrive.Unmount()
            Next
            ' create the Windows Azure drive and its associated page blob
            Dim imageStoreDrive As CloudDrive = account.CreateCloudDrive(imageStoreBlobUri)
            Try
                imageStoreDrive.Create(16)
            Catch e1 As CloudDriveException
                ' drive already exists
            End Try
            ' mount the drive to retrieve its path and initialize the application with the path to the image store on the Azure drive
            Global_asax.ImageStorePath = imageStoreDrive.Mount(cache.MaximumSizeInMegabytes / 2, DriveMountOptions.None)
        Catch driveException As CloudDriveException
            Trace.WriteLine("Error: " & driveException.Message)
        End Try

    End Sub

Note:

上記コードは前手順でWebロールの設定で定義したローカルストレージのパスを取得し、ドライブキャッシュの初期化とローカルディスク領域に最大サイズの割り当てを行います。次に、ページBlob のURLを特定するCloudDrive オブジェクトを作成します。ページBlobのURLは同様に前の手順で設定した内容です。最後にフォーマットされたページBlobにドライブレターを割り当て、Windows Azure アプリケーションから利用できるようにします。

ドライブに割当てられたキャッシュの容量は、キャッシュとして確保された容量の半分であることに気づくと思います。演習の後手順で、2つめのドライブを作成して残りを割当てます。

15.VBを利用している場合、Global.asax.vb の最後に以下のコードを追加する必要があります。

(コードスニペット – ExploringWindowsAzureStorage-Ex04-03-ConfigurationSettingPublisher-VB)

    Private Function ConfigurationSettingPublisher(ByVal configName As Object, ByVal configSetter As Func(Of String, Boolean)) As Object

        Dim connectionString As String = RoleEnvironment.GetConfigurationSettingValue(configName)
        configSetter(connectionString)
        Return Nothing

    End Function

        protected void Application_End(object sender, EventArgs e)
        {
            // obtain a reference to the cloud drive and unmount it
            CloudStorageAccount account = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
            string imageStoreBlobUri = RoleEnvironment.GetConfigurationSettingValue("ImageStoreBlobUri");
            CloudDrive imageStoreDrive = account.CreateCloudDrive(imageStoreBlobUri);
            imageStoreDrive.Unmount();
        }

16.Global.asax.cs / Global.asax.vb の先頭に以下の名前空間宣言が存在することを確認します。

(コードスニペット – ExploringWindowsAzureStorage-Ex04-04-GlobalNamespace-CS)

using System.Diagnostics;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.StorageClient;

(コードスニペット – ExploringWindowsAzureStorage-Ex04-04-GlobalNamespace-VB)

Imports System.Diagnostics
Imports Microsoft.WindowsAzure
Imports Microsoft.WindowsAzure.ServiceRuntime
Imports Microsoft.WindowsAzure.StorageClient

17.次に、Application_End メソッドに Webロール終了の際にWindows Azure Drive をアンマウントする処理を追加します。コードはメソッドの先頭に追加します。

(コードスニペット – ExploringWindowsAzureStorage-Ex04-05-ApplicationEndMethod-CS)

        protected void Application_End(object sender, EventArgs e)
        {
            // obtain a reference to the cloud drive and unmount it
            CloudStorageAccount account = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
            string imageStoreBlobUri = RoleEnvironment.GetConfigurationSettingValue("ImageStoreBlobUri");
            CloudDrive imageStoreDrive = account.CreateCloudDrive(imageStoreBlobUri);
            imageStoreDrive.Unmount();
        }

(コードスニペット – ExploringWindowsAzureStorage-Ex04-05-ApplicationEndMethod-VB)

    Sub Aplication_End(ByVal sender As Object, ByVal e As EventArgs)

        ' obtain a reference to the cloud drive and unmount it
        Dim account As CloudStorageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString")
        Dim imageStoreBlobUri As String = RoleEnvironment.GetConfigurationSettingValue("ImageStoreBlobUri")
        Dim imageStoreDrive As CloudDrive = account.CreateCloudDrive(imageStoreBlobUri)
        imageStoreDrive.Unmount()

    End Sub

Note:上記コードはマウントされているクラウドドライブへの参照を取得し、アンマウントを行っています。

18.これでアプリケーションをWindows Azure 上で動作させる準備ができました。F5キーを押下してアプリケーションをビルド・コンピュートエミュレーター上で起動します。アプリケーションが開始すると、初期状態は空ですが Windows Azure Drive のコンテンツを表示します。ページの表示内容から、Image Store Driveにドライブ文字が割当てられていることに気づくと思います。しばらくブラウザは起動したままにしておきます。

image

図41.コンピュートエミュレーター上での実行(画像格納ドライブが空)

19.次に、ストレージエミュレーターがクラウドドライブをシミュレートして利用するフォルダの場所を決定します。Windows Azure トレイアイコンを右クリックして[Show Storage Emulator UI]を選択して、ストレージエミュレーターのUIを表示します。

image

図42.ストレージエミュレーターのUIを表示

20.コンピュートエミュレーターのUIの[File]メニューから[Open Azure Drive Folder in Windows Explorer]を開きます。

Note: ローカルで動作している際には、ストレージエミュレーターはクラウドドライブのシミュレートにBlobストレージを使用していません。代わりに、ローカルフォルダをドライブにマッピングしています。ストレージエミュレーターのUIから、ストレージエミュレーターが Windows Azure Drive としてシミュレートして利用している一時フォルダをエクスプローラーで見ることができます。

21.Azure Driveフォルダ内の、「devstoreaccount1\mydrives\SamplePictures.vhd」へ移動します。このパスはストレージエミュレーターのBlob URIと一致していることに気づくと思います。したがって、「devstoreaccount1」とは、ドライブの保存場所として割当てられたプレフィックスです。

22.では、スタートメニューからピクチャを選択してピクチャライブラリを開き、サンプルピクチャフォルダをダブルクリックしてサンプル画像が保存されているディレクトリを表示します。

image

図44.サンプルピクチャライブラリ

Note:「サンプルピクチャー」ライブラリは通常Windowsのインストールで有効にされており、場所は「%PUBLIC%\Pictures\Sample Pictures」です。ライブラリにはいくつかの画像ファイルが含まれています。お使いの環境でこのフォルダが存在しない場合、JPEG,PNG形式の画像ファイルが含まれているディレクトリに変更することも出来ます。例えば、この演習のソースのルートディレクトリから「Assets\Image」へ移動すると画像が含まれたディレクトリになっています。

23.前手順で決めたシミュレートされたクラウドドライブへ、画像ファイルをいくつかコピーします。

24.ブラウザへ戻り、ページを再表示します。前手順でコピーしたファイルの情報がページ上に表示されたことに気づくと思います。

image

図45.Windows Azure Driveへアップロードされたコンテンツを表示

25.ブラウザを閉じます。

 

次は「Task3 – Creating a New Drive in the Cloud」です。

Written by david9142

2011年12月27日 @ 1:31 AM

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。