이번시간에는 간단하게 패커를 이용해서 EC2 AMI이미지를 만드는 전체적인 워크플로우를 실습하고 마치도록 하겠습니다.
https://github.com/LE123123/packer-practice
GitHub - LE123123/packer-practice
Contribute to LE123123/packer-practice development by creating an account on GitHub.
github.com
여기 제 깃에 연습코드를 작성해 놓았습니다.
/main.pkr.hcl
packer {
required_version = "~> 1.7"
required_plugins {
amazon = {
version = "~> 1.0"
source = "github.com/hashicorp/amazon"
}
}
}
source "amazon-ebs" "ubuntu" {
ami_name = "fastcampus-packer"
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 {
name = "fastcampus-packer"
sources = [
"source.amazon-ebs.ubuntu"
]
}
간단한 packer의 HCL파일을 분석해 보고 빌드해보겠습니다.
우선 packer블럭은 기존의 terraform블럭과 비슷합니다. 여기에는 packer의 최소버전과, 의존성의 최소버전을 명시하는 것을 보실 수 있습니다.
그리고 그 아래에는 source블럭을 통해서 amazon-ebs라는 타입으로 ubuntu라는 소스를 만들고 있습니다. 이러한 소스를 build블럭에서 활용하고 있는 것으로 보입니다.
이제 packer init .을 통해서 packer를 사용하기 위한 사전작업을 해주고, packer build .을 통해서 빌드를 합니다.
$ packer init .
$ packer build .
여기서 build를 하고 , packer가 어떻게 동작하는지 궁금해 할 수도 있습니다. packer는 이에 대한 로그를 남기기 때문에, 이를 읽어도 패커의 동작방식을 이해할 수 있습니다.
우선 AWS EC2를 위한 이미지가 있을 것입니다. Ubuntu20.0.4를 활용합니다. 그리고 EC2의 provisioning과정을 거칩니다. 그리고 EC2를 중지하고, EC2인스턴스의 AMI 스냅샷을 찍습니다.
그리고 provisioning을 위해서는 SSH key, 보안그룹이 있어야 합니다.
로그를 보면, temporary keypair, security group을 통해서 22번 포트에 접근하는 것을 보실 수 있습니다. 그리고 SSH communicator를 통해서 만든 Ubuntu서버로 SSH접근을 성공한 것을 보실 수 있습니다.
그 다음에는 provisioning코드가 있다면 실행했겠지만, 작성하지 않아서 바로 EC2인스턴스를 중지하는 것을 보실 수 있습니다. 그리고 중지가 완료되면 AMI 스냅샷을 찍고 끝나게 될겁니다.
그리고 AMI Image를 다 삭제하고, 기존의 인스턴스, 키페어, 보안그룹을 삭제합니다.
또한, 패커는 이미지 빌드도구이지, 관리도구가 아닙니다. 그렇기 때문에 패커를 통해서 만들어진 이미지를 지우는 것은 패커의 역할이 아니고, 스스로 지워야 합니다.
HCL 문법
기본적으로 build, locals, source, variable, packer, data블럭이 있는데, 여기서 기존의 terraform HCL문법에 없던것은 build, source입니다.
그리고 build는 nest block인데, 이 안에 4가지 블럭이 더 있습니다. 이는 중요하므로 나중에 다 하나하나 알아보도록 하겠습니다.
빌더
패커에서 빌더란 어떤 머신이미지를 만들건지 결정해주는 것이라고 보시면 됩니다. 여기에는 AWS EC2 AMI, Docker AMI, GCP 이미지... 등이 있을 수 있습니다.
또한, Builders 공식문서를 보면, AWS EC2를 만드는데도, 많은 방법이 있는 것을 보실 수 있습니다. 우리는 이중에서 EBS를 통해서 AWS AMI이미지를 만들어 보도록 하겠습니다.
그리고 이번시간에는 build와 관련된 packer의 HCL문법을 간단히 알아보겠습니다. 그리고 이번에는 AWS EBS빌더를 이용하는 것이 아니라 Null 빌더를 통해서 진행하겠습니다. AWS EC2이미지를 굽는 것은 생각보다 시간이 많이걸립니다. 그래서 간단하게 Null 빌더를 통해서 간단히 진행하겠습니다. 이는 아무것도 생성하지 않는 빌더를 말합니다.
/versions.pkr.hcl
packer {
required_version = "~> 1.7"
required_plugins {
amazon = {
version = "~> 1.0"
source = "github.com/hashicorp/amazon"
}
}
}
Amazon EC2이미지를 생성하기 위한 Plugin의 버전을 packer블럭을 통해 명시했습니다.
/sources.pkr.hcl
source "null" "one" {
communicator = "none"
}
source "null" "two" {
communicator = "none"
}
여기서 source블럭을 사용했습니다. null빌더를 사용해서 one, two라는 이름으로 선언해 주었습니다. 그리고 communicator를 none으로 주었는데, 이는 나중에 provisioning과 관련된 것입니다. null 빌더는 아무것도 만들지 않는데, provisioning을 하는것도 이상합니다.
/main.pkr.hcl
/**
* Without Name
*/
build {
sources = [
"source.null.one",
"source.null.two",
]
}
그리고 main에서는 build블럭을 통해 위에서 만든 null source2개를 실행했습니다. 이들간의 순서는 상관없습니다.
null 빌더를 통해서 정상적으로 실행되는 것을 확인할 수 있습니다.
/main.pkr.hcl
/**
* Without Name
*/
build {
sources = [
"source.null.one",
"source.null.two",
]
}
/**
* With Name
*/
build {
name = "fastcampus-packer"
sources = [
"source.null.one",
"source.null.two",
]
}
그리고 build블럭에 name을 주게되면 아래와 같이 prefix에 붙게 됩니다.
그 외에도 우리가 작성한 source 블럭을 build블럭에서 extend할 수 있게 도와주는 기능이 있습니다.
/main.pkr.hcl
/**
* Without Name
*/
build {
sources = [
"source.null.one",
"source.null.two",
]
}
/**
* With Name
*/
build {
name = "fastcampus-packer"
sources = [
"source.null.one",
"source.null.two",
]
}
/**
* Fill-in
*/
build {
name = "fastcampus-packer-fill-in"
# sources = [
# "source.null.one",
# "source.null.two",
# ]
source "null.one" {
name = "terraform"
}
source "null.two" {
name = "vault"
}
}
다음과 같이 이름이 null.one, null.two 소스들의 이름을 null.terraform, null.vault로 바꾸어 주었습니다. 또한 여기서 중요한 개념이 source블럭에서 정의한 속성은 build안의 source블럭에서 오버라이딩 하는것은 불가능합니다.
'DevOps > AWS Architecture' 카테고리의 다른 글
[ DevOps ] - (패커를 이용한 머신 이미지 관리) - 데이터 소스 활용 ( Data-source ) (0) | 2022.08.02 |
---|---|
[ DevOps ] - (패커를 이용한 머신 이미지 관리) - 프로비저너 (Provisioner) (0) | 2022.08.02 |
[ DevOps ] - (패커를 이용한 머신 이미지 관리) - 패커 소개 (0) | 2022.08.02 |
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 terraform_remote_state 데이터소스 활용 (0) | 2022.08.02 |
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 모듈 작성 (0) | 2022.08.02 |