みち草

Azure中心にまとめる技術情報ブログ

Shared Image Galleryで異なるAzure ADテナントのイメージからVMをデプロイする

はじめに

今回はAzureのShared Image Galleryを利用して、あるAzure ADテナントで作成・登録したイメージ(スナップショット)を使って、別のAzure ADテナントにVMをデプロイしてみたので、方法を紹介します。

目次

Shared Image Gallery概要

Shared Image Galleryは、2019年5月に一般公開されたサービスです。

azure.microsoft.com

共通の設定を導入したイメージを作成および登録することで、別サブスクリプションや、別のAzure ADテナント内のユーザーがそのイメージを利用してVMをデプロイできます。
加えて、イメージ更新時のバージョン管理までできちゃいます。

一般化された(sysprep済み)イメージ、特殊化された(sysprepなし)イメージのどちらにも対応していますが、投稿時点(2019年12月)では、特殊化されたイメージはプレビュー機能です。

今回はプレビューである、特殊化されたイメージ(OSディスクのスナップショット)を別テナントでデプロイします。
プレビューの制限として、特殊化されたイメージのデプロイはPowerShellかCLIのみ可能(ポータル不可)のため、PowerShellスクリプトでデプロイします。

参考は以下です。

docs.microsoft.com

docs.microsoft.com

構成イメージ

イメージは以下です。
以降では、ギャラリー側をテナント1(サブスクリプション1)、デプロイ側をテナント2(サブスクリプション2)として表記します。

ギャラリー1

  1. サブスクリプション1で、OSディスクのスナップショットを作成します
  2. サブスクリプション1で、イメージ(スナップショット)をShared Image Galleryに登録します。
    ※正確にはShared Image Gallery内にイメージ定義を作成、イメージバージョンとして登録ですが、図中では省略します。
  3. テナント2のユーザーをテナント1に招待します。
  4. 招待したユーザーに対して、ギャラリーの読み取り権限を付与します。
  5. スクリプトを用いて、サブスクリプション1のイメージを基に、サブスクリプション2にVMをデプロイします。

sysprep無しのイメージなので、VMがテナントを移動したような動きになります。早速やっていきます。

環境構築

VMイメージ(スナップショット)作成

MSドキュメント内の言葉を借りて「特殊化されたイメージ」記載していますが、つまりはOSディスクのスナップショットを指しています。

VMを停止して、OSディスクのスナップショットを作成します。

ギャラリー2

データディスクを利用している場合は、併せてスナップショットを取得しておきます。

Shared Image Gallery準備

取得したスナップショットを登録するため、Shared Image Gallery(共有イメージギャラリー)を作成します。

ギャラリー3

ギャラリーを作成したら、そこに「イメージ定義」を追加します。

ギャラリー4

項目やタブがたくさんありますが、単に使うだけなら[基本]タブだけ埋めればOKです。
今回は特殊化されたイメージのため[特殊化]を指定します。

ギャラリー5

最後に、「バージョンの追加」を行います。

ギャラリー6

ここで、[OSディスクのスナップショット]として最初に作成したスナップショットを選択します。
データディスクがある場合には、LUNと併せて[データディスクのスナップショット]に指定します。

ギャラリー7

10分ほど待ちイメージバージョンが作成されたら、Shared Image Galleryの準備は完了です。

ギャラリー8

招待&権限割り当て

イメージを使わせたい別テナントのユーザーに対して、作成したギャラリーの読み取り権限(閲覧者ロール)を付与します。

別テナントのユーザーに権限を付与するには、以下を参考に対象ユーザーを招待しておきます。

docs.microsoft.com

招待後、ギャラリーの[アクセス制御]-[追加]-[ロールの割り当ての追加]を開きます。

ギャラリー9

[役割]は[閲覧者]を指定し、[選択]に外部テナントのユーザー名を入力します。

ギャラリー10

表示されたユーザーをクリックし保存します。
[ロールの割り当て]タブを見たときに、閲覧者として追加されていれば準備はOKです。

ギャラリー11

スクリプト準備

特殊化イメージの利用はプレビューであり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

スクリプトは以下のことを行います。

  1. 指定サブスクリプションにログイン
  2. パブリックIP作成
  3. 指定VNetの先頭サブネットに接続するネットワークインターフェース作成
  4. 別テナントのギャラリーイメージを基に、VMデプロイ用のConfig作成(サイズはA1v2)
  5. Configを基にVMデプロイ

上部の変数に任意の値を指定すればOKですが、$Imageはサブスクリプション1側で取得する値、それ以外はサブスクリプション2側の値になります。

また、$Imageには「イメージバージョンの」リソースIDを指定してください。[プロパティ]からコピーできます。

ギャラリー12

VMデプロイ

準備ができたらスクリプトを実行し、ギャラリーの読み取り権限を付与したユーザーでログインすれば、テナント1のイメージを利用したVMがデプロイされます。

スクリプト実行結果

ギャラリー13

デプロイされたVMは、ソースが「共有イメージ」になります。

ギャラリー14

以上で、Shared Image Galleryを用いて、異なるAzure ADテナントのイメージからVMをデプロイすることができました。

おわりに

一般リリースされれば特殊化イメージでもポータルでデプロイ可能になるとは思いますが、VMをテナント間移動させる方法の1つとして試したため、せっかくならと記事にしました。

Azureでテナントを超えるってなかなか面倒なのですが、そもそも共有する用のサービスなのでやりやすかったです。

ギャラリーを使えば別サブスクリプションへのカスタムイメージの持ち込みも可能であるため、日本語化&社内で定められた設定実施済みのテンプレートを様々なサブスクリプションで利用することなんかもでき、いろいろ使い道のあるサービスではないかと思います。

ユーザーにあまり権限をつけたくない、という方でも安心な読み取り権限だけOKなのもよいです。

気が向いたら一般化イメージでも試してみたいと思います。