Packer를 이용한 Immutable Infrastructure 구축
Immutable Infrastructure란?
Immutable Infrastructure(불변 인프라)는 인프라 구성 요소를 불변의 상태로 관리하는 방식입니다. 기존의 가변(Mutable) 인프라에서는 리소스를 생성한 후 수정, 패치, 업그레이드 등의 변경 작업을 수행하지만, Immutable Infrastructure에서는 변경이 필요할 때마다 새로운 불변 리소스를 생성하고 기존 것을 폐기합니다.
이러한 방식을 통해 일관된 상태를 유지하고 예기치 않은 변경을 방지할 수 있습니다. 또한 변경 사항을 효율적으로 추적하고 롤백할 수 있어 안정성과 재현 가능성이 높아집니다.
Packer 소개
Packer는 HashiCorp에서 제공하는 오픈소스 도구로, 다양한 플랫폼에서 실행되는 이미지를 자동으로 생성할 수 있습니다. Packer를 사용하면 단일 소스 구성으로 Amazon Machine Image(AMI), Docker 이미지, QCOW2 이미지 등 여러 유형의 이미지를 빌드할 수 있습니다.
Packer의 주요 기능은 다음과 같습니다.
- Multi-Provider: AWS, Azure, GCP, Docker, VMware 등 다양한 플랫폼에서 이미지 빌드 가능
- Automated Image Creation: 코드 기반 이미지 빌드 프로세스 자동화
- File Provisioner: 빌드 시 파일을 복사하고 실행 가능한 스크립트를 업로드할 수 있음
- Parallel Build Execution: 여러 이미지를 병렬로 빌드하여 시간 단축 가능
Packer 작동 방식
Packer는 JSON 또는 HCL 형식의 구성 파일을 사용하여 이미지 빌드 프로세스를 정의합니다. 구성 파일에는 빌더(Builder), 프로비저너(Provisioner), 포스트 프로세서(Post-Processor) 등의 구성 요소가 포함됩니다.
- Builders: 이미지를 빌드할 플랫폼(AWS, Docker, VMware 등)을 지정합니다.
- Provisioners: 이미지에 소프트웨어, 구성 파일, 스크립트 등을 설치하고 실행합니다.
- Post-Processors: 빌드된 이미지를 추가로 처리하거나 업로드합니다.
Packer와 Immutable Infrastructure
Packer는 Immutable Infrastructure 구축을 위한 이미지 빌드 도구로 널리 사용됩니다. 이미지 빌드 프로세스를 자동화하고 코드 기반으로 관리할 수 있어 일관성과 재현 가능성이 높아집니다.
Immutable Infrastructure를 구현하기 위해서는 일반적으로 다음과 같은 단계를 거칩니다:
- Packer를 사용하여 애플리케이션, 런타임, 라이브러리, 구성 파일 등을 포함한 이미지를 생성합니다.
- 해당 이미지를 배포하여 새로운 불변 리소스를 생성합니다.
- 새 리소스로 트래픽을 전환합니다.
- 기존 리소스를 폐기합니다.
Packer와 Immutable Infrastructure 사용 예시
1. 컨테이너 기반 애플리케이션 배포
컨테이너 기반 애플리케이션을 Immutable Infrastructure 방식으로 배포할 때 Packer를 활용할 수 있습니다. Packer를 사용하여 애플리케이션 코드와 종속성을 포함한 Docker 이미지를 빌드한 후, 이를 컨테이너 환경에 배포합니다. 새로운 버전의 애플리케이션을 배포할 때마다 새 이미지를 생성하고 기존 컨테이너를 대체합니다.
{
"builders": [
{
"type": "docker",
"image": "python:3.9-slim",
"commit": true
}
],
"provisioners": [
{
"type": "shell",
"inline": [
"pip install -r requirements.txt",
"python -m unittest discover tests/"
]
}
],
"post-processors": [
{
"type": "docker-tag",
"repository": "my-python-app",
"tag": ""
}
]
}
위 예시에서는 Python
애플리케이션을 위한 Docker 이미지를 빌드합니다. provisioners
블록에서 Python 패키지 의존성을 설치하고 단위 테스트를 실행합니다. 빌드된 이미지는 post-processors
에 의해 태그가 지정되어 Docker 레지스트리에 푸시할 수 있습니다.
2. 온프레미스 환경에서의 가상 머신 프로비저닝
Immutable Infrastructure는 클라우드 환경뿐만 아니라 온프레미스 환경에서도 적용할 수 있습니다. Packer를 사용하여 VMware
, VirtualBox
, Hyper-V
등의 플랫폼에서 실행되는 가상 머신 이미지를 빌드할 수 있습니다. 새로운 가상 머신이 필요할 때마다 이미지를 배포하여 일관된 상태를 유지할 수 있습니다.
{
"builders": [
{
"type": "vmware-iso",
"iso_url": "https://example.com/ubuntu-20.04.2-live-server-amd64.iso",
"iso_checksum": "sha256:28cc03dc2cb0910ccab94c9b14a16bb081e1f13bb80924d021b6e979d31be341",
"ssh_username": "packer",
"ssh_password": "packer",
"shutdown_command": "echo 'packer' | sudo -S shutdown -P now"
}
],
"provisioners": [
{
"type": "shell",
"inline": [
"sudo apt-get update",
"sudo apt-get install -y apache2"
]
}
]
}
위 예시는 VMware 가상 머신 이미지를 빌드하는 Packer 구성 파일입니다. Ubuntu 20.04 ISO 파일을 사용하여 기본 이미지를 만든 후, provisioners
블록에서 Apache HTTP 서버를 설치합니다. 이렇게 빌드된 이미지를 온프레미스 VMware 환경에 배포할 수 있습니다.
결론
Packer는 Immutable Infrastructure 구축을 위한 이미지 빌드 도구로 유용합니다. 이미지 빌드 프로세스를 자동화하고 코드 기반으로 관리할 수 있어 일관성과 재현 가능성이 높아집니다. 이를 통해 안정적이고 예측 가능한 인프라를 구축할 수 있으며, 변경 사항을 효율적으로 추적하고 롤백할 수 있습니다.
Packer와 Immutable Infrastructure 접근 방식은 클라우드 네이티브 환경에서 많이 활용되며, 특히 컨테이너와 서버리스 아키텍처에 적합한 방식입니다. 하지만 이미지 빌드 및 배포 프로세스가 추가되므로 운영 복잡성이 증가할 수 있습니다.
댓글남기기