PowerShell で VM イメージを扱う方法について
このポストは、5 月 1 日に投稿された VM Image PowerShell ‘How To’ Blog Post (著者: Christine Avanessians、Kay Singh ) の翻訳です。
編集メモ: 今回は、Microsoft Azure エンジニアリング チームでプログラム マネージャーを務める Kay Singh と Christine Avanessians の共同執筆記事をご紹介します。
以前私が執筆したブログ記事でお約束したとおり、今回は VM イメージが PowerShell で動作するしくみについて説明します。この説明の一部は、演算用コマンドレット担当の PowerShell PM である同僚の Kay Singh にお願いしました。VM イメージを実際に使用してみた方は、この記事が出ることを楽しみにされていたのではないでしょうか。期待にお応えして、さっそく説明を始めましょう。
過去の記事で述べたとおり、VM イメージは OS イメージの後継機能で、この 2 つのエンティティには多くの類似点があります。VM イメージ機能は、OS イメージをカプセル化したものと考えることができます。ユーザーの立場では VM イメージと OS イメージを 2 つの個別のエンティティと考えますが、PowerShell は単一の ‘über’ イメージ エンティティとして扱います。このため、OS イメージを使用してきて馴染みのある PowerShell コマンドレットの多くは、VM イメージで使用できます。
まずは、OS イメージに関する PowerShell の知識を簡単に復習しましょう。ご存知のとおり、OS イメージの再呼び出し、作成、リスト作成、削除を行う PowerShell スニペットは、次のようになります。
次の PowerShell スニペットを使用すると、新規作成した OS イメージから VM をデプロイできます。
または
ここまでは既に皆様ご存知かと思います。それでは、VM イメージに関する説明を始めます。
取得する VM を作成する
VM イメージで何らかの操作を行う前に、それを実行する仮想マシンが必要となります。ここまで説明したことを応用して、SQL Server 2014 を実行し 2 つのデータ ディスクを持つ仮想マシンをデプロイします。4 月にリリースされた SQL Server 2014 RTM のデータウェアハウス機能で仮想マシンを作成するスクリプトは、次のようになります。
VM を Generalized VM イメージ (sysprep 済み VM イメージ)または Specialized VM イメージ (sysprep されていない VM イメージ) として取得する
仮想マシンを取得する前に、 generalized イメージと specialized イメージのどちらを取得するかを決めておく必要があります。前回の記事でも述べましたが、 generalized VM イメージは類似した仮想マシンを迅速に多数作成する場合に「モデル」として使用するもので、OS イメージも同じように利用できます。新しく導入された specialized VM イメージは、正常に完了せず仮想マシンを使用不能にしたタスクを実行する前の任意の時点の VM をデプロイするための「スナップショット」として使用するものです。
仮想マシンの取得準備には、さらにいくつかの手順が必要です。Windows Server の generalized VM イメージを取得する場合、Microsoft Azure の「Windows Server を実行する仮想マシンのイメージの取得 (英語)」という記事で説明されている手順に従います。Linux の generalized VM イメージを取得する場合も同様で、「Linux を実行する仮想マシンのイメージの取得 (英語)」という記事で説明されている手順に従います。
ここからは、仮想マシンを VM イメージとして実際に取得します。取得手順は、OS イメージの場合と同様です。従来と同様に Save-AzureVMImage コマンドレットを使用しますが、このとき、OS イメージと VM イメージのどちらを取得するかを決定する新しいパラメーターを含めます。
まず、myFirstVMImage という名前の generalized VM イメージを取得します。
specialized VM イメージを取得する場合は、スニペットは次のようになります。
ここで、OSState パラメーターを使用して、VM イメージを取得するように指定していることに注目してください。このパラメーターを使用しない場合、このコマンドレットは OS イメージを取得します。OS イメージは必ず「 generalized 」であると想定されているので、OSState パラメーターは不要です。
コツとして、同じ名前で 2 つのイメージ (VM イメージと OS イメージ) を作成しないようにすることを強く推奨します。Microsoft Azure Platform ではこれが可能ですが、プラットフォームはユーザーの意図を判断できないため、何らかの問題が発生する可能性があります。
なぜ重複が発生するのか不思議に思われる方もいらっしゃるかも知れませんが、あるクライアント (PowerShell など) で VM イメージを作成し、その後に別のクライアント (管理ポータルなど) で OS イメージを作成すると、重複が発生する可能性があります。OS イメージと VM イメージの作成を PowerShell のみで行っている場合、Save-AzureVMImage コマンドレットは名前の検証を実行し、VM イメージと OS イメージを同じ名前で作成しようとするとエラーを返します。
VM イメージのリストを作成する
先に述べたように、Get-AzureVMImage コマンドレットを使用すると、ユーザーと発行済み OS イメージの両方のリストが作成されます。しかし、このコマンドレットをそのまま実行すると、実際には取得したばかりの VM イメージが表示されます。次の PowerShell スニペットを実行すると、その様子が確認できます。
既存の Get-AzureVMImage コマンドレットでは、OS イメージだけではなく、ユーザーと発行済みの VM イメージも表示されます。VM イメージのみのリストを作成する場合は、VM イメージのみに適用される DataDiskConfiguration などのプロパティでフィルタリングします。
VM イメージを削除する
VM イメージを削除する手順は、OS イメージの場合と同様です。
繰り返しになりますが、同一名のイメージが 2 つある場合、プラットフォームはユーザーの意図を判断できません。上記のコマンドレットは、このような場合に誤ってイメージを削除しないように、エラーを返します。この OS イメージを削除する場合、ポータルを使用するか、PowerShell で Invoke-Rest URI メソッドを使用して REST API を直接呼び出す必要があります。VM イメージを削除する場合も、同様に PowerShell で Invoke-Rest URI メソッドを使用できます。いずれかのイメージが削除されると、再度 Remove-AzureVMImage コマンドレットを使用できるようになります。このような状況に陥った場合に VM イメージを削除するための、Invoke-RestMethod を使用した PowerShell スニペットを次に示します。
Generalized VM イメージまたは Specialized VM イメージから VM をデプロイする
generalized VM イメージからのデプロイと OS イメージからのデプロイは、どちらも generalized イメージであるため、手順は同様です。主な相違点は、VM イメージからデプロイする場合、データ ディスクの追加ができないということです。VM イメージには、最初に仮想マシンに追加するデータ ディスクをあらかじめ用意しておく必要があります。仮想マシンのデプロイが完了した後は、他のあらゆる VM と同様に、ディスクのアタッチやデタッチが可能です。
Remove-AzureVMImage と同様に、プラットフォームは、同一名のイメージが 2 つある場合、それを解決しようとします。参照元のイメージが OS イメージと VM イメージのどちらであるかを一意に決定できない場合、エラーが発生します。
次に示す PowerShell スニペットは、先ほど myFirstVMImage という名前で作成した VM イメージを使用して、L サイズの仮想マシンをデプロイするものです。
それでは、 specialized VM イメージからデプロイする方法を見てみましょう。この手順には、 generalized VM イメージの場合と少し異なる点があります。 specialized VM イメージの場合は、イメージが generalized ではないので、プロビジョニングの構成は不要です。 specialized VM イメージの使用は、ディスクの使用と似ています。ユーザー名とパスワードは、元の (取得された) 仮想マシンと同じです。次にスニペットの例を示します。
ここで、改めて主要なポイントを繰り返します。
- VM イメージは「 generalized 」と「 specialized 」の 2 種類があるが、OS イメージは「 generalized 」の 1 種類のみである。
- オプションの –OSState パラメーターを使用すると VM イメージとして保存され、Save-AzureVMImage コマンドレットで OS イメージを保存する場合と区別される。
- Save-AzureVMImage コマンドレットでは同一名の VM イメージと OS イメージを取得することはできないが、複数のクライアントを使用している場合は注意が必要。
- Get-AzureVMImage では、VM イメージと同様に OS イメージも返される。
- Remove-AzureVMImage コマンドレットでは、プラットフォームがユーザーの意図を判断することができないため、OS イメージと VM イメージの両方を参照する名前の削除はブロックする。
この PowerShell の概要説明が皆様のお役に立つことになれば幸いです。ご不明な点やコメントがありましたら、お気軽にお問い合わせください。
次回の記事にもどうぞご期待ください。
Christine Avanessians、Kay Singh