SE の雑記

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

同一スクリプトで VM Role のインスタンス毎に異なる領域をマウント

leave a comment

前回の投稿では単一の VM Role のインスタンスで Windows Azure Storage を Windows Azure Drive としてマウントをしました。

image

今回は複数のインスタンスを起動した場合の対応について考えてみたいと思います。

 

■前回のスクリプトで複数のインスタンスを起動した場合の挙動


前回の投稿のスクリプトでは、マウント対象を以下のように指定していました。

$clouddrive = [Microsoft.WindowsAzure.StorageClient.CloudStorageAccountCloudDriveExtensions]::CreateCloudDrive($account, "$($account.BlobEndpoint)persistent/PersistentDisk.vhd")

マウント対象の VHD は [PersisitentDisk.vhd] と決め打ちで記述していました。

それでは、このスクリプトを使用している状態でで VM Role のインスタンスを 2 インスタンス起動してみたいと思います。

後から起動したインスタンスでは、以下のエラーが発生して Page Blob はマウントされていません。

"2" 個の引数を指定して "Mount" を呼び出し中に例外が発生しました: "Unknown Error HRESULT=D0000708"
発生場所 C:ToolsMountDrive.ps1:35 文字:33
+ $driveletter = $clouddrive.Mount <<<< (100, [Microsoft.WindowsAzure.StorageClient.DriveMountOptions]::None)
    + CategoryInfo          : NotSpecified: (:) []、MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

Page Blob の領域ですが同一の領域を 2 つのインスタンスから Azure Drive としてマウントすることはできません。

image

複数のインスタンスで Azure Drive として Page Blob をマウントするためにはそれぞれのインスタンスで異なる Page Blob の領域をマウントする必要があります。

 

■インスタンスごとに異なる領域をマウント


以下のような形でインスタンスごとに異なる領域をマウントすることで、各インスタンスに永続化したデータ領域を持たせることが可能となります。
image

Widnows Azure 上のインスタンスですが、インスタンスごとに以下のような ID が割り当てられます。
image

この ID をマウントする VHD の名称として使用することで、インスタンスごとに異なる領域の Page Blob をマウントすることが可能となります。

今回は以下の名称の VHD を Page Blob としてアップロードしておきました。
image

[インスタンス ID.vhd] という形式になっています。
あとはスクリプトを修正してインスタンス ID 名の 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"

# サービスの起動が完了するまで待機
while((Get-Service -Name "Windows Azure Cloud Drive Provider").Status -ne "Running"){
    Start-Sleep -s 10
}

while((Get-Service -Name "Windows Azure Integration Components").Status -ne "Running"){
    Start-Sleep -s 10
}

while((Get-Service -Name "Windows Azure Remote Forwader Service").Status -ne "Running"){
    Start-Sleep -s 10
}

# Azure Storag に接続するための接続文字列をサービスモデルで定義した設定から取得
$connection = [Microsoft.WindowsAzure.CloudStorageAccount]::Parse([Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::GetConfigurationSettingValue("StorageConnectionString"))
while (!$?) {
    $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/$([Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::CurrentRoleInstance.Id).vhd")
$driveletter = $clouddrive.Mount(100, [Microsoft.WindowsAzure.StorageClient.DriveMountOptions]::None)

[RoleEnvironment] クラスの、[CurrentRoleInstance] からインスタンス ID の取得をして、VHD の名称として使用しています。
# Twitter で教えていただけました。ありがとうございます!!
このようなスクリプトを使用することで、一つのスクリプトでインスタンス別にマウントする VHD を変更することが可能となります。
image

今回作成したスクリプトは以下に保存してありますので、興味のある方がいらっしゃいましたらご利用ください。
Azure Drive サンプルスクリプト (マルチインスタンス対応)

今は、各インスタンスで独立したディスクを使用していますが、インスタンス間のディスクでデータ同期みたいなことができると面白そうですね。

VM Role。なかなか調べることが尽きないので結構面白いですね。

Written by masayuki.ozawa

1月 29th, 2011 at 11:28 pm

Posted in Windows Azure

Tagged with ,

No Responses to '同一スクリプトで VM Role のインスタンス毎に異なる領域をマウント'

Subscribe to comments with RSS or TrackBack to '同一スクリプトで VM Role のインスタンス毎に異なる領域をマウント'.

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

Leave a Reply

*