SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

VM Role で Windows Azure Drive を使用

leave a comment

今週は VM Role 上のデータの永続化についていろいろと考えてみました。

VM Role でローカルドライブの間隔でデータを永続化するためには、[Windows Azure Drive] を使うのが手軽そうでしたので、今回は VM Role で Windows Azure Drive を使用するための手順をまとめてみたいと思います。

 

■VM Role のドライブ構成


まずは、VM Role のドライブ構成を確認してみたいと思います。

VM Role のディスクですが以下のように 3 本のディスクが認識されています。
# ディスク 0 / 1 の 2 本構成だと思っていたのですが、3 本でした…。
image

ディスク 0 csupload で Windows Azure 上にアップロードした VHD
ディスク 1 VM Role で自動的に作成される、ローカルストレージ用のディスク
ディスク 2 パッケージを展開したもの?

ディスク 2 の用途はいまいちわかっていないのですが、ディスク 0 / 1 に関しては上の表のようになると思います。

ディスク 2 ですが以下のようなファイルが格納されています。
image
image

ドライブレターが割り当てられていないディスクになりますので触ることはないと思いますが。

 

通常、使用するディスクの構成を簡単に絵にまとめると以下のようになります。
image

D ドライブのローカルストレージ用のディスクに関しては、C ドライブの [Resources] フォルダとして自動的にジャンクションポイントが作成されます。
image

VM Role のディスク 0 に関しては複数のパーティションを作成することが可能です。
そのため、ローカルストレージ用のディスクのドライブ文字も [D] ドライブ以外になる可能性があると思います。
その対応として [C:Resources] にローカルストレージ用のドライブをジャンクションポイントとして作成し、統一したアクセスができるようにしているのだと考えています。

VM Role のディスクの基本構成に関してはこのようになるかと。

 

■ローカルストレージの設定


Web Role をあまり触っていないのでこのような書き方でよいのかが分かっていないのですが…。

Web Role ではローカル ストレージを使用するときは、Web ロールのプロパティを開いてローカル ストレージから設定を行います。
image

VM Role ではローカル ストレージという設定が存在していません。
image

ローカル ストレージの設定が無いから Web Role のように設定ができないかというと、そのようなことはなく、[ServiceDefinition.csdef] (サービス定義ファイル) を直接編集することでローカル ストレージの設定をすることが可能です。
image

今回は以下のように設定をしてみました。
# [name] は任意の値になります。

<LocalResources>
  <LocalStorage name="AzureLocalStorage" />
</LocalResources>

というように指定をすることで、ローカル ストレージを作成することが可能です。
VM Role のサービス定義ファイルのスキーマ構成に関しては、以下の技術情報に詳細が記載されています。
VirtualMachineRole Schema

Web / Worker Role では、[cleanOnRoleRecycle] [sizeInMB] を指定することが可能なのですが、VM Role では、[name] しか指定することができないというのが特徴かもしれないですね。

サービス定義ファイルのスキーマ構成に関しては以下の技術情報を見ると網羅できそうです。
Windows Azure Service Definition Schema

サービス定義ファイルでローカルストレージの指定をしない場合、ローカルストレージ用のディスクの内容は以下のように診断ストアしか存在しない状態になっています。
image

ローカル ストレージの設定がない状態でも、Windows Azure Drive で使用するキャッシュの作成はできるのですが、後述の[GetLocalResource] でローカル ストレージの名称が取れなくなってしまいますので、指定はしておいた方が良いかなと思っています。
# GetLocalResource でパスを取得しなくても、[C:Resources] に対してキャッシュを作成すればキャッシュのディレクトリを作れるのですが。

サービス定義ファイルで [<LocalResource>] を設定すると、指定した名称でローカルストレージ用のディスクにローカルストレージの領域が作成されます。
image
今回の投稿では、[AzureLocalStorage] という名称のローカルストレージを使用していきます。

 

■診断ストアの設定


これはディスク構成とは関係はないのですが。

診断のディレクトリ [C:ResourcesDiagnosticStore] ですが、VM Role の設定によってディレクトリ構造が多少変わってきます。

設定を開発用ストレージにした場合は [CrashDumps] ディレクトリのみなのですが、
image
image

ストレージアカウントを設定をすることで[Monitor] というディレクトリが作成されます。
image
image

この中には、[Configuration] と [Tables] というディレクトリがあり以下のファイルが格納されています。
image
image
診断結果用のテーブルストレージだと思うのですが、この辺は後で調査をしないと。

 

■Page Blob に VHD をアップロード


