Azure Shared Image Galleryを用いたVMの複製
2020-01-22
azblob://2022/11/11/eyecatch/2020-01-22-azure-shared-image-gallary-and-terraform-000.png

cloud.config Divの神田です。
今回はAzure Shared Image GallaryとTerraformを用いてVMの複製を実施いたします。

Azure Shared Image Gallaryとは

Azure Shared Image Gallary(共有イメージギャラリー)とは、
VMのイメージを組織(= Azure AD = テナント)内で共有するためのサービスです。
VMを複製するだけであればイメージを作成するだけで十分ですが、
イメージからVMを作成する際に、他のサブスクリプションに作成することができません。
そこで、イメージをAzure Shared Image Gallaryで共有することで
組織内ならばサブスクリプションをまたいでVMを作成することが可能となります。

参考 : Azure Shared Image Gallary overview
https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/shared-image-galleries

手順

  1. マスターイメージ(コピー元)となるVMを作成
  2. VMを一般化
  3. イメージを作成
  4. Shared Image Gallaryを作成
  5. イメージ定義を作成
  6. イメージバージョンを作成
  7. イメージバージョンからVMを複製

1. マスターイメージ(コピー元)となるVMを作成

AzureポータルのGUIに従いVMを作成します。
今回はShared Image GallaryによるVMの複製がメインですので細かい作業は省略いたします。
OSやディスクも適当なものを作成しています。(画像中ではWindows VMを作成しています。)

VMの作成

2. VMを一般化

続いてSysprepを実行し、VMを一般化します。

参考 : Create a managed image of a generalized VM in Azure
https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/capture-image-resource

VMの作成、起動が完了したらRDPで接続し、以下のコマンドを管理者権限で実行します。

%WINDIR%\system32\sysprep\sysprep.exe

Sysprepが起動するので、System Cleanup ActionがOOBEになっていることを確認し、
Genaralizeにチェックをつけ、Shutdown OptionsはShutdownを選択します。(画像参照)
この状態でOKを押下するとSysprepが実行されます。
実行が完了するとVMがシャットダウンされて接続が切れるので、RDPを終了します。

Sysprepの実行

なお、上記のSysprepの起動からオプションの設定、実行までは以下のコマンドで代用できます。

%WINDIR%\system32\sysprep\sysprep.exe /generalize /shutdown /oobe

3. イメージを作成

AzureポータルのVMにアクセスし、「キャプチャ」をクリックしイメージを作成します。
一般化したVMは再起動できず、今回はもう用事もないので、
「イメージの作成後、この仮想マシンを自動的に削除します」を有効にしておきます。

4. Shared Image Gallaryの作成

Azureポータル上でShared Image Gallaryを作成します。
ここでは特別に指定する必要のあるパラメータは存在しないのでGUIに従い作成します。

5. イメージ定義の作成

Shared Image Gallaryの「新しいイメージ定義を追加します」をクリックし、イメージ定義を作成します。
なお今回は「基本」ブレードの項目のみ入力し、「バージョン」「発行のオプション」は空で作成します。
・「オペレーティングシステム」は1.で作成したVMと同じOSを指定します。
・「VMの生成」は作成するVMのサイズに応じて選択します。詳細は以下のドキュメントをご参照ください。

  参照 : Support for generation 2 VMs on Azure
   https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/generation-2

・「オペレーティングシステムの状態」ですが、2.でVMを一般化しましたので、一般化を指定します。
・「発行元」「プラン」「SKU」はそれぞれ「testpublisher」「testoffer」「testsku」を入力しています。
 こちらの3つのパラメータに入力する値については以下のドキュメントをご参照ください。

  参照 : Shared Image Gallery overview -Image definitions-
   https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/shared-image-galleries#image-definitions

イメージ定義を作成

6. イメージバージョンを作成

イメージ定義の「バージョンの追加」をクリックし、イメージバージョンを作成します。
・「バージョン」に1.0.0と入力します。
・「ソースイメージ」に 3. で作成したイメージを指定します。
・「レプリケーション」にVMを作成するリージョンを指定します。

※イメージバージョンからVMを作成する際に、VMのリージョンとして選択可能なものは
 「レプリケーション」で指定したリージョンのみなので注意しましょう。

イメージバージョンの作成ですが、「レプリケーション」で指定したリージョンにイメージを配置するのに
時間がかかりますので、気長に待ちます。
今回は「東日本」と「西日本」を指定しましたが20分ほどかかりました。

イメージバージョンを作成

7. イメージバージョンからVMを作成

作成したイメージバージョンの「VMの作成」からVMを作成することが可能になりました。
また、イメージからの作成では異なるサブスクリプションにはVMを作成できないのですが、
イメージバージョンからならば他のサブスクリプションを選択可能となっています。

おまけ

TerraformでAzure Shared Image GallaryからVMを作成するコードを以下に記載します。
基本はカスタムイメージからVMを作成するコードを用い、イメージのリソースIDを指定するパラメータに
イメージバージョンのリソースIDを入力するだけで作成可能です。

# 仮想ネットワーク、サブネット、NIC、NSG、パブリックIP、ストレージアカウントは省略
# VMの作成
resource "azurerm_virtual_machine" "vm01" {
  name                  = "リソース名"
  location              = "リージョン"
  resource_group_name   = "リソースグループ名"

  # NICのID
  network_interface_ids = ["${azurerm_network_interface.example.id}"]
  vm_size               = "VMのサイズ"

  # Shared Image Gallaryを参照するようにイメージバージョンのリソースIDを指定
  storage_image_reference {
    id = "イメージバージョンのリソースID"
  }

  storage_os_disk {
    name              = "OSディスク名"
    caching           = "ReadWrite"
    create_option     = "FromImage"
    managed_disk_type = "Standard_LRS"
  }

  storage_data_disk {
    name              = "データディスク名"
    caching           = "ReadWrite"
    create_option     = "FromImage"
    managed_disk_type = "Standard_LRS"
    disk_size_gb      = 1024

    # 論理ユニット番号(Logical Unit Number): 0 ~ 15
    lun               = 0
  }

  os_profile {
    computer_name  = "コンピュータ名"
    admin_username = "管理者ユーザ名"
    admin_password = "管理者ユーザパスワード"
  }

  os_profile_windows_config {
    provision_vm_agent        = false
    enable_automatic_upgrades = false
    timezone                  = "Tokyo Standard Time"
  }

 # ブート診断設定
  boot_diagnostics {
    enabled     = true
    storage_uri = "ストレージアカウントのプライマリURL"
  }
}

最後に

今回はAzure Shared Image Gallaryを用いたVMの複製を実施いたしました。
今後も業務で得た構築のノウハウをブログで紹介していけたらな、と思っています。