カスタム Windows BYOL イメージを作成する


Google Cloud 上に Windows VM を作成するには、Windows または Windows Server がプリインストールされている VM イメージを使用する必要があります。Google Cloud では、一般的に使用されているバージョンの Windows Server 用の公開イメージを提供しています。ただし、これらが適しているのは、オンデマンド ライセンスに限られます。お客様所有の Windows ライセンス(BYOL)を使用するには、既存のイメージをインポートするか、カスタム イメージをビルドする必要があります。

このガイドでは、Google Cloud が公開イメージの作成に使用するのと同じツールとプロセスを使用してカスタム イメージを作成する方法を説明します。

このガイドを完了するには、次のものが必要です。

  • Windows または Windows Server のインストール メディアを含む ISO ファイル。
  • (省略可)イメージに適用する 1 つ以上の Windows 更新パッケージ(.msu 形式)。

始める前に

ビルドプロセスを理解する

Windows をゼロからインストールするには、Windows インストール ファイルを含む DVD または ISO ファイルからコンピュータを起動するのが一般的な方法です。一部のオンプレミス ハイパーバイザとは異なり、Compute Engine では ISO ファイルからは起動できません。

したがって、Windows をゼロからインストールするには別のアプローチを採用する必要があります。それには以下の手順が含まれます。

  1. 新しいディスクを作成する。
  2. Windows イメージ(インストール メディアからの install.wim)をディスクに抽出する。
  3. 必要なドライバを追加して、Windows セットアップがそのまま動作するように構成し、ディスクを起動可能にする。
  4. 新しいディスクから起動して Windows セットアップを実行する。
  5. ゲスト OS エージェントなどの追加ソフトウェアをインストールする。
  6. ディスクからイメージを作成する。

このガイドでは、これらの手順を手動で行うのではなく、Cloud Builddaisy ツール、GitHub で公開されている参照ワークフローを使用してプロセスを自動化する方法を説明します。

daisyオープンソースのコマンドライン ツールで、ワークフローを実行できます。ワークフローは、一連の手順が記述された JSON ファイルとして作成されます。各ステップでは、ディスクの作成や VM インスタンスのシャットダウンなど、Compute Engine の操作について説明します。daisy ワークフローは、Windows イメージをゼロからビルドするのに必要な手順の自動化に適しています。

Windows のカスタム イメージをビルドするための daisy ワークフローにより、2 つの一時的な VM インスタンスが作成されます。最初の VM インスタンス(接頭辞 bootstrap)は、起動可能なディスクの作成に必要な手順を行います。2 番目の VM インスタンス(接頭辞 install)は、Windows セットアップを実行して、残りのすべての手順を行います。

イメージをビルドするためのプロジェクトを準備する

既存の VM インスタンスまたはインフラストラクチャに daisy ツールが干渉しないようにするため、イメージビルド専用のプロジェクトを作成します。

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  5. Google Cloud プロジェクトで課金が有効になっていることを確認します

  6. Compute Engine API、Cloud Build API、Cloud Storage API を有効にします。

    API を有効にする

次の手順は、ローカル コンピュータで Windows と Linux のいずれを使用しているかによって異なります。

Windows

  1. ローカル コンピュータで Windows PowerShell ウィンドウを開きます。
  2. 変数を初期化します。

    $PROJECT_ID = "PROJECT_ID"
    

    PROJECT_ID は、前のセクションで作成した Cloud プロジェクトのプロジェクト ID です。

  3. 別の変数を初期化して、このプロジェクトのプロジェクト番号を格納します。

    $PROJECT_NUMBER = gcloud projects describe $PROJECT_ID --format=value`(projectNumber`)
    
  4. RDP と SSH のアクセスに関するデフォルトのファイアウォール ルールを無効にします。

    gcloud compute firewall-rules update default-allow-rdp --project $PROJECT_ID --disabled
    gcloud compute firewall-rules update default-allow-ssh --project $PROJECT_ID --disabled
    
  5. Cloud Build でイメージのビルドに必要な一時的な VM インスタンスを作成できるように、Compute インスタンス管理者サービス アカウント ユーザーのロールを Cloud Build に付与します。

    gcloud projects add-iam-policy-binding $PROJECT_ID `
       --member serviceAccount:[email protected] `
       --role roles/compute.instanceAdmin.v1
    gcloud projects add-iam-policy-binding $PROJECT_ID `
       --member serviceAccount:[email protected] `
       --role roles/iam.serviceAccountUser
    

