Packer
hashicorp에서 제공하는 Packer라는 도구를 사용해보자. 우선 Packer는 멀티 플랫폼 이미지 빌드 도구이다. 예를 들면 AMI, Docker 등 여러 가상 머신위에 올리기 위해 사용되는 머신 이미지를 HCL 문법으로 만들어 낼 수 있다.
간단하게 EBS가 내재된 AMI를 만들어보는 예제를 통해 시작해보자.
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 = "cwchoiit-packer"
instance_type = "t2.micro"
region = "ap-northeast-2"
subnet_id = "subnet-0b23fd05b5919269e"
associate_public_ip_address = true
ssh_interface = "public_ip"
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 = "cwchoiit-packer"
sources = [
"source.amazon-ebs.ubuntu"
]
}
우선 첫 부분인 다음 코드를 보자. Packer를 사용하기 위한 버전 명시와 어떤 플랫폼의 이미지를 만들어 낼 것인가에 대한 Plugin을 작성하는 부분이다.
packer {
required_version = "~> 1.7"
required_plugins {
amazon = {
version = "~> 1.0"
source = "github.com/hashicorp/amazon"
}
}
}
이제 source 부분이다. 이 부분이 이미지를 만들어 내기 위해 필요한 내용이 담긴 부분이다.
source "amazon-ebs" "ubuntu" {
ami_name = "cwchoiit-packer"
instance_type = "t2.micro"
region = "ap-northeast-2"
subnet_id = "subnet-0b23fd05b5919269e"
associate_public_ip_address = true
ssh_interface = "public_ip"
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"
}
Terraform을 공부한 상태다보니 이해가 안가는 부분은 없다. 여기서 subnet_id를 명시한 이유는 나 같은 경우 Default VPC가 없기 때문에 반드시 Subnet을 명시해줘야 한다. 그리고 associate_public_ip_address도 true로 설정하지 않으면 AMI를 만들기 위해 새로 생성되는 EC2의 Public IP가 존재하지 않기 때문에 SSH 접속을 Packer가 할 수 없다. 그래서 'true'로 설정해줘야 한다.
source_ami_filter는 기반이 되는 AMI를 지정하는 부분이다. ubuntu 이미지 가장 최신 버전을 사용하기로 한다.
마지막 부분인 build 부분이다. 이 부분은 빌드의 이름과 어떤 것을 빌드할 것인지에 대한 정보를 기입한다.
build {
name = "cwchoiit-packer"
sources = [
"source.amazon-ebs.ubuntu"
]
}
이렇게 작성한 파일을 가지고 다음 명령어를 입력한다.
packer init .
우선 init 명령어를 통해 필요한 plugin을 내려받아야 한다. 이 명령어가 잘 수행되면 다음 명령어를 입력한다.
packer build .
이제 빌드를 시작한다. 빌드를 시작하면 다음과 같은 화면이 보일것이다.
과정을 보면 알겠지만 일시적으로 SSH에 접속하기 위해 Key pair와 Security group을 생성하는것이 보인다. 이 부분도 명시해서 가져다가 사용하게 할 수 있지만 이 예제에선 Packer가 직접 만들도록 했다. 그리고 인스턴스가 생성된 후 SSH로 인스턴스에 접속한다. 그 이유는 AMI는 인스턴스에서 필요한 모든 패키지나 기본 설정을 다 한 상태에서의 이미지이기 때문에 그런것들이 있다면 해당 인스턴스에서 설치 작업을 수행해야 하기 때문에 SSH에 접속하는 것이다. 그러나 이 예제에는 따로 설치할 것은 없다. 내가 정의하지 않았으니까. 이렇게 인스턴스가 만들어지고 AMI가 만들어지면 일시적으로 만든 Security group, Key pair, Instance가 삭제된다.
그리고 그 결과로 이런 AMI가 만들어진다. AWS Console에서도 확인 가능하다.
'IaC(Infrastructure as Code)' 카테고리의 다른 글
Packer Part. 3 (Provisioner) (0) | 2024.03.14 |
---|---|
Packer Part. 2 (Builder) (0) | 2024.03.14 |
Terraform Provisioner/EC2 Userdata (2) | 2024.03.11 |
terraform_remote_state (0) | 2024.03.10 |
Terraform 나만의 Module 만들어보기 (0) | 2024.03.10 |