[HashiCorp] Packer 를 활용한 AWS AMI 생성

유형욱·2022년 2월 8일
1

0. 개요

👋 본 글에서는 Packer를 활용하여 AWS AMI를 생성하는 방법에 대해 알아본다.

💡 참고 : HashiCorp Learn - Packer : AWS

1. Packer Template 준비

Packer Template

Packer Template은 어떻게 이미지를 빌드할지 정의하는 설정파일 이다. Packer Template은 HCL(HashiCorp Language)과 json 을 문법을 지원한다.

  • packer라는 디렉토리를 생성한다. 해당 디렉토리에 Packer Template을 작성할 예정이다.
mkdir packer
  • packer 디렉토리로 이동한다.
cd packer
  • aws-centos-for-accordion.pkr.hcl 파일을 생성하고 HCL block을 추가하자
# packer 블록에는 필수 packer 버전 및 설정 정의
packer {
  required_plugins {
    amazon = {
      version = ">= 0.0.2"
      source  = "github.com/hashicorp/amazon"
    }
  }
}

# source 블록에는 실제 빌드할 이미지에 대한 스펙을 정의
source "amazon-ebs" "accordion-centos7" {
  ami_name      = "accordion-packer-linux-centos7"
  instance_type = "t2.large"
  region        = "ap-northeast-2"
  source_ami_filter {
    filters = {
      image-id            = "ami-0e4214f08b51e23cc"
      root-device-type    = "ebs"
      virtualization-type = "hvm"
    }
    most_recent = true
    owners      = ["125523088429"]
  }
  ssh_username = "centos"
}

build {
  name = "accordion-packer"
  sources = [
    "source.amazon-ebs.accordion-centos7"
  ]

  provisioner "shell" {
    environment_vars = [
      "FOO=hello world",
    ]
    inline = [
      "sleep 30",
      "echo \"FOO is $FOO\" > example.txt",
    ]
  }
}

필자는 기존샘플에서 제공되는 ubuntu 이미지가 아닌 ap-northeast-2 리전에 있는 CentOS7 기반의 이미지를 사용했다. 이때, 기본 AMI를 찾기위해 아래 명령을 사용했다.

💡 참고 : 공식 계정(official accounts) 번호

  • amazon : 137112412989
  • centos : 125523088429
  • ubuntu : 099720109477
  • debian9 : 379101102735
  • debian10 : 136693071363
  • debian11 : 136693071363
  • redhat : 309956199498
  • aws ec2 describe-images 명령으로 사용할 이미지 검색
aws ec2 describe-images --owners 125523088429 --query 'sort_by(Images, &CreationDate)[*].[CreationDate,Name,ImageId]' --filters "Name=name,Values=Cent*" --region ap-northeast-2 --output table

-------------------------------------------------------------------------------------------
|                                     DescribeImages                                      |
+--------------------------+------------------------------------+-------------------------+
|  2020-06-13T09:51:17.000Z|  CentOS 8.2.2004 x86_64            |  ami-09cdc4034bbb65412  |
|  2020-06-13T12:40:15.000Z|  CentOS 8.2.2004 aarch64           |  ami-0f0f98b490f433dea  |
|  2020-06-25T07:39:11.000Z|  CentOS 7.8.2003 x86_64            |  ami-0cf8e67d10c823f2e  |
|  2020-06-25T08:44:15.000Z|  CentOS 7.8.2003 aarch64           |  ami-096048bf9ebc229f2  |
|  2020-11-10T17:14:37.000Z|  CentOS 7.9.2009 x86_64            |  ami-0e4214f08b51e23cc  |
|  2020-11-10T17:44:58.000Z|  CentOS 7.9.2009 aarch64           |  ami-09e34a2c74d315279  |
|  2020-12-04T22:03:40.000Z|  CentOS 8.3.2011 aarch64           |  ami-0682d8d64372755c4  |
|  2020-12-04T22:12:36.000Z|  CentOS 8.3.2011 x86_64            |  ami-06c6d129b47acaba9  |
|  2020-12-18T16:27:24.000Z|  CentOS Stream 8 x86_64            |  ami-068ba57b029f1a659  |
|  2020-12-18T16:29:06.000Z|  CentOS Stream 8 aarch64           |  ami-0ce351a2d881108d5  |
|  2021-06-02T10:23:35.000Z|  CentOS 8.4.2105 x86_64            |  ami-09ac2b4b2f625d4a8  |
|  2021-06-02T13:46:12.000Z|  CentOS 8.4.2105 aarch64           |  ami-0d0915377dd915299  |

이 중에서 CentOS 7.9.2009 x86_64ami-0e4214f08b51e23cc를 사용하였다.

💡 참고 : RHEL8 설치관련 문서

2. Packer Template 빌드

Template 작성이 끝났으니 이제 빌드를 해보자

Packer 설정 초기화

  • Initialize Packer configuration
packer init .
Installed plugin github.com/hashicorp/amazon v1.0.8 in "/home/hyungwook/.config/packer/plugins/github.com/hashicorp/amazon/packer-plugin-amazon_v1.0.8_x5.0_linux_amd64"

포맷 및 유효성 검증

  • Format and validate your Packer template-1
