본문 바로가기
Cloud

[IaC] 코드형 인프라, Infrastructure as Code 란 무엇인가?

by 너드나무 2024. 9. 25.
728x90

Infrastructure as Code, IaC

IaC는 서버 및 네트워크와 같은 인프라를 물리적으로 설정하지 않고, 코드로 작성하여 자동으로 생성, 관리, 설정하는 방식이다.
  • 일관성: 동일한 코드로 여러 환경에서 같은 인프라를 배포할 수 있어 환경 간 차이로 인한 문제를 줄일 수 있다.
  • 재현 가능성: 언제든지 동일한 상태의 인프라를 반복적으로 생성할 수 있다.
  • 자동화: 인프라 배포 및 관리 작업이 코드에 의해 자동으로 이루어지므로, 수작업에서 발생할 수 있는 오류를 방지한다.
  • 유연성: 코드로 인프라를 관리하기 때문에, 필요에 따라 자원을 빠르게 확장하거나 축소할 수 있다.

Terraform과 Ansible의 역할

IaC의 구현에는 다양한 도구가 사용되며, 그 중에서도 Terraform과 Ansible은 각각 인프라 프로비저닝과 서버 구성 자동화에 탁월한 도구다.

  • Terraform
    • 클라우드 인프라 리소스(AWS, Azure, GCP 등)를 코드로 정의하고 관리할 수 있는 도구다.
    • 인프라를 선언형으로 관리하며, 상태 파일을 통해 현재 인프라 상태를 추적한다.
    • Terraform은 AWS와 같은 클라우드에서 인프라 자원을 자동으로 생성하고 관리한다.
  • Ansible
    • 서버의 소프트웨어 설치, 구성 파일 수정, 서비스 관리 등을 자동화하는 도구이다.
    • SSH를 통해 서버에 접속해 작업을 수행한다. 절차적이면서도 선언형 접근 방식을 지원한다.
    • Ansible은 서버 설정 및 애플리케이션 배포를 자동화한다.

이 두 도구를 함께 사용하면, Terraform은 인프라 자원을 배포하고 Ansible은 서버 내부의 애플리케이션과 환경을 설정하는 강력한 자동화 파이프라인을 구축할 수 있다.


시나리오: 웹 애플리케이션 배포 자동화

목표: AWS 클라우드에 웹 애플리케이션을 배포하는 시스템을 Terraform과 Ansible을 사용해 자동화한다.

  1. Terraform으로 AWS에서 EC2 인스턴스, VPC, 보안 그룹을 생성한다.
  2. Ansible로 생성된 EC2 인스턴스에 NGINX 웹 서버를 설치하고 웹 애플리케이션을 배포한다.

Terraform을 사용한 AWS 인프라 구성

  • Terraform을 통해 AWS에서 EC2 인스턴스와 네트워크, 보안 설정을 자동으로 생성할 수 있다.
    • VPC는 가상 네트워크를 분리하고 보안을 강화하기 위한 네트워크 자원이다.
    • 보안 그룹은 EC2 인스턴스의 네트워크 트래픽을 제어하는 역할을 한다.
    • EC2 인스턴스는 NGINX 웹 서버를 실행할 가상 머신이다.이는 클라우드 인프라를 코드로 관리하는 대표적인 IaC 방식이다.
  • Terraform 구성 파일
# provider.tf
# AWS 제공자(Provider)를 설정합니다. Terraform이 AWS 리소스에 접근할 수 있도록 리전(지역)을 설정합니다.
provider "aws" {
  region = "us-west-2" # AWS 리전: 미국 서부 (Oregon)
}

# vpc.tf
# AWS VPC(Virtual Private Cloud)를 생성합니다. 이는 네트워크를 분리하고 보안을 강화하는 가상 네트워크 환경입니다.
resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"  # VPC의 IP 범위 설정
  tags = {
    Name = "main-vpc"  # 태그로 리소스 이름을 지정
  }
}

