Packer를 사용하여 VM 이미지 빌드

Packer는 단일 소스 구성으로부터 여러 플랫폼에 대해 동일한 가상 머신(VM) 이미지를 만들기 위한 오픈소스 도구입니다. 이 페이지에서는 Packer 및 Cloud Build를 사용하여 Compute Engine에서 사용할 VM 이미지를 만드는 방법을 설명합니다.

시작하기 전에

이 페이지의 안내는 사용자가 Packer에 익숙하다고 가정합니다. 또한 다음 사항도 적용됩니다.

필수 IAM 권한

Packer 빌더 이미지 만들기

Cloud Build는 Cloud Build에서 packer 명령어를 호출하기 위해 사용할 수 있는 Packer 커뮤니티 빌더 이미지 를 제공합니다. Cloud Build 구성 파일에서 이 빌더를 사용하려면 먼저 이미지를 빌드하고 이를 Artifact Registry에 푸시해야 합니다.

  1. cloud-builders-community 저장소를 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
    
  2. Packer 빌더 이미지로 이동합니다.

    cd cloud-builders-community/packer
    
  3. 프로젝트에 빌더를 제출합니다.

    gcloud builds submit . --config cloudbuild.yaml --substitutions=_AR_HOST=[LOCATION]-docker.pkg.dev,_AR_REPO=[REPOSITORY]
    

    각 항목의 의미는 다음과 같습니다.

    • [LOCATION]은 Artifact Registry 저장소의 리전입니다.
    • [REPOSITORY]는 Artifact Registry 저장소의 이름입니다.

Packer 템플릿 만들기

packer.pkr.hcl이라는 새 파일을 만들고 템플릿 구성을 추가합니다.

다음 예시에서는 Compute Engine VM 이미지를 빌드하도록 구성된 Packer 템플릿 (packer.pkr.hcl)을 보여줍니다.

packer {
  required_plugins {
    googlecompute = {
      version = ">= 1.1.1"
      source  = "github.com/hashicorp/googlecompute"
    }
  }
}

variable "image_name" {
  type    = string
  description = "The name of the output VM image"
  default = "my-packer-image"
}
variable "project_id" {
  type    = string
  description = "The GCP project ID"
}
variable "image_family" {
  type    = string
  description = "The family of the output VM image"
  default = "my-image-family"
}
variable "image_zone" {
  type    = string
  description = "The zone to build the image in"
  default = "us-central1-a"
}

source "googlecompute" "gce" {
  project_id          = var.project_id
  source_image_family = "ubuntu-2004-lts"
  source_image_project_ids = ["ubuntu-os-cloud"]
  zone                = var.image_zone
  ssh_username        = "packer"
  machine_type        = "e2-small"
  image_name          = "${var.image_name}-"
  image_family        = var.image_family
}

build {
  name    = "gce-vm-image"
  sources = ["sources.googlecompute.gce"]

  provisioner "shell" {
    inline = [
      "echo 'Provisioning image...'",
      "sudo apt-get update",
      "sudo apt-get install -y nginx"
    ]
  }
}

Packer 빌더 사용

  1. Packer 템플릿 (예: packer.pkr.hcl)이 소스 코드와 함께 있는지 확인합니다.

  2. 프로젝트 루트 디렉터리에서 이름이 cloudbuild.yaml 또는 cloudbuild.json빌드 구성 파일 을 만듭니다.

  3. 빌드 구성 파일에서 packer build 명령어를 호출하기 위한 빌드 단계를 추가합니다.

    YAML

    steps:
    - name: '[LOCATION]-docker.pkg.dev/[PROJECT_ID]/[REPOSITORY]/packer'
      args:
      - build
      - -var
      - image_name=[IMAGE_NAME]
      - -var
      - project_id=[PROJECT_ID]
      - -var
      - image_family=[IMAGE_FAMILY]
      - -var
      - image_zone=[IMAGE_ZONE]
      - packer.pkr.hcl
    

    JSON

    {
      "steps": [
       {
          "name": "[LOCATION]-docker.pkg.dev/[PROJECT_ID]/[REPOSITORY]/packer",
          "args": [
            "build",
            "-var",
            "image_name=[IMAGE_NAME]",
            "-var",
            "project_id=[PROJECT_ID]",
            "-var",
            "image_family=[IMAGE_FAMILY]",
            "-var",
            "image_zone=[IMAGE_ZONE]",
            "packer.pkr.hcl"
           ]
        }
       ]
    }
    

    각 항목의 의미는 다음과 같습니다.

    • [LOCATION]은 Artifact Registry 저장소의 리전입니다.
    • [PROJECT_ID]는 Google Cloud 프로젝트 ID입니다.
    • [REPOSITORY]는 Artifact Registry 저장소의 이름입니다.
    • [IMAGE_NAME]은 빌드 중인 VM 이미지 이름입니다.
    • [IMAGE_FAMILY]는 VM 이미지의 이미지 계열입니다.
    • [IMAGE_ZONE]이미지 영역입니다.
  4. 빌드 구성 파일을 사용하여 빌드를 시작합니다.

    gcloud builds submit --region=[REGION] --config [CONFIG_FILE_PATH] [SOURCE_DIRECTORY]
    

    각 항목의 의미는 다음과 같습니다.

    • [CONFIG_FILE_PATH]는 빌드 구성 파일의 경로입니다.
    • [SOURCE_DIRECTORY]는 소스 코드의 경로 또는 URL입니다.
    • [REGION]지원되는 빌드 리전 중 하나입니다.

    gcloud builds submit 명령어에서 [CONFIG_FILE_PATH][SOURCE_DIRECTORY]를 지정하지 않으면 Cloud Build는 구성 파일과 소스 코드가 현재 작업 중인 디렉터리에 있다고 간주합니다.

이미지가 빌드되면 콘솔의 Compute Engine 이미지 페이지 에서 이를 볼 수 있습니다. Google Cloud

다음 단계