코드형 인프라(IaC) 설정 가이드
코드형 인프라(Infrastructure as Code, IaC)는 컴퓨팅 리소스를 관리하고 프로비저닝하는 방식을 혁신적으로 변화시켰습니다. 수동 설정 대신 코드를 사용하여 환경을 정의함으로써 일관성, 확장성 및 재현성을 보장할 수 있습니다. 이 가이드에서는 가장 인기 있는 IaC 도구인 Terraform, Ansible, Vagrant, Pulumi에 대한 필수 템플릿을 제공합니다.
1. Terraform 설정 템플릿
Terraform은 클라우드 인프라 프로비저닝의 업계 표준입니다. HCL(HashiCorp Configuration Language)을 사용하여 리소스를 정의합니다.
Terraform main.tf 템플릿
main.tf 파일은 주요 리소스를 정의하는 곳입니다. 일반적인 terraform main.tf template에는 인스턴스, 네트워크 및 스토리지에 대한 리소스 블록이 포함됩니다.
# terraform main.tf 템플릿 예시
resource "aws_instance" "web_server" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
tags = {
Name = "Web-Server-01"
}
}
resource "aws_vpc" "main_vpc" {
cidr_block = "10.0.0.0/16"
}
Terraform Provider 설정 (Provider Config)
terraform provider config 블록은 Terraform이 어떤 클라우드 제공자(AWS, Azure, GCP 등)를 사용할지, 그리고 어떻게 인증할지 지정합니다.
# terraform provider 설정
provider "aws" {
region = "ap-northeast-2"
# 인증은 일반적으로 환경 변수 또는 AWS CLI 프로필을 통해 처리됩니다.
}
provider "google" {
project = "my-project-id"
region = "asia-northeast3"
}
Terraform Backend 설정
terraform backend config는 Terraform이 상태 파일(state file)을 저장할 위치를 결정합니다. 팀 협업을 위해서는 S3나 GCS와 같은 원격 백엔드를 사용하는 것이 중요합니다.
# terraform backend 설정
terraform {
backend "s3" {
bucket = "my-terraform-state-bucket"
key = "prod/terraform.tfstate"
region = "ap-northeast-2"
encrypt = true
dynamodb_table = "terraform-lock"
}
}
2. Ansible 플레이북 및 인벤토리
Terraform이 인프라를 프로비저닝하는 동안, Ansible은 구성 관리 및 애플리케이션 배포에 탁월한 성능을 발휘합니다.
Ansible Playbook 템플릿
ansible playbook template은 호스트 집합에서 실행될 작업을 정의합니다.
---
# ansible playbook 템플릿
- name: 웹 서버 구성
hosts: webservers
become: yes
tasks:
- name: Apache 설치 확인
apt:
name: apache2
state: present
- name: Apache 서비스 시작
service:
name: apache2
state: started
enabled: yes
- name: index.html 복사
copy:
src: files/index.html
dest: /var/www/html/index.html
Ansible Inventory 파일
ansible inventory file은 Ansible이 관리하는 호스트 및 호스트 그룹을 나열합니다.
# ansible inventory 파일 (INI 형식)
[webservers]
192.168.1.10
192.168.1.11
[dbservers]
db.example.com ansible_user=admin
[all:vars]
ansible_python_interpreter=/usr/bin/python3
3. Vagrant 및 Pulumi 설정
로컬 개발 및 현대적인 프로그래밍 방식의 IaC를 위해 Vagrant와 Pulumi는 필수적입니다.
Vagrantfile 템플릿 및 예시
Vagrantfile template은 가상 개발 환경을 정의하고 구성하는 데 사용됩니다.
# Vagrantfile 예시
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/bionic64"
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.provider "virtualbox" do |vb|
vb.memory = "2048"
vb.cpus = 2
end
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y nginx
SHELL
end
Pulumi 설정 (Pulumi Config)
Pulumi config를 사용하면 TypeScript, Python, Go와 같이 익숙한 프로그래밍 언어를 사용하여 인프라를 관리할 수 있습니다.
// Pulumi 설정 예시 (TypeScript)
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
const size = "t2.micro";
const ami = aws.ec2.getAmi({
filters: [{ name: "name", values: ["amzn-ami-hvm-*"] }],
owners: ["137112412989"], // Amazon Linux의 소유자 ID
mostRecent: true,
}).then(ami => ami.id);
const server = new aws.ec2.Instance("web-server", {
instanceType: size,
ami: ami,
});
export const publicIp = server.publicIp;
4. 자주 묻는 질문 (FAQ)
Q: Terraform에서 "provider configuration not found" 오류가 발생하는 이유는 무엇인가요?
A: 일반적으로 새로운 프로바이더를 추가한 후 terraform init을 실행하지 않았거나, .tf 파일에 프로바이더 블록이 누락된 경우에 발생합니다. 특정 버전을 사용하는 경우 required_providers 블록이 있는지 확인하세요.
Q: "ansible unreachable" 오류를 어떻게 해결하나요?
A: ansible inventory file을 확인하여 IP 주소나 호스트 이름이 정확한지 확인하세요. 수동으로 SSH 연결을 테스트하고, SSH 키가 에이전트에 추가되었거나 인벤토리에 지정되었는지 확인하세요.
Q: Terraform과 Pulumi의 차이점은 무엇인가요?
A: Terraform은 도메인 특화 언어인 HCL을 사용하고, Pulumi는 표준 프로그래밍 언어를 사용합니다. Pulumi는 복잡한 로직에 대해 더 많은 유연성을 제공하지만, Terraform은 더 큰 생태계와 커뮤니티를 보유하고 있습니다.
Q: Vagrant는 언제 사용해야 하나요?
A: 운영 환경과 유사한 일관되고 재현 가능한 로컬 개발 환경이 필요한 경우(예: 노트북에서 VM 사용) Vagrant를 사용하세요.
결론
IaC 설정 템플릿을 익히는 것은 현대적이고 탄력적인 인프라를 구축하는 핵심입니다. 프로비저닝을 위한 Terraform, 구성을 위한 Ansible, 또는 코드 기반 클라우드 관리를 위한 Pulumi 중 무엇을 사용하든, 이러한 템플릿은 여러분의 DevOps 여정을 시작하는 데 견고한 토대가 될 것입니다.
JSON 또는 YAML 파일의 형식을 맞추는 데 도움이 필요하신가요? 강력한 개발자 도구 모음인 Tool3M을 방문해 보세요.