나의 삽질 저장소!

Packer로 이미지 만들어보기 - 3편

by softPine

Packer가 설치가 되면 이제 이미지를 빌드를 할 수 있다. 튜토리얼에서는 t2.micro Amazon EC2 AMI를 빌드를 한다.

 

Packer Template 사용

Packer Template이란 빌드할 이미지와 빌드 방법을 정의하는 구성 파일이다. 이 파일 내부는 HashiCorp사에서 만든 HCL[각주:1]이란 언어를 사용한다.

먼저 packer_tutorial 이라는 이름의 새로운 디렉터리를 만들고 이 디렉토리 Packer Template 튜토리얼에 대한 내용이 들어간다.

cd ~
mkdir packer_tutorial
cd packer_tutorial

생성한 디렉토리로 이동하여 aws-ubuntu.pkr.hcl 파일을 만든 후 해당 블럭을 내용에 추가한다.

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

source "amazon-ebs" "ubuntu" {
  ami_name      = "learn-packer-linux-aws"
  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"
  ]
}

위 파일은 완성된 Packer Template으로 AWS Ubuntu AMI를 서울 리전에 빌드할 수 있다. 다음 섹션에서는 Template의 각 블록을 설명한다.

 

Packer Block

packer{} 블록은 Packer 버전 지정을 포함한 설정 값들이 있다.

또한 이 블록안에는 required_plugins 블록을 볼 수 있는데, 이 블록은 이미지 빌드를 하기 위해 템플릿에 필요한 모든 플러그인들을 정의한다. Packer는 단일 바이너리로 패키징되지만, 기능의 대부분은 플러그인에 의존한다. 이 여러 플러그인 중 일부는 HashiCorp에서 빌드, 유지보수를 하지만 누구나 플러그인을 만들 수 있다.

각 플러그인 블록에는 버전 및 source 속성이 포함된다. Packer는 이러한 속성을 사용하여 적절한 플러그인을 다운받는다.

  • source 속성은 HashiCorp 도메인 외부에 플러그인이 필요한 경우에만 필요로 하다. 이 전체 목록들은 다음 Link에서 확인할 수 있다.
  • version 속성은 선택사항이지만 Packer에서 동작하지 않는 버전 Template을 사용하지 않도록 제한하는데 사용하는 것이 좋다. 플러그인 버전을 지정하지 않으면 Packer는 초기화 중에 가장 최신 버전을 자동으로 다운로드 받는다.

위 예제 템플릿에서는 Pakcer는 버전 0.0.1 보다 큰 Packer Amazon AMI 빌더 플러그인을 사용한다.

 

Source Block

source 블록은 특정 builder 플러그인을 구성한 다음 build 블록에서 호출한다. Source 블록은 buildercommunicators[각주:2]를 사용하여 사용할 가상화의 종류, 프로비저닝 할 이미지를 시작하는 방법 및 연결 방법을 정의한다. builder와 communicator는 source 블록 안에서 함께 번들로 구성된다. source는 여러 빌드에서 재사용 될 수 있으며, 단일 빌드 안에서 여러 source를 사용할 수 있다. builder 플러그인은 머신을 생성하고 해당 머신을 이미지로 변환하는 Packer의 구성요소이다.

소스 블록에는 builder type과 name이라는 두 가지 중요한 레이블이 있다. 이 두 레이블을 함께 사용하면 추후에 빌드 실행을 정의할 때 소스를 고유하게 참조할 수 있다.

예제 템플릿은 builder type은 amazon-ebs이고 이름은 ubuntu이다.

source "amazon-ebs" "ubuntu" {
  ami_name      = "learn-packer-linux-aws"
  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"
}

각 builder에는 고유의 구성 셋트를 가지고 있다. amazon-ebs builder는 소스로 부터 AMI를 실행한 후, 인스턴스 내에서 프로비저닝 도구를 실행한 다음 EBS 지원 AMI로 다시 재패키징한다.

예제 템플릿에서는 amazon-ebs builder 구성은 ap-northeast-2 리전에 ubuntu-xenial AMI를 기본 이미지로 사용하여 learn-pakcer-linux-aws라는 이미지를 생성한다. builder는 이미지가 생성되는 동안 인스턴스에 일시적으로 액세스하는 데 필요한 모든 리소스(ex. key pair, security group 등)를 생성한다.

이 예제는 ssh communicator도 사용한다. ssh_username 속성을 지정하면 Packer는 인스턴스를 프로비저닝하기 위해 임시 key pair 및 security group을 사용하여 ssh를 통해 EC2 인스턴스에 연결할 수 있다. 다음편에서 프로비저닝 도구를 사용하여 AMI를 수정해본다.

 

Build Block

build 블록은 Packer가 시작된 후 EC2 인스턴스로 수행해야하는 작업을 정의한다.

예제 템플릿에서 build 블록은 위의 소스 블록에서 정의한 AMI(source.amazon-ebs.ubuntu)를 참조한다.

build {
  sources = [
    "source.amazon-ebs.ubuntu"
  ]
}
Tip: 이후 튜토리얼에서는 provision(추가 프로비저닝 단계 정의) 블록을 추가하거나 post-process(빌드 아티팩트로 수행 할 작업 정의) 블록을 이 build 블록에 추가한다.

 

AWS 인증

AMI를 빌드하기 전에 AWS 자격 증명을 Packer 환경용으로 설정을 해야 한다. 자격 증명은 간단하게 환경 변수로도 셋팅 가능하니 다음처럼 진행하면 되지만 해당 자격 증명에 알맞는 권한이 부여되어 있어야 한다.

export AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY
export AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY

권한에 대해서는 해당 Link를 확인하면 된다.

 

Packer 구성 초기화

다음 명령어를 사용하여 Packer 구성을 초기화할 수 있다.

pk init .
# Installed plugin github.com/hashicorp/amazon v0.0.1 in "/root/.packer.d/plugins/github.com/hashicorp/amazon/packer-plugin-amazon_v0.0.1_x5.0_linux_amd64"

Packer 는 위에서 정의한 플러그인을 다운받는다. 이 케이스에서는 아마존 플러그인 중 0.0.1 보다 같거나 큰 버전을 다운 받는다. 만약 필요한 플러그인이 있을 경우 Packer는 출력없이 종료가 된다.

Packer는 이제 Amazon 플러그인을 다운로드하고 설치하여 AMI를 구축할 준비가 끝났다.

 

Packer 템플릿 포맷 및 유효성 검사

템플릿 파일에 대한 유효성 검사를 할 수 있다. 하위의 pk fmt 커맨드를 사용하면 템플릿에 대한 인덴트나 서식에 대해서 업데이트를 해준다. 만약 템플릿에 업데이트 사항이 있을 경우 해당 템플릿 파일의 이름을 반환하고 없을 경우에는 아무것도 반환하지 않고 끝난다.

pk fmt .

추가적으로 pk validate 명령을 사용하여 구성이 구문적으로 이상없고 일관성이 있는지 확인할 수도 있다.

validate 명령어를 실행 시 잘못된 구성을 감지하면 Packer는 파일 이름, 오류 유형 및 잘못된 구성의 줄번호를 반환해 주고, 없다면 아무것도 반환하지 않고 끝난다.

pk validate .

 

Packer 이미지 빌드

pk build 명령어를 사용하여 이미지를 빌드할 수 있다. 이미지 빌드 시 별 이상이 없다면 다음과 같은 메시지들을 볼 수 있다.

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

==> amazon-ebs.ubuntu: Prevalidating any provided VPC information
==> amazon-ebs.ubuntu: Prevalidating AMI Name: learn-packer-linux-aws
    amazon-ebs.ubuntu: Found Image ID: ami-08508144e576d5b64
==> amazon-ebs.ubuntu: Creating temporary keypair: packer_60bdb5c7-f631-5fef-f2ef-e49cf56b8644
==> amazon-ebs.ubuntu: Creating temporary security group for this instance: packer_60bdb5c8-fac6-5e0a-9516-a479389be2f2
==> amazon-ebs.ubuntu: Authorizing access to port 22 from [0.0.0.0/0] in the temporary security groups...
==> amazon-ebs.ubuntu: Launching a source AWS instance...
==> amazon-ebs.ubuntu: Adding tags to source instance
    amazon-ebs.ubuntu: Adding tag: "Name": "Packer Builder"
    amazon-ebs.ubuntu: Instance ID: i-02f93e3b166b62fcc
==> amazon-ebs.ubuntu: Waiting for instance (i-02f93e3b166b62fcc) to become ready...
==> amazon-ebs.ubuntu: Using ssh communicator to connect: 13.125.225.225
==> amazon-ebs.ubuntu: Waiting for SSH to become available...
==> amazon-ebs.ubuntu: Connected to SSH!
==> amazon-ebs.ubuntu: Stopping the source instance...
    amazon-ebs.ubuntu: Stopping instance
==> amazon-ebs.ubuntu: Waiting for the instance to stop...
==> amazon-ebs.ubuntu: Creating AMI learn-packer-linux-aws from instance i-02f93e3b166b62fcc
    amazon-ebs.ubuntu: AMI: ami-03e9cd8fda25c034e
==> amazon-ebs.ubuntu: Waiting for AMI to become ready...
==> amazon-ebs.ubuntu: Terminating the source AWS instance...
==> amazon-ebs.ubuntu: Cleaning up any extra volumes...
==> amazon-ebs.ubuntu: No volumes to clean up, skipping
==> amazon-ebs.ubuntu: Deleting temporary security group...
==> amazon-ebs.ubuntu: Deleting temporary keypair...
Build 'amazon-ebs.ubuntu' finished after 3 minutes 13 seconds.

==> Wait completed after 3 minutes 13 seconds

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

위 메시지가 확인이 된다면 AWS AMI 페이지로 가서 실제로 AMI가 생성이 되었는지 확인을 한다.

생성된 AMI 확인

 

이미지 관리

Packer는 오직 이미지만 빌드한다. 관리에 대한 건 전혀 관여하지 않는다. 이미지 빌드 후 관리에 대한 것은 오로지 사용자의 몫이다.

  1. Hashicorp Configuration Language [본문으로]
  2. Packer가 생성되는 컴퓨터에서 파일을 업로드하고 스크립트를 실행하는 데 사용하는 메커니즘. 커뮤니케이터는 빌더 섹션에서 구성한다. 현재 3가지 커뮤니케이터를 지원한다(None, ssh, winrm). [본문으로]

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

Packer 병렬 빌드 - 6편  (0) 2021.06.09
Packer 변수 - 5편  (0) 2021.06.08
Packer로 프로비저닝하기 - 4편  (0) 2021.06.07
Packer 설치 - 2편  (0) 2021.06.04
Packer란? - 1편  (0) 2021.06.04

블로그의 정보

나의 삽질저장소

softPine

활동하기