Linux

  1. ローカル コンピュータでターミナル ウィンドウを開きます。
  2. 変数を初期化します。

    PROJECT_ID=PROJECT_ID
    

    PROJECT_ID は、前のセクションで作成した Cloud プロジェクトのプロジェクト ID です。

  3. 別の変数を初期化して、このプロジェクトのプロジェクト番号を格納します。

    PROJECT_NUMBER=`gcloud projects describe $PROJECT_ID --format=value\(projectNumber\)`
    
  4. RDP と SSH のアクセスに関するデフォルトのファイアウォール ルールを無効にします。

    gcloud compute firewall-rules update default-allow-rdp --project $PROJECT_ID --disabled
    gcloud compute firewall-rules update default-allow-ssh --project $PROJECT_ID --disabled
    
  5. Cloud Build でイメージのビルドに必要な一時的な VM インスタンスを作成できるように、Compute インスタンス管理者サービス アカウント ユーザーのロールを Cloud Build に付与します。

    gcloud projects add-iam-policy-binding $PROJECT_ID \
       --member serviceAccount:[email protected] \
       --role roles/compute.instanceAdmin.v1
    gcloud projects add-iam-policy-binding $PROJECT_ID \
       --member serviceAccount:[email protected] \
       --role roles/iam.serviceAccountUser
    

インストール ファイルをアップロードする

