커스텀 Windows BYOL 이미지 만들기


Google Cloud에서 Windows VM을 만들려면 Windows 또는 Windows Server가 미리 설치된 VM 이미지를 사용해야 합니다. Google Cloud는 일반적으로 사용되는 Windows Server 버전에 대한 공개 이미지를 제공하지만, 이러한 이미지는 주문형 라이선스에만 적합합니다. 사용자 Windows 라이선스 사용(BYOL)을 위해서는 기존 이미지 가져오기를 수행하거나 커스텀 이미지를 빌드해야 합니다.

이 가이드에서는 Google Cloud에서 공개 이미지를 만들기 위해 사용되는 것과 동일한 도구 및 프로세스를 사용하여 커스텀 이미지를 만드는 방법을 설명합니다.

이 가이드를 완료하려면 다음이 필요합니다.

  • Windows 또는 Windows Server 설치 미디어가 포함된 ISO 파일이 필요합니다.
  • 선택적으로 이미지에 적용할 하나 이상의 Windows 업데이트 패키지(.msu 형식)가 포함될 수 있습니다.

시작하기 전에

빌드 프로세스 이해

Windows를 처음부터 새로 설치할 때 일반적인 방법은 Windows 설치 파일이 포함된 DVD 또는 ISO 파일로 컴퓨터를 부팅하는 것입니다. 일부 온프레미스 하이퍼바이저와 달리 Compute Engine은 ISO 파일에서 부팅을 지원하지 않습니다.

따라서 Windows를 처음부터 새로 설치하기 위해서는 다음 단계를 지원하는 다른 방법을 따라야 합니다.

  1. 새 디스크를 만듭니다.
  2. Windows 이미지(설치 미디어의 install.wim)를 디스크에 추출합니다.
  3. 자동 실행이 가능하도록 필요한 드라이버를 추가하고, Windows 설정을 구성하고, 디스크를 부팅 가능하게 만듭니다.
  4. 새 디스크에서 부팅하여 Windows 설치 프로그램을 실행합니다.
  5. 게스트 OS 에이전트를 포함하여 추가 소프트웨어를 설치합니다.
  6. 디스크로부터 이미지를 만듭니다.

이 가이드에서는 이러한 단계를 수동으로 수행하는 대신 GitHub에서 제공되는Cloud Build, daisy 도구, 참조 워크플로를 사용하여 프로세스를 자동화하는 방법을 설명합니다.

daisy는 워크플로를 실행할 수 있게 해주는 오픈소스 명령줄 도구입니다. 워크플로는 JSON 파일로 작성되며 일련의 단계를 포함합니다. 이러한 각 단계는 디스크 만들기, VM 인스턴스 종료와 같은 Compute Engine 작업을 설명합니다. 따라서 Daisy 워크플로는 Windows 이미지를 처음부터 새로 빌드하는 데 필요한 단계를 자동화하는 데 적합합니다.

커스텀 Windows 이미지를 빌드하기 위한 daisy 워크플로는 2개의 임시 VM 인스턴스를 만듭니다. 첫 번째 VM 인스턴스(bootstrap 프리픽스)는 부팅 가능한 디스크를 만드는 데 필요한 단계를 수행합니다. 두 번째 VM 인스턴스(install 프리픽스)는 Windows 설치 프로그램을 실행하고 남은 모든 단계를 수행합니다.

이미지 빌드를 위한 프로젝트 준비

daisy 도구가 기존 VM 인스턴스 또는 인프라와 충돌하지 않도록 방지하기 위해 이미지 빌드를 위한 전용 프로젝트를 만듭니다.

  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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Compute Engine API, Cloud Build API, Cloud Storage API를 사용 설정합니다.

    API 사용 설정

다음 단계는 로컬 컴퓨터에서 Windows 또는 Linux를 사용하는지에 따라 달라집니다.

Windows

  1. 로컬 컴퓨터에서 Windows PowerShell 창을 엽니다.
  2. 변수를 초기화합니다.

    $PROJECT_ID = "PROJECT_ID"
    

    여기에서 PROJECT_ID는 이전 섹션에서 만든 클라우드 프로젝트의 프로젝트 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:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com `
       --role roles/compute.instanceAdmin.v1
    gcloud projects add-iam-policy-binding $PROJECT_ID `
       --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com `
       --role roles/iam.serviceAccountUser
    

Linux

  1. 로컬 컴퓨터에서 터미널 창을 엽니다.
  2. 변수를 초기화합니다.

    PROJECT_ID=PROJECT_ID
    

    여기에서 PROJECT_ID는 이전 섹션에서 만든 클라우드 프로젝트의 프로젝트 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:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
       --role roles/compute.instanceAdmin.v1
    gcloud projects add-iam-policy-binding $PROJECT_ID \
       --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
       --role roles/iam.serviceAccountUser
    

설치 파일 업로드

이제 커스텀 이미지에 필요한 모든 설치 파일을 수집하고 이를 Cloud Storage 버킷에 업로드합니다. Cloud Storage 버킷에 파일을 저장하면 이미지 빌드를 위해 daisy에 사용되는 임시 VM 인스턴스와 daisy에서 파일에 액세스할 수 있습니다.

  1. 로컬 컴퓨터에서 필요한 설치 패키지를 다운로드합니다.

  2. 설치 파일을 저장할 새 Cloud Storage 버킷을 만듭니다.

    gsutil mb -p $PROJECT_ID gs://$PROJECT_ID-media
    
  3. 설치 파일을 읽을 수 있도록 스토리지 객체 뷰어 역할을 Cloud Build에 부여합니다.

    gsutil iam ch serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com: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 파일을 업로드했는지 확인합니다.
  • ISO 파일의 Windows 버전과 일치하는 워크플로를 선택했는지 확인합니다.
  • Cloud Build의 빌드 로그를 검토하고 오류 메시지가 있는지 확인합니다.
  • 빌드가 멈춘 것 같으면 빌드로 생성된 VM 인스턴스의 직렬 포트 출력을 검토하고 오류 메시지를 확인합니다.

다음 단계