나의 삽질 저장소!

Packer 병렬 빌드 - 6편

by softPine

이전 튜토리얼에서는 Packer 템플릿에서 매개변수를 설정하여 AMI 이름 등을 자동으로 업데이트하는 등의 튜토리얼을 했었다. 이번에는 병렬 빌드를 하도록 해보겠다.

병렬 빌드는 Packer의 유용하고 중요한 기능 중 하나로, 동일한 스크립트로 프로비저닝 된 AWS AMI와 VMware VM을 동시에 구축하여 거의 동일한 이미지를 생성할 수 있다. AMI의 경우 라이브 서비스 용도로 사용을 하고, VM의 경우는 개발에 사용할 수 있다.

다른 예로는 Packer를 사용하여 소프트웨어 어플라이언스를 작성하는 경우 지원되는 모든 플랫폼에 대해 단일 템플릿에서 병렬로 빌드할 수 있다.

또한 도커 이미지를 병렬 이미지로 빌드할 수 있다. 이 두번째 도커 이미지는 쉽게 다른 하이퍼바이저나 다른 클라우드 플랫폼에서 사용할 수 있다.

 

사전 준비 사항

이번에도 이전 튜토리얼을 잘 따라왔다면 준비 사항은 없다. 기존의 템플릿만 확인한다.

packer {
  required_plugins {
    amazon = {
      version = ">= 0.0.1"
      source  = "github.com/hashicorp/amazon"
    }
  }
}

variable "ami_prefix" {
  type    = string
  default = "learn-packer-linux-aws-redis"
}

locals {
  timestamp = regex_replace(timestamp(), "[- TZ:]", "")
}

source "amazon-ebs" "ubuntu" {
  ami_name      = "${var.ami_prefix}-${local.timestamp}"
  instance_type = "t2.micro"
  region        = "ap-northeast-2"
  source_ami_filter {
    filters = {
      name                = "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*"
      root-device-type    = "ebs"
      virtualization-type = "hvm"
    }
    most_recent = true
    owners      = ["099720109477"]
  }
  ssh_username = "ubuntu"
}

build {
  sources = [
    "source.amazon-ebs.ubuntu"
  ]

  provisioner "shell" {
    environment_vars = [
      "FOO=hello world",
    ]
    inline = [
      "echo Installing Redis",
      "sleep 30",
      "sudo apt-get update",
      "sudo apt-get install -y redis-server",
      "echo \"FOO is $FOO\" > example.txt",
    ]
  }

  provisioner "shell" {
    inline = ["echo This provisioner runs last"]
  }
}

 

템플릿에 병렬 빌드 추가하기

병렬 빌드를 사용하려면 기존의 source 블럭을 작성한 후 build 블록 내부에 있는 sources 어레이의 하위에 추가를 해주면 된다. 만약 source 가 동일한 유형일 경우 추가할 필요는 없다. 이렇게 하면 Packer는 빌드 시 여러 이미지를 빌드한다.

aws-ubuntu.pkr.hcl 파일에서 다음의 source 블럭을 추가한다. 기존에 있던 source 블럭과 유사하지만 ubuntu-focal-20.04 AMI를 사용하며 AMI의 이름에 -focal이란 값이 붙는다.

source "amazon-ebs" "ubuntu-focal" {
  ami_name      = "${var.ami_prefix}-focal-${local.timestamp}"
  instance_type = "t2.micro"
  region        = "ap-northeast-2"
  source_ami_filter {
    filters = {
      name                = "ubuntu/images/*ubuntu-focal-20.04-amd64-server-*"
      root-device-type    = "ebs"
      virtualization-type = "hvm"
    }
    most_recent = true
    owners      = ["099720109477"]
  }
  ssh_username = "ubuntu"
}

추가적으로 build 블럭 하위의 sources 어레이의 하단에 새로운 source를 추가해준다.

build {
  sources = [
-    "source.amazon-ebs.ubuntu"
+    "source.amazon-ebs.ubuntu",
+    "source.amazon-ebs.ubuntu-focal"
  ]
  ## ...
}

추가가 완료되었다면 새로운 소스로부터 이미지를 빌드한다.

 

이미지 빌드 및 확인

이미지를 빌드하게 되면 각각의 빌드에 대해서 색상이 다른 코드를 출력해준다. 각각의 색상으로 해당 빌드의 현재 진행상황을 알아볼 수 있다. 이 예제에서는 기존의 ubuntu와 ubuntu-focal에 대해서 병렬 빌드가 되고 있는 것을 확인할 수 있다.

pk build .
amazon-ebs.ubuntu: output will be in this color.
amazon-ebs.ubuntu-focal: output will be in this color.

==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs.ubuntu: AMIs were created:
ap-northeast-2: ami-0552325e9eeae3908

--> amazon-ebs.ubuntu-focal: AMIs were created:
ap-northeast-2: ami-0414acd6624994d86

'OpenSource > Packer' 카테고리의 다른 글

Packer 변수 - 5편  (0) 2021.06.08
Packer로 프로비저닝하기 - 4편  (0) 2021.06.07
Packer로 이미지 만들어보기 - 3편  (0) 2021.06.06
Packer 설치 - 2편  (0) 2021.06.04
Packer란? - 1편  (0) 2021.06.04

블로그의 정보

나의 삽질저장소

softPine

활동하기