Category Archives: Azure

Azure上の仮想マシンのディスク拡張手法 2016年1月版


Azure上の仮想マシンのディスクがいっぱいになったので拡張する必要があった。

2015年6月にやったときは、「Azure上の仮想ディスクを拡張する」の手順でやろうとしたら、Windows7のPowerShellからではうまくいかずに、WindowsServer2012R2の仮想マシンを別途立て、そこから実行して拡張した。

で・・・今回、Windows7から実行できるようになっていないかを確認しつつ手順を確認していった。

参考資料
・「How to install and configure Azure PowerShell
・「Azure 仮想マシン (IaaS VM) のディスクの拡張について

2016年1月18日時点でのポイント

・最新版のAzure PowerShellは、Githubの「https://github.com/Azure/azure-powershell」で公開されている

・最新版はversion 1.1.0。ただし、PoewrShell 1.0,2.0環境では動かない。

・インストールは「Microsoft Web Platform Installer」による統合的なインストールか、「http://aka.ms/webpi-azps」(今日時点だとWindowsAzurePowershellGet.3f.3f.3fnew.exeがダウンロードされる)による単独インストールにて行う
(古いバージョンは勝手にアンインストールしてくれる)

・ディスク拡張時は、Aazure仮想マシンは停止している必要がある

・「Update-AzureDisk」は、ラベル名も指定しないとエラーになる。
 しかも、ラベル名設定していない場合に「-Label “”」とやってもエラーになる。
 「-Label ” “」とスペースでもいいので指定しなければならない

・現状の仮想ディスクのラベル名情報を確認するには「Get-AzureDisk」で行う

・以前はサブスクリプションの選択とかストレージアカウントの選択など、面倒な処理が必要だったが
 省略できるようになっている。

実際にやった手順の概要

1. Microsoft Azure PowerShellを起動
2. 「Add-AzureAccount」で認証
3. 「Get-AzureVM」でAzure仮想マシン一覧を取得

PS C:\> Get-AzureVM
ServiceName                             Name                                    Status
-----------                             ----                                    ------
service-test                            webserver1                              ReadyRole
service-test                            sqlserver1                              ReadyRole
service-test2                           webserver1                              StoppedVM
service-test2                           sqlserver1                              StoppedVM
PS C:\>

4. 対象仮想マシンの仮想マシン情報を取得
「(Get-AzureVM -ServerName サービス名 -Name 仮想マシン名).VM」を実行する。

PS C:\> (Get-AzureVM -ServiceName servite-test2 -Name sqlserver1).VM
AvailabilitySetName               :
ConfigurationSets                 : {Microsoft.WindowsAzure.Commands.ServiceManagement.Model.NetworkConfigurationSet}
DataVirtualHardDisks              : {servite-test2-sqlserver1-0-201412020519500167, servite-test2-sqlserver1-1-201412020521210099}
Label                             :
OSVirtualHardDisk                 : Microsoft.WindowsAzure.Commands.ServiceManagement.Model.OSVirtualHardDisk
RoleName                          : servite-test2
RoleSize                          : Standard_D2
RoleType                          : PersistentVMRole
WinRMCertificate                  :
X509Certificates                  :
NoExportPrivateKey                : False
NoRDPEndpoint                     : False
NoSSHEndpoint                     : False
DefaultWinRmCertificateThumbprint :
ProvisionGuestAgent               : True
ResourceExtensionReferences       : {BGInfo, IaaSAntimalware}
DataVirtualHardDisksToBeDeleted   :
VMImageInput                      :
PS C:\>

上記出力中の「DataVirtualHardDisks」がディスクの名前。
このAzure仮想マシンには2つのディスクが接続されている。

5. 「Get-AzureDisk -DiskName “ディスクの名前”」でディスク情報の詳細を取得

PS C:\> Get-AzureDisk -DiskName "servite-test2-sqlserver1-0-201412020519500167"
AffinityGroup        :
AttachedTo           : RoleName: sqlserver1
                       DeploymentName: sqlserver1
                       HostedServiceName: service-test2
IsCorrupted          : False
Label                :
Location             : Japan West
DiskSizeInGB         : 200
MediaLink            : https://xxxxxxxxxx.blob.core.windows.net/vhds/sqlserver1-E-drive.vhd
DiskName             : servite-test2-sqlserver1-0-201412020519500167
SourceImageName      :
OS                   :
IOType               : Standard
OperationDescription : Get-AzureDisk
OperationId          : 2905xxxx-xxxx-xxxx-xxxx-1252bc53xxxx
OperationStatus      : Succeeded
PS C:\>

