「Azure仮想マシンにログオンできない!」という悲劇からの生還

この記事は、「Windows Azure アドベントカレンダー」の3月21日分です。

Azure仮想マシンの静的IPアドレス設定機能について書こうかと思ったのですが、3月10日の「Windows Azure仮想マシンのStatic IPアドレス設定」で既に詳しく解説されていますね。

ならば題材を変えて、最近導入された「仮想マシンのゲストエージェント」と、それを使った「リモートデスクトップ接続の再有効化およびパスワードリセット」機能について書こうと思います。


ゲストエージェントと VMAccessAgent 拡張

先月(2014年2月)から、Azure で仮想マシンを作成すると、ゲストOSに「ゲストエージェント」というプログラムがインストールされるようになりました。これは、Azure仮想マシン環境において、ホスト(Hyper-Vの土台側)とゲスト(我々が利用する仮想マシン)間の緊密な連携を可能にする仕組みです。

ゲストエージェントを持たない旧来の仮想マシンは、そもそも「自分がAzure上で動いている仮想マシンである」ことを意識していません(認識できません、といったほうが良いかもしれません)。そのため、例えば「自分が属しているクラウドサービスの名前」とか、「自分のデプロイメントが持っているパブリックIPアドレス」といった情報を取得することはできませんでした。ゲストエージェントが導入されると、こういった「ホスト側でしか知りえない情報」をゲストへ伝えることができるようになります。

下の図をご覧ください。ゲストエージェントが導入された仮想マシンにログオンすると、デスクトップにこのような情報が表示されるようになっています。SysinternalsのBgInfo を実行したんだな、というのはすぐわかりますが、単にゲストOSでBgInfoを実行しても、こうはなりません。デプロイメントIDや、パブリックIPアドレス(VIP)は、ゲストOSだけでは取得できない情報です。

image

このBgInfoは、ゲストエージェントが持つプラグイン機構を利用した BGInfo 拡張(Extension)として動いています。ゲストエージェントからホスト側の情報をもらって、ゲストOSのデスクトップにそれを表示することができているわけです。

そして、デフォルトで登録されているプラグインがもう一つあります。それが今回のお題、 VMAccessAgent 拡張です。
これは、

  1. 誤ってリモートデスクトップ接続を無効化してしまうと、ログオンできなくなってしまう
  2. ログオンするためのパスワードを忘れると、再設定する方法がない。

という、Azure仮想マシンの弱点を解消してくれるものなのです。


論より証拠

では、VMAccessAgent 拡張のご利益を実感してみましょう。

  1. RDP接続をわざと無効化してAzure仮想マシンから締め出されてみる。
  2. その後、VMAccessAgentに助けてもらい華麗に再度ログオンをキメる。 ※ この際ついでにパスワードも変えてみる。

という感じで行きましょう。


Windows Azure PowerShell 0.7.4

VMAccessAgent によるリモートデスクトップ接続関連操作は、”Set-AzureVMAccessExtension”という新しい PowerShell コマンドレットを使って実行します。(現時点では、管理ポータルからはできません) また、このコマンドレットは、3/11にリリースされた Windows Azure PowerShell 0.7.4 が必要です。まずはこの最新のWindows Azure PowerShellをインストールしてください。

インストール方法は、Windows Azureアドベントカレンダーの3/19分であるこちら「Windows Azure PowerShell のコマンドレットを分類してみた」に詳しく解説されていますので、ご覧下さい。

あ、もちろんこっちを見てもらっても良いんですよ。「Windows Azure PowerShell を使うには」とブログに書くまでもないほど簡単になってしまった話

とにかく、こういう風に 0.7.4 の Windows Azure PowerShell が入ればOKです。

PS C:\work> Get-Module

ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Binary 0.7.4 Azure {Add-AzureAccount, Add-AzureCacheWorkerRole, Add-AzureCert...


リモートデスクトップを無効化して締め出されてみる

まずは、Azure仮想マシンで「あえてリモートデスクトップ接続を無効化する」わけですが、間違ってゲストエージェントの入っていない仮想マシンでこれをやってしまうと大変面倒なことになるので、まずは実験対象の仮想マシンに、確実にVMAccessAgent拡張が入っているか、確認してみましょう。Windows Azure PowerShellでこのようなコマンドを実行します。

Get-AzureVM -ServiceName ksvm01 -Name ksvm01 | Get-AzureVMExtension
ksvm01というのは私の環境での名前なので、適宜置き換えてください。

こんな風に↓ VMAccessAgentが出てくればOKです。

ExtensionName : BGInfo
Publisher : Microsoft.Compute
Version : 1.0
PrivateConfiguration :
PublicConfiguration :
ReferenceName : BGInfo
State : enable

ExtensionName : VMAccessAgent
Publisher : Microsoft.Compute

では、ちょっと緊張しますが、リモートデスクトップ接続を無効にしてみようと思います。

image

さて、「OK」をクリックしますよ…

image

ギャー!

あまり心臓によくありませんね。


リモートデスクトップ接続を有効にする

では、この状態を修復してみたいと思います。簡単です。VMAccessAgentがあればね。

Get-AzureVM -ServiceName ksvm01 -Name ksvm01 | Set-AzureVMAccessExtension | Update-AzureVM

※ 例によってksvm01部分は適宜置き換えてください。

OperationDescription OperationId OperationStatus
-------------------- ----------- ---------------
Update-AzureVM 7323d775-f63b-8a3d-994a-c412b542c0ec Succeeded

こんな風に”Succeeded”と表示されれば完了です。

ただし、VMAccessAgentの効果を発揮させるには、仮想マシンを再起動する必要があります。

Get-AzureVM -ServiceName ksvm01 -Name ksvm01 | Restart-AzureVM

※ 例によってksvm01部分は適宜置き換えてください。


リモートデスクトップ接続を有効にし、管理者のユーザー名とパスワードを再設定する

さて、これで「誤ってリモートデスクトップを無効化した」ケースからは生還できることがわかりました。では、「パスワード忘れちゃった」ケースはどうでしょうか。

実はこれも、先ほどと同じ Set-AzureVMAccessExtension コマンドレットで対処できます。管理者ユーザー名とパスワードを、こんな風に再設定できるのです。

Get-AzureVM -ServiceName ksvm01 | Set-AzureVMAccessExtension -UserName ユーザー名 -Password パスワード | Update-AzureVM

「パスワード忘れちゃったんだけど、どうしたら復活できる?」というお問い合わせは、実際何度か頂いたことがあります。これからは簡単に復旧できますね。


関連情報

ゲストエージェントとVMAccessAgentに関しては、下記の二つのブログ記事に非常に詳しく、わかりやすく書かれています。こちらもぜひご参照ください。

VM Agent available for Azure VMs

Enable RDP or Reset Password with the VM Agent

__END__