packer fmt .
aws-centos-for-accordion.pkr.hcl
  • Format and validate your Packer template-2
packer validate .
The configuration is valid.

Packer 이미지 빌드

packer build aws-centos-for-accordion.pkr.hcl
accordion-packer.amazon-ebs.accordion-centos7: output will be in this color.

==> accordion-packer.amazon-ebs.accordion-centos7: Prevalidating any provided VPC information
==> accordion-packer.amazon-ebs.accordion-centos7: Prevalidating AMI Name: accordion-packer-linux-centos7
    accordion-packer.amazon-ebs.accordion-centos7: Found Image ID: ami-0e4214f08b51e23cc
==> accordion-packer.amazon-ebs.accordion-centos7: Creating temporary keypair: packer_62027a5a-5b05-41ea-bb18-fc54807cde51
==> accordion-packer.amazon-ebs.accordion-centos7: Creating temporary security group for this instance: packer_62027a5c-428c-6cbb-f181-68e778109cd9
==> accordion-packer.amazon-ebs.accordion-centos7: Authorizing access to port 22 from [0.0.0.0/0] in the temporary security groups...
==> accordion-packer.amazon-ebs.accordion-centos7: Launching a source AWS instance...
==> accordion-packer.amazon-ebs.accordion-centos7: Adding tags to source instance
    accordion-packer.amazon-ebs.accordion-centos7: Adding tag: "Name": "Packer Builder"
    accordion-packer.amazon-ebs.accordion-centos7: Instance ID: i-066a2001802cae9df
==> accordion-packer.amazon-ebs.accordion-centos7: Waiting for instance (i-066a2001802cae9df) to become ready...
==> accordion-packer.amazon-ebs.accordion-centos7: Using SSH communicator to connect: 13.209.65.24
==> accordion-packer.amazon-ebs.accordion-centos7: Waiting for SSH to become available...
==> accordion-packer.amazon-ebs.accordion-centos7: Connected to SSH!
==> accordion-packer.amazon-ebs.accordion-centos7: Provisioning with shell script: /tmp/packer-shell853523656
==> accordion-packer.amazon-ebs.accordion-centos7: Stopping the source instance...
    accordion-packer.amazon-ebs.accordion-centos7: Stopping instance
==> accordion-packer.amazon-ebs.accordion-centos7: Waiting for the instance to stop...
==> accordion-packer.amazon-ebs.accordion-centos7: Creating AMI accordion-packer-linux-centos7 from instance i-066a2001802cae9df
    accordion-packer.amazon-ebs.accordion-centos7: AMI: ami-003a2ad6820c73648
==> accordion-packer.amazon-ebs.accordion-centos7: Waiting for AMI to become ready...
==> accordion-packer.amazon-ebs.accordion-centos7: Skipping Enable AMI deprecation...
==> accordion-packer.amazon-ebs.accordion-centos7: Terminating the source AWS instance...
==> accordion-packer.amazon-ebs.accordion-centos7: Cleaning up any extra volumes...
==> accordion-packer.amazon-ebs.accordion-centos7: No volumes to clean up, skipping
==> accordion-packer.amazon-ebs.accordion-centos7: Deleting temporary security group...
==> accordion-packer.amazon-ebs.accordion-centos7: Deleting temporary keypair...
Build 'accordion-packer.amazon-ebs.accordion-centos7' finished after 4 minutes 3 seconds.

==> Wait completed after 4 minutes 3 seconds

==> Builds finished. The artifacts of successful builds are:
--> accordion-packer.amazon-ebs.accordion-centos7: AMIs were created:
ap-northeast-2: ami-003a2ad6820c73648

성공적으로 이미지가 빌드되었다. 이제 AWS Console에 접속해서 실제 AMI가 생성되었는지 확인해보자.


정상적으로 accordion-packer-linux-centos7 이미지가 생성된 것으로 확인된다. 해당 AMI로 EC2를 배포하기 위해서는 우측 상단의 [이미지로 인스턴스 시작]을 클릭하면 된다.

SSH 접속 테스트

  • 사전에 준비된 .pem키 파일을 사용하여 ssh 접속해보자
ssh -i test2.pem centos@13.123.123.123

[centos@ip-172-31-38-201 ~]$ ls -lrt
total 4
-rw-rw-r--. 1 centos centos 19 Feb  8 14:14 example.txt
[centos@ip-172-31-38-201 ~]$ cat example.txt
FOO is hello world

SSH 접속 후 shell provisioner에서 inline으로 선언한 example.txt 파일도 정상적으로 생성된 것을 확인하였다.


3. 맺음말

이렇게 Packer에 대한 간단한 소개 및 샘플 AMI 배포까지 해보았다. 처음으로 사용해보는 Packer였는데 HCL이 매우 직관적이어서 간단하게 AMI를 만들 수 있었다.

다음편에서는 필요한 파일을 복제하고 인스턴스에 대한 사전 구성(Configuration)을 하는 방법에 대해서 알아보려 한다. script 방식과 ansible 방식 중 어떤 것을 사용할지도 고민해봐야겠다.👋

profile
DevOps를 꿈꾸는 엔지니어 입니다.

0개의 댓글