6. 「Update-AzureDisk -DiskName “ディスク名” -ResizedSizeInGB 数値 -Label “ラベル名”」でディスクの容量指定

PS C:\> Update-AzureDisk -DiskName "servite-test2-sqlserver1-0-201412020519500167" -ResizedSizeInGB 250 -Label " "
OperationDescription                    OperationId                             OperationStatus
--------------------                    -----------                             ---------------
Update-AzureDisk                        9154xxxx-xxxx-xxxx-xxxx-f79f842fxxxx    Succeeded
PS C:\>

Get-AzureDiskで確認したときに「Label:」になにもないからといって、-Labelを指定しないと・・・

PS C:\> Update-AzureDisk -DiskName "servite-test2-sqlserver1-0-201412020519500167" -ResizedSizeInGB 250
Update-AzureDisk : 値を Null にすることはできません。
パラメーター名:parameters.Label発生場所 行:1 文字:1
+ Update-AzureDisk -DiskName "servite-test2-sqlserver1-0-201412020519500167" -R ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : CloseError: (:) [Update-AzureDisk]、ArgumentNullException
    + FullyQualifiedErrorId : Microsoft.WindowsAzure.Commands.ServiceManagement.IaaS.UpdateAzureDiskCommand
PS C:\>

なにも設定されていないから「-Label “”」としても・・・

PS C:\> Update-AzureDisk -DiskName "servite-test2-sqlserver1-0-201412020519500167" -ResizedSizeInGB 250 -label ""
Update-AzureDisk : パラメーター 'Label の引数を確認できません。引数が null または空です。null または空でない引数を指定して、コマンドを再度実行してください。発生場所 行:1 文字:106
+ ... InGB 250 -label ""
+                    ~~
    + CategoryInfo          : InvalidData: (:) [Update-AzureDisk]、ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.WindowsAzure.Commands.ServiceManagement.IaaS.
   UpdateAzureDiskCommand
PS C:\>

と、めんどくさいです。
「-Label ” “」とスペースでもいいので、何か文字列を指定すると、コマンドが実行できます。

7. 仮想マシンの電源ON
8. OS内でファイルシステムの拡張を実行

以上で拡張が完了です。

Windows7でGet-AzureVM | Out-GridViewが動作しない


Azure環境をCLIで操作するためのMicrosoft Azure PowerShellですが、最近のバージョンでは、Windows 7 SP1のPowerShell 3.0では正常に動作しないコマンドがあるようです。

まず、現在のPower Shellのバージョンは「$PSversiontable」で確認できます。

PS C:\> $PSversiontable
Name                           Value
----                           -----
PSVersion                      3.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.34209
BuildVersion                   6.2.9200.16398
PSCompatibleVersions           {1.0, 2.0, 3.0}
PSRemotingProtocolVersion      2.2
PS C:\>

上記の「PSVersion」がPower Shellのバージョンになります。

次に、Azure Power Shellのバージョンは「(Get-Module Azure).version」で確認できます。

PS C:\> (Get-Module azure).version
Major  Minor  Build  Revision
-----  -----  -----  --------
0      9      2      -1
PS C:\>

上記の場合「0.9.2」です

この場合、「$vm = Get-AzureVM | Out-GridView -Title “Select a VM …” -PassThru」を実行すると、

PS C:\> $vm = Get-AzureVM | Out-GridView -Title "Select a VM ..." -PassThru
Get-AzureVM : パイプラインが停止されています。
発生場所 行:1 文字:7
+ $vm = Get-AzureVM | Out-GridView -Title "Select a VM ..." -PassThru
+       ~~~~~~~~~~~
    + CategoryInfo          : CloseError: (:) [Get-AzureVM]、PipelineStoppedException
    + FullyQualifiedErrorId : Microsoft.WindowsAzure.Commands.ServiceManagement.IaaS.GetAzureVMCommand
Out-GridView : インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。
パラメーター名:index
発生場所 行:1 文字:21
+ $vm = Get-AzureVM | Out-GridView -Title "Select a VM ..." -PassThru
+                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Out-GridView], ArgumentOutOfRangeException
    + FullyQualifiedErrorId : System.ArgumentOutOfRangeException,Microsoft.PowerShell.Commands.OutGridViewCommand
PS C:\>

Out-GridViewが「ArgumentOutOfRangeException」ということで実行できません。
(「(Get-AzureVM).Name | Out-GridView -PassThue」は実行できるんだけど、得られる出力では次の処理ができない)

