こんにちは。インサイトテクノロジーの松尾です!
クラウドでの VM 利用がますます増えてくる中、アプリケーションをセットアップ済みの VM を顧客に提供したり、VM イメージを外部の顧客へ提供したいケースは今後ますます増えてくるのではないでしょうか。
Amazon Web Services ( AWS ) では、アカウント ID を指定して外部 ( 異なるアカウント) へ Amazon Machine Image ( AMI ) を簡単に共有することが可能です ( 参考: 特定の AWS アカウントと AMI を共有する )。
一方、Microsoft Azure ( Azure ) で VM イメージを外部ユーザー ( 異なるテナント ) へ共有するには、Azure Marketplace へ登録済みのプロダクトであれば容易ですが、Azure Marketplace への製品登録にはそれなりの手続きを経る必要があり、AWS のようにもっとカジュアルに外部へ共有する手段があれば便利です。
Azure で Azure Marketplace へ登録されていないイメージを異なるテナントへ共有するにはどうしたらよいでしょうか?
Azure にも共有イメージギャラリーという仕組みがあります ( 参考: 共有イメージ ギャラリーの概要 ) が、基本は同テナント内へのみ共有する仕組みのため、外部のテナントへ共有するには少し複雑な手順が必要となります。
共有イメージ ギャラリーを使用すると、組織内のさまざまなユーザー、サービス プリンシパル、AD グループに対してイメージを共有できます。
本ブログでは、共有用の VM イメージ作成から、そのイメージの共有、共有されたイメージの利用までを、2 回に分けてご紹介します。
VM イメージと共有イメージギャラリーを既に作成済みの場合、後編 ( イメージ共有編 ) はこちら から参照ください。
2通りの方法を紹介
後編では、共有イメージギャラリーを外部のテナントへ共有する方法として、以下の 2 通りの方法を紹介します。それぞれにメリット・デメリットがあるため目的に応じて選択する感じになると思います。
- 共有イメージギャラリーとアプリ登録を利用する方法 ( Azure のドキュメントで紹介されている方法 )
- Azure Lighthouse を利用する方法
なお、共有するイメージは Linux ( centos ) ベースのイメージを前提としています。
事前準備:共有イメージの作成
共有方法によらず、イメージの用意は共通の手順となります。
既に共有したい VM が存在することを前提とし、Azure のドキュメント「仮想マシンまたは VHD のマネージド イメージを作成する方法」に従い、イメージの作成を行います。
1. VM のプロビジョニングを解除する
Azure VM エージェントで VM のプロビジョニングを解除し、マシン固有のファイルとデータを削除します。ssh クライアントで VM へ接続し、以下のコマンドを実行します。
sudo waagent -deprovision+user
このコマンドの実行により、内部的には以下のことが実行されています (参考:Azure Linux エージェントの理解と使用 – コマンドラインオプション)。
- deprovision: システムをクリーンアップし、再プロビジョニングに適した状態にしようとします。 次の項目を削除します。
- すべての SSH ホスト キー ( 構成ファイルで Provisioning.RegenerateSshHostKeyPair が ‘y’ の場合 )
- /etc/resolv.conf 内のネームサーバー構成
- /etc/shadow の root パスワード (構成ファイルで Provisioning.DeleteRootPassword が ‘y’ の場合 )
- キャッシュされた DHCP クライアントのリース
- ホスト名を localhost.localdomain にリセット
- deprovision+user: -deprovision の場合のすべての対象 ( 上記参照 ) を実行するほか、前回プロビジョニングされたユーザー アカウント ( /var/lib/waagent から取得 ) および関連付けられたデータも削除します。 このパラメーターは、Azure で前回プロビジョニングされたイメージのプロビジョニングを解除するため、取得して再利用できます。
なお、このコマンド実行時点では、VM はまだ起動状態です。
2. VM イメージを作成する
Azure CLI を使用し、一般化されたものとして VM を設定し、イメージをキャプチャします。
myResourceGroup、myVM などは、自分の VM の環境に置き換えて実行します。なお、Azure CLI 実行時に以下の点に注意してください。
- 複数のテナントへログイン可能なアカウントでは、
az login
実行時に--tenant
を指定してログイン先のテナントを指定 - 複数のサブスクリプションを利用可能なアカウントでは、コマンド実行時に
--subscription
を指定して対象のサブスクリプションを指定 az login
で Azure CLI でログインします。
az login
az vm deallocate
で、プロビジョニングを解除した VM の割り当てを解除します。 なお、本コマンドは VM の停止 ( 割り当て解除 ) に相当するため、Azure Portal からでも実行可能です。
az vm deallocate --resource-group myResourceGroup --name myVM --subscription mySubscription
az vm generalize
を使用して VM の状態を一般化に設定します ( 参考:az vm generalize ) 。
az vm generalize --resource-group myResourceGroup --name myVM --subscription mySubscription
az image create
で VM イメージを作成します。(--name
オプションで作成イメージ名を指定 )なお、VM のバージョンを Gen2 で作成していた場合には、--hyper-v-generation V2
オプションを指定します。
az image create --resource-group myResourceGroup --name myImaged --source myVM --hyper-v-generation V2 --subscription mySubscription
- 本手順実行により、指定リソースグループ内に「イメージ」が作成されます。
3. 共有イメージギャラリーを作成する
Azure Portal で、共有イメージギャラリーを作成します ( 参考:ポータルを使用して共有イメージ ギャラリーを作成する )。
- Azure Portal で「共有イメージ ギャラリー」を選択し、「追加」を選択します。
- イメージギャラリーが作成されたら、「新しいイメージ定義の追加」からイメージ定義を追加します ( 必要事項は適当に入力します )。
- イメージ定義が作成されたら、「イメージバージョン」を作成します。イメージバージョン作成の際の「ソースイメージ」に、先ほど VM から作成したイメージを選択します。
- バージョン追加後に、イメージバージョンのプロパティで表示される「リソースID」の情報を、共有するために保存します ( 共有方法1で必要 )。