[HashiCorp] Packer 를 활용한 AWS AMI 생성
0. 개요
👋 본 글에서는 Packer를 활용하여 AWS AMI를 생성하는 방법에 대해 알아본다.
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_64
인 ami-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 [email protected]
[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 방식 중 어떤 것을 사용할지도 고민해봐야겠다.👋
Author And Source
이 문제에 관하여([HashiCorp] Packer 를 활용한 AWS AMI 생성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hyungwook/HashiCorp-Packer-를-활용한-AWS-AMI-생성저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)