はじめに
今回はAzureのShared Image Galleryを利用して、あるAzure ADテナントで作成・登録したイメージ(スナップショット)を使って、別のAzure ADテナントにVMをデプロイしてみたので、方法を紹介します。
目次
Shared Image Gallery概要
Shared Image Galleryは、2019年5月に一般公開されたサービスです。
共通の設定を導入したイメージを作成および登録することで、別サブスクリプションや、別のAzure ADテナント内のユーザーがそのイメージを利用してVMをデプロイできます。
加えて、イメージ更新時のバージョン管理までできちゃいます。
一般化された(sysprep済み)イメージ、特殊化された(sysprepなし)イメージのどちらにも対応していますが、投稿時点(2019年12月)では、特殊化されたイメージはプレビュー機能です。
今回はプレビューである、特殊化されたイメージ(OSディスクのスナップショット)を別テナントでデプロイします。
プレビューの制限として、特殊化されたイメージのデプロイはPowerShellかCLIのみ可能(ポータル不可)のため、PowerShellスクリプトでデプロイします。
参考は以下です。
構成イメージ
イメージは以下です。
以降では、ギャラリー側をテナント1(サブスクリプション1)、デプロイ側をテナント2(サブスクリプション2)として表記します。
- サブスクリプション1で、OSディスクのスナップショットを作成します
- サブスクリプション1で、イメージ(スナップショット)をShared Image Galleryに登録します。
※正確にはShared Image Gallery内にイメージ定義を作成、イメージバージョンとして登録ですが、図中では省略します。 - テナント2のユーザーをテナント1に招待します。
- 招待したユーザーに対して、ギャラリーの読み取り権限を付与します。
- スクリプトを用いて、サブスクリプション1のイメージを基に、サブスクリプション2にVMをデプロイします。
sysprep無しのイメージなので、VMがテナントを移動したような動きになります。早速やっていきます。
環境構築
VMイメージ(スナップショット)作成
MSドキュメント内の言葉を借りて「特殊化されたイメージ」記載していますが、つまりはOSディスクのスナップショットを指しています。
VMを停止して、OSディスクのスナップショットを作成します。
データディスクを利用している場合は、併せてスナップショットを取得しておきます。
Shared Image Gallery準備
取得したスナップショットを登録するため、Shared Image Gallery(共有イメージギャラリー)を作成します。
ギャラリーを作成したら、そこに「イメージ定義」を追加します。
項目やタブがたくさんありますが、単に使うだけなら[基本]タブだけ埋めればOKです。
今回は特殊化されたイメージのため[特殊化]を指定します。
最後に、「バージョンの追加」を行います。
ここで、[OSディスクのスナップショット]として最初に作成したスナップショットを選択します。
データディスクがある場合には、LUNと併せて[データディスクのスナップショット]に指定します。
10分ほど待ちイメージバージョンが作成されたら、Shared Image Galleryの準備は完了です。
招待&権限割り当て
イメージを使わせたい別テナントのユーザーに対して、作成したギャラリーの読み取り権限(閲覧者ロール)を付与します。
別テナントのユーザーに権限を付与するには、以下を参考に対象ユーザーを招待しておきます。
招待後、ギャラリーの[アクセス制御]-[追加]-[ロールの割り当ての追加]を開きます。
[役割]は[閲覧者]を指定し、[選択]に外部テナントのユーザー名を入力します。
表示されたユーザーをクリックし保存します。
[ロールの割り当て]タブを見たときに、閲覧者として追加されていれば準備はOKです。
スクリプト準備
特殊化イメージの利用はプレビューでありPowerShellまたはCLIでのデプロイのみのため、以下のPowerShellスクリプトを用意しました。
$Subscription = "サブスクリプションID" $ResourceGroup = "リソースグループ名" $Location = "リージョン名" $VNetName = "VNet名" $VmName = "VM名" $NicName = $VmName + "-NIC" $GIpName = $VmName + "-IP" $Image = "イメージバージョンのリソースID" #サブスクリプションにログイン Connect-AzAccount Select-AzSubscription -Subscription $Subscription # パブリックIP作成 $GIp = New-AzPublicIpAddress -ResourceGroupName $ResourceGroup -AllocationMethod Dynamic -Location $Location -Name $GIpName # VNet取得 $VNet = Get-AzVirtualNetwork -ResourceGroupName $ResourceGroup -Name $VNetName # 指定サブネットのNIC作成 $Nic = New-AzNetworkInterface -Name $NicName -ResourceGroupName $ResourceGroup -Location $Location ` -SubnetId $VNet.Subnets[0].Id -PublicIpAddressId $GIP.Id # ギャラリーイメージを基にVMデプロイ用Config作成 $VmConfig = New-AzVMConfig -VMName $VmName -VMSize Standard_A1_v2 | ` Set-AzVMSourceImage -Id $Image | ` Add-AzVMNetworkInterface -Id $Nic.Id # VMデプロイ New-AzVM -ResourceGroupName $ResourceGroup -Location $Location -VM $VmConfig -DisableBginfoExtension
スクリプトは以下のことを行います。
- 指定サブスクリプションにログイン
- パブリックIP作成
- 指定VNetの先頭サブネットに接続するネットワークインターフェース作成
- 別テナントのギャラリーイメージを基に、VMデプロイ用のConfig作成(サイズはA1v2)
- Configを基にVMデプロイ
上部の変数に任意の値を指定すればOKですが、$Imageはサブスクリプション1側で取得する値、それ以外はサブスクリプション2側の値になります。
また、$Imageには「イメージバージョンの」リソースIDを指定してください。[プロパティ]からコピーできます。
VMデプロイ
準備ができたらスクリプトを実行し、ギャラリーの読み取り権限を付与したユーザーでログインすれば、テナント1のイメージを利用したVMがデプロイされます。
スクリプト実行結果
デプロイされたVMは、ソースが「共有イメージ」になります。
以上で、Shared Image Galleryを用いて、異なるAzure ADテナントのイメージからVMをデプロイすることができました。
おわりに
一般リリースされれば特殊化イメージでもポータルでデプロイ可能になるとは思いますが、VMをテナント間移動させる方法の1つとして試したため、せっかくならと記事にしました。
Azureでテナントを超えるってなかなか面倒なのですが、そもそも共有する用のサービスなのでやりやすかったです。
ギャラリーを使えば別サブスクリプションへのカスタムイメージの持ち込みも可能であるため、日本語化&社内で定められた設定実施済みのテンプレートを様々なサブスクリプションで利用することなんかもでき、いろいろ使い道のあるサービスではないかと思います。
ユーザーにあまり権限をつけたくない、という方でも安心な読み取り権限だけOKなのもよいです。
気が向いたら一般化イメージでも試してみたいと思います。