# security-group.tf
# EC2 인스턴스에 대한 보안 그룹을 생성합니다. 이 보안 그룹은 인바운드 및 아웃바운드 트래픽을 제어합니다.
resource "aws_security_group" "web_sg" {
  vpc_id = aws_vpc.main.id  # 위에서 생성한 VPC에 보안 그룹을 할당

  # HTTP(80)와 SSH(22) 포트에 대해 외부로부터의 접근을 허용하는 규칙을 추가합니다.
  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]  # 모든 IP로부터 허용
  }

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]  # 모든 IP로부터 SSH 접속 허용
  }

  # 모든 아웃바운드 트래픽을 허용
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Name = "web-server-sg"  # 보안 그룹 이름 지정
  }
}

# ec2.tf
# AWS EC2 인스턴스를 생성합니다. 이는 웹 서버를 실행할 가상 머신입니다.
resource "aws_instance" "web" {
  ami             = "ami-0c55b159cbfafe1f0"  # Amazon Linux 2 AMI ID (Amazon 제공의 기본 운영체제)
  instance_type   = "t2.micro"  # 인스턴스 유형 설정: 소형 EC2 인스턴스
  key_name        = var.key_name  # SSH를 위한 키 페어 이름 (변수로 설정됨)
  security_groups = [aws_security_group.web_sg.name]  # 위에서 생성한 보안 그룹을 사용

  tags = {
    Name = "web-server"  # EC2 인스턴스에 대한 태그 지정
  }

  # EC2 인스턴스의 공인 IP를 로컬에 저장하기 위한 명령
  provisioner "local-exec" {
    command = "echo ${self.public_ip} > ip_address.txt"
  }
}

# output.tf
# 생성된 EC2 인스턴스의 공인 IP를 출력합니다.
output "ec2_public_ip" {
  value = aws_instance.web.public_ip
  description = "Public IP of the EC2 instance"
}

 

  • Terraform 명령어 실행
    • terraform init: Terraform 디렉토리를 초기화하고 필요한 플러그인을 다운로드합니다.
    • terraform plan: 어떤 리소스가 생성될지 계획을 미리 확인합니다.
    • terraform apply: 계획된 인프라를 실제로 AWS에 생성합니다.
$ terraform init
$ terraform plan
$ terraform apply
  • 결과: 이 명령을 통해 AWS에 EC2 인스턴스가 생성되고, 해당 인스턴스의 공인 IP가 출력됩니다.

2. Ansible을 이용한 서버 설정 및 애플리케이션 배포

    • Terraform으로 EC2 인스턴스를 생성한 후, Ansible을 사용해 서버에 NGINX 웹 서버를 설치하고 간단한 웹 애플리케이션을 배포한다.
    • Ansible Playbook
      • Ansible을 사용하여 EC2 인스턴스에 웹 서버(NGINX)를 설치하고 애플리케이션을 배포하는 과정을 자동화한다.
# playbook.yml

- hosts: webservers
  become: yes  # root 권한으로 실행
  tasks:
    - name: Update the system packages
      apt:
        update_cache: yes  # 시스템 패키지 업데이트

    - name: Install NGINX
      apt:
        name: nginx
        state: present  # NGINX 설치

    - name: Start and enable NGINX
      service:
        name: nginx
        state: started
        enabled: true  # NGINX 서비스 시작 및 부팅 시 자동 실행 설정

    - name: Copy the index.html file
      copy:
        src: ./index.html  # 로컬에서 제공할 웹 파일
        dest: /var/www/html/index.html  # 서버의 웹 루트 경로에 복사
        mode: '0644'  # 파일 권한 설정

    - name: Open port 80 for HTTP traffic
      ufw:
        rule: allow
        port: 80
        proto: tcp  # 80번 포트 열기 (HTTP 트래픽 허용)
  • Ansible 인벤토리 파일
    • Terraform으로 생성된 EC2 인스턴스의 IP를 Ansible 인벤토리에 추가하여 해당 인스턴스에 Ansible을 적용할 수 있습니다.
# inventory.ini

[webservers]
web ansible_host=<EC2_PUBLIC_IP> ansible_user=ubuntu ansible_ssh_private_key_file=~/.ssh/your_key.pem
  • Ansible 명령어 실행
    • ansible-playbook -i inventory.ini playbook.yml: NGINX를 설치하고, 웹 애플리케이션을 EC2 인스턴스에 배포합니다.
$ ansible-playbook -i inventory.ini playbook.yml
728x90
반응형