それでは本題の VM Role で Windows Azure Drive を使用するための手順についてまとめていきたいと思います。

Windows Azure Drive で使用するディスク領域ですが Windows Azure Storage の [Page Blob] を使用する必要があります。

Page Blob を直接マウントする方法と Page Blob としてアップロードした VHD をマウントする 2 種類の方法がとれるようです。
このあたりは以下の技術情報を参考にさせていただきました!!

第 5 回 Azure ストレージ & Storage Client API を極める
[Drive][Azure] ローカルPCで作成したVHDファイルをAzure Driveとしてマウントする

今回は、VHD ファイルを使用する方法で検証をしてみたいと思います。

– VHD ファイルを Page Blob にアップロード –

Azure の小ネタ さんのブログでは、コマンドで VHD を作成するための方法を紹介されていましたので、私は GUI から作成する方法で書いてみたいと思います。
環境は Windows 7 で実行しています。

  1. [diskmgmt.msc] を実行します。
    image
  2. [操作] → [VHD の作成] をクリックします。
    image
  3. 仮想ハードディスクの作成場所とサイズ / フォーマットを設定して、[OK] をクリックします。
    今回は 100MB の固定ディスクで作成しています。
    # 可変でも試してみたのですが、可変ディスクだとマウントがうまくできませんでした…。
    image
  4. ディスクが接続されたら初期化してフォーマットをしておきます。
    初期化 / フォーマットしていないディスクだと、Azure Drive としてマウントをした時に [マウント] → [アンマウント] を繰り返してしまい、うまく動作しませんでした。
    image
  5. 作成したディスクを切断します。
    image
    image

これで Azure Drive で使用する VHD の作成は完了です。
つづいて作成した VHD を Azure Storage に Page Blob としてアップロードします。

 

– VHD を Page Blob としてアップロード –

Windows Azure Storage を操作するためのツールとして以下のものがあるかと思います。

CloudXplorer
Azure Storage Explorer

Azure Storage Explorer では、VHD が Block Blob としてしかアップロードできなかったので、今回は CloudXplorer を使用しました。

CloudXplorer のインストールはファイルをダウンロードして、[setup.msi] を実行して、インストーラーの指示に従ってクリックするだけですので、簡単に導入することが可能です。
インストールが完了したら起動します。
image

それでは、実際に Azure Storage に接続をしたいと思います。

  1. [File] → [Accounts] をクリックします。
    image
  2. [New] → [Windows Azure account] をクリックします。
    image
  3. Storage  Account のアカウント名と Secret Key を入力して、[OK] をクリックします。
    # 両設定は、Management Portal から確認できます。
    image
  4. [OK] をクリックします。
    image

これで、Azure Storage への接続が完了です。

VHD をアップロードするための前段階として、コンテナを作成します。

  1. Azure Storage のアカウントを展開して、右のペインで右クリックをして [New] → [Container] をクリックします。
    image
  2. コンテナ名を入力します。今回は [persistent] としています。
    # コンテナ名はすべて小文字で入力する必要があります。
    image

 

コンテナの作成が完了したら先ほど作成した VHD をアップロードします。

  1. 作成したコンテナを選択し、[Upload page blob] をクリックします。
    image
  2. VHD を選択して、[開く] をクリックしてアップロードをします。
    image
    image

以上で、VHD の Page blob としてのアップロードは完了です。
image

 

 

■サービスモデルの設定


必須ではないのですが、VM Role のサービスモデルの設定で、Azure Storage の接続文字列を設定しておくとコード側から接続情報が取得しやすくなりますので、設定をしておきたいと思います。
# コードに接続情報を直接書いてしまっても動くのですが。

  1. VWD で VM Role のプロパティを開きます。
  2. [設定] → [設定の追加] をクリックします。
    image
  3. 設定の名前を入力し、[種類] を [接続文字列] に設定し、[…] をクリックします。
    今回は [StorageConnectionString] という設定名にしています。
    image
  4. [ストレージ アカウントの資格情報の入力] を選択して、Azure Storage の Account 名と SecretKey を入力し、[OK] をクリックします。
    情報は CloudXplorer で入力したものと同じですね。
    image

以上で設定は完了です。

このサービスモデルを使用して VM Role のインスタンスを起動します。

 

 

■VM Role で Windows Azure Drive を使用


それでは、アップロードした VHD を VM Role から Windows Azure Drive としてマウントしたいと思います。

初期の状態のディスク構成はこのようになっています。
image

 

