IaC(Infrastructure as Code)

Packer Part. 1

cwchoiit 2024. 3. 14. 09:38
728x90
반응형
SMALL
728x90
SMALL

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에서도 확인 가능하다.

 

728x90
반응형
LIST

'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