この現象はMicrosoftがgithubに開設しているアカウントに報告されている。
Possible breaking change Get-AzureVM breaks pipeline with Out-Gridview (#3047) #13

これによると、どうやら、Power Shell 4.0が必要らしい。

Windows Management Framework 4.0」の一部としてPower Shell 4.0が配布されているので、こちらからダウンロードしてインストールする。
リンク先でダウンロードすると、いくつかのファイルがダウンロードできるが、Windows7の64bit環境で必要なものは「Windows6.1-KB2819745-x64-MultiPkg.msu」だけである。Windows7 32bitの場合は Windows6.1-KB2819745-x86.msu」

インストール&再起動後にPower Shellの状況を確認すると、以下のようになる。

PS C:\>  $PSversiontable
Name                           Value
----                           -----
PSVersion                      4.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.34209
BuildVersion                   6.3.9600.16406
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion      2.2
PS C:\> (Get-Module azure).version
Major  Minor  Build  Revision
-----  -----  -----  --------
0      9      2      -1
PS C:\>

で・・改めて「$vm = Get-AzureVM | Out-GridView -Title “Select a VM …” -PassThru」を実行!

PS C:\> $vm = Get-AzureVM | Out-GridView -Title "Select a VM ..." -PassThru
Get-AzureVM : パイプラインが停止されています。発生場所 行:1 文字:7
+ $vm = Get-AzureVM | Out-GridView -Title "Select a VM ..." -PassThru
+       ~~~~~~~~~~~
    + CategoryInfo          : CloseError: (:) [Get-AzureVM]、PipelineStoppedException
    + FullyQualifiedErrorId : Microsoft.WindowsAzure.Commands.ServiceManagement.IaaS.GetAzureVMCommand
Out-GridView : インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。
パラメーター名:index発生場所 行:1 文字:21
+ $vm = Get-AzureVM | Out-GridView -Title "Select a VM ..." -PassThru
+                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Out-GridView], ArgumentOutOfRangeException
    + FullyQualifiedErrorId : System.ArgumentOutOfRangeException,Microsoft.PowerShell.Commands.OutGridViewCommand
PS C:\>

・・・あの・・・?

というわけで、当初もくろんでいたPower Shellを4.0にすることで対処できる、というわけではなく
アップデートしても、なんともならない、という救いようのない状態に・・・・

う~ん・・・


2015/07/21追記

githubのissue」にコメントが付いた

It’s a bug in PS 3.0 and 4.0 in that it fails to load the object and/or type info, if TableControl is not correctly configured.

This will be patched on our end for 3.0/4.0 in the incoming release. Stay tune. Thanks.

PowerShell 3.0と4.0におけるバグで、今度のリリースで修正される、とのこと。

Azure上の仮想ディスクを拡張する


このページの内容は「Azure上の仮想マシンのディスク拡張手法 2016年1月版」に置き換わりました。


Azure上にある仮想マシンで使用しているディスクの残り容量が減ってきた。
拡張するための手順を確認すると、一度VHDをダウンロードし、ローカルで拡張操作をした後に、再アップロードする、といったものが出てくる。

そんなバカな、と調べてみたところ、現在はそんなことをしなくてもいようだ。

Resizing Data Disks in the Cloud on Microsoft Azure with Windows PowerShell

Azure Power Shellモジュールのversion 0.8.15.1以降であれば、「Update-AzureDisk」のオプションとして「-ResizedSizeInGB」が追加されており、それを使用することで拡張することができる、とのこと。

ただ、2015/06/01現在、Azureのドキュメントの「Update-AzureDisk」は、version 0.8.10準拠ということで、このオプションが載っておらず、半ば隠しオプションとなってしまっている。

いや・・・ちゃんとしてくれよ・・・

しかも、Windows7で試したところ、Azure PowerShellモジュールを2015/06/01時点での最新ver 0.9.2にしても、このページ記載のコマンドが実行できないという事態も発覚。

「$vm = Get-AzureVM | Out-Gridview -PassThru」が失敗するという・・・

下記の問題と同様のようだ。
Possible breaking change Get-AzureVM breaks pipeline with Out-Gridview (#3047) #13

どうやらPower Shell 3.0では、動かず、Power Shell 4.0にする必要があるらしい。

そして、Power Shellは、Windows Management Framework 4.0に含まれるため
Windows Management Framework 4.0」を導入する必要がある、とのこと。

めんどくさいなぁ・・・・