カスタム イメージに必要なすべてのインストール ファイルを収集して、Cloud Storage バケットにアップロードします。ファイルを Cloud Storage バケットに格納することで、daisy、および daisy がイメージのビルドに使用する一時的な VM インスタンスがファイルにアクセスできるようになります。

  1. ローカル コンピュータで、必要なインストール パッケージをダウンロードします。

  2. インストール ファイルを格納する新しい Cloud Storage バケットを作成します。

    gsutil mb -p $PROJECT_ID gs://$PROJECT_ID-media
    
  3. Storage オブジェクト閲覧者のロールを Cloud Storage に付与して、インストール ファイルの読み取りを行えるようにします。

    gsutil iam ch serviceAccount:[email protected]:objectViewer  gs://$PROJECT_ID-media
    
  4. PowerShell インストール パッケージをアップロードします。

    gsutil cp POWERSHELL_PACKAGE gs://$PROJECT_ID-media/PowerShell.msi
    

    ここで、POWERSHELL_PACKAGE は PowerShell インストール パッケージのパスです。

  5. .NET Framework インストール パッケージをアップロードします。

    gsutil cp DOTNET_PACKAGE gs://$PROJECT_ID-media/dotnet-sdk.exe
    

    ここで、DOTNET_PACKAGE は、NET Framework インストール パッケージのパスです。

  6. gcloud CLI インストール パッケージをアップロードします。

    gsutil cp CLOUDSDK_PACKAGE gs://$PROJECT_ID-media/GoogleCloudSDKInstaller.exe
    

    ここで、CLOUDSDK_PACKAGE は gcloud CLI インストール パッケージのパスです。

  7. Windows インストール メディアを含む ISO ファイルをアップロードします。

    gsutil cp ISO gs://$PROJECT_ID-media/
    

    ここで、ISO は ISO ファイルの名前です。

  8. (省略可)追加のアップデート パッケージをアップロードします。

    gsutil cp UPDATE_DIR/*.msu gs://$PROJECT_ID-media/updates/
    

    ここで、UPDATE_DIR はアップデート パッケージを含むディレクトリです。

これで、カスタム イメージをビルドする準備が整いました。

イメージをビルドする

daisy ワークフローを実行してカスタム イメージをビルドするには、最大 4 時間ほどかかります。daisy をローカルで実行するのではなく、Cloud Build がバックグラウンドでワークフローを実行できるようにするために Cloud Build の構成を作成します。

  1. ローカル コンピュータで、Windows イメージをビルドするための daisy ワークフローを含む Git リポジトリのクローンを作成します。

    git clone https://github.com/GoogleCloudPlatform/compute-image-tools.git
    
  2. windows ディレクトリに切り替えます。

    cd compute-image-tools/daisy_workflows/image_build/windows/
    
  3. windows ディレクトリで、.wf.json というサフィックスが付いたさまざまなファイルの一覧を確認できます。これらのファイルには、一般的に使用される Windows のバージョンに対する daisy ワークフロー定義が含まれています。

    Windows のバージョン ワークフロー ファイル
    Windows Server 2019(64 ビット) windows-server-2019-dc-uefi-byol.wf.json
    Windows Server Core 2019(64 ビット) windows-server-2019-dc-core-uefi-byol.wf.json
    Windows Server 2016(64 ビット) windows-server-2016-dc-uefi-byol.wf.json
    Windows Server Core 2016(64 ビット) windows-server-2016-dc-core-uefi-byol.wf.json
    Windows 10(64 ビット) windows-10-20h2-ent-x64-uefi-byol.wf.json

    インストールする Windows のバージョンに最も近いワークフロー ファイルを開きます。必要に応じて、ワークフロー ファイル内の Windows エディション(edition)とライセンスキー(product_key)の設定を変更して、インストール メディアと一致させます。

    正しいエディション名がわからない場合は、昇格した PowerShell プロンプトを開き、次のコマンドを実行すると、対象のインストール メディアでサポートされているすべてのエディションが一覧表示されます。

    $IsoFile = "ISO"
    
    $Mount = Mount-DiskImage -ImagePath (Resolve-Path $IsoFile)
    
    $DriveLetter = ($Mount | Get-Volume).DriveLetter
    Get-WindowsImage -ImagePath "$($DriveLetter):\sources\install.wim" | select ImageName
    
    Dismount-DiskImage -InputObject $Mount | Out-Null
    

    ISO は、ISO イメージのローカルパスに置き換えます。

  4. windows ディレクトリに、cloudbuild.yaml という名前のファイルを新しく作成して、次のコードを貼り付けます。

    timeout: 14400s  # 4 hour timeout for entire build
    steps:
    - name: 'gcr.io/compute-image-tools/daisy'
      timeout: 14400s  # 4 hour timeout for build step
      args:
        - -project=$PROJECT_ID
        - -zone=us-central1-a
        - -var:updates=gs://$PROJECT_ID-media/updates/
        - -var:pwsh=gs://$PROJECT_ID-media/PowerShell.msi
        - -var:dotnet48=gs://$PROJECT_ID-media/dotnet-sdk.exe
        - -var:cloudsdk=gs://$PROJECT_ID-media/GoogleCloudSDKInstaller.exe
        - -var:media=gs://$PROJECT_ID-media/ISO
        - WORKFLOW
    

    以下のように置き換えます。

    • ISO: Cloud Storage 上の ISO ファイルの名前。
    • WORKFLOW: 使用している Windows のバージョンに対応するワークフロー ファイルの名前。
  5. Cloud Build にビルドを送信します。

    gcloud builds submit --project $PROJECT_ID --async
    

    ビルドが完了するまでに最大で 4 時間ほどかかります。Google Cloud Console の [Cloud Build] > [履歴] でビルドのステータスを追跡できます。

    Cloud Build 履歴

カスタム イメージを使用する

ビルドが完了したら、Google Cloud コンソール の [Compute Engine] > [イメージ] で BYOL のカスタム イメージを確認できます。

同じイメージの複数のバージョンを区別できるように、ビルドプロセス時に、イメージ名にタイムスタンプが埋め込まれます(例: windows-server-2019-dc-v1613488342)。また、このプロセス時に、イメージとカスタム イメージ ファミリーwindows-server-2019 など)が関連付けられます。

BYOL のカスタム イメージを使用する VM インスタンスを作成するには、単一テナントノードに VM インスタンスをプロビジョニングする必要があります。

トラブルシューティング

ビルドプロセスが失敗した、または停止していると思われる場合は、次の方法で状況を診断してください。

  • 適切なインストール パッケージと ISO ファイルをアップロードしたことを確認します。
  • Windows の ISO ファイルのバージョンと一致するワークフローが選択されていることを確認します。
  • Cloud Build のビルドログを確認し、エラー メッセージがあるかどうか確認します。
  • ビルドが停止していると思われる場合は、ビルドによって作成された VM インスタンスのシリアルポート出力を確認し、エラー メッセージをチェックします。

次のステップ