Azure Drive を使用するために必要となるアセンブリですが、VM Role 用の統合コンポーネントをインストールすると [C:Program FilesWindows Azure Integration Componentsv1.3ref] に導入されています。
image

はじめ、Windows Azure SDK 1.3 をインストールしておく必要があるかなと思っていたのですが、統合コンポーネントに含まれていたのですよね。

 

今回はこれらのアセンブリを使用した PowerShell から Azure Drive として Page Blog の VHD をマウントしてみます。

以下のスクリプトを作ってみました。
# 改行されてしまっている箇所は一行で入力します。

# 必要となるアセンブリの参照
Add-Type -Path "C:Program FilesWindows Azure Integration Componentsv1.3refMicrosoft.WindowsAzure.StorageClient.dll"
Add-Type -Path "C:Program FilesWindows Azure Integration Componentsv1.3refMicrosoft.WindowsAzure.CloudDrive.dll"
Add-Type -Path "C:Program FilesWindows Azure Integration Componentsv1.3refMicrosoft.WindowsAzure.ServiceRuntime.dll"

# Azure Storag に接続するための接続文字列をサービスモデルで定義した設定から取得
$connection = [Microsoft.WindowsAzure.CloudStorageAccount]::Parse([Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::GetConfigurationSettingValue("StorageConnectionString"))

# Azure Storage に接続
$account = New-Object Microsoft.WindowsAzure.CloudStorageAccount( $connection.Credentials, $false)

# ローカルストレージに Azure Drive 用のキャッシュディレクトリを作成
# GetLocalResource で指定しているのは、サービス定義ファイル (csdef) で指定した LocalStorage の設定値
$localstorage = [Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::GetLocalResource("AzureLocalStorage")
[Microsoft.WindowsAzure.StorageClient.CloudDrive]::InitializeCache($localstorage.RootPath + "cache", $localstorage.MaximumSizeInMegabytes)

# Azure Drive として、VHD をマウント
$clouddrive = [Microsoft.WindowsAzure.StorageClient.CloudStorageAccountCloudDriveExtensions]::CreateCloudDrive($account, "$($account.BlobEndpoint)persistent/PersistentDisk.vhd")
$driveletter = $clouddrive.Mount(100, [Microsoft.WindowsAzure.StorageClient.DriveMountOptions]::None)

image

[FromConfigurationSetting] を使用していないのは、[SetConfigurationSettingPublisher needs to be called before FromConfigurationSetting can be used] の対応を PowerShell でどうやって実装するのかが分からずに諦めたからです…。

 

このスクリプトを [MountDrive.ps1] として保存して、実行してみたいと思います。
事前に、[Set-ExecutionPolicy RemoteSigned] を実行して、未署名スクリプトの実行は許可しておきます。
# [管理者として実行] した PowerShell のウィンドウから実行する必要があります。
image

ドライブをマウントするためには強めの権限が必要となりますので、[管理者として実行] した PowerShell のウィンドウを開き、
image

先ほど作成した [ps1] ファイルを実行します。
image

スクリプトの実行が完了するとディスクの構成はこのようになります。
image

Page Blob にアップロードした VHD がマウントされ手いることが確認できます。
# ディスク 3 がマウントされたディスクです。VHD マウントではなく物理ディスクとしてマウントされるんですね。

Azure Drive を使用することでこのような構成とすることができます。
image

VM Role 上の領域は非永続領域 (初期化されることがある) となりますが、Azure Storage を Drive としてマウントすることで、VM Role で永続領域を確保することが可能となります。

今回は手動で PowerShell のスクリプトを実行しましたが、このままではインスタンスを実行するたびに手動で永続領域をマウントする必要があります。

次の投稿では、VM Role 起動時に自動で Azure Drive として領域をマウントするように構成したいと思います。

Written by masayuki.ozawa

1月 29th, 2011 at 12:33 pm

Posted in Windows Azure

Tagged with ,

No Responses to 'VM Role で Windows Azure Drive を使用'

Subscribe to comments with RSS or TrackBack to 'VM Role で Windows Azure Drive を使用'.

  1. […] This post was mentioned on Twitter by Shinichiro Isago and 割と普通, 小澤真之(Masayuki Ozawa). 小澤真之(Masayuki Ozawa) said: VM Role で Windows Azure Drive を使用を投稿しました。 データ永続化の第一歩。 http://tinyurl.com/4aqkpxr #AzureJP #jazug […]

  2. […] VM Role で Windows Azure Drive を使用 VM Role 起動時に Windows Azure Drive を自動でマウント 同一スクリプトで VM Role のインスタンス毎に異なる領域をマウント […]

Leave a Reply

*