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을 사용해 자동화한다.
- Terraform으로 AWS에서 EC2 인스턴스, VPC, 보안 그룹을 생성한다.
- 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
반응형
'Cloud' 카테고리의 다른 글
[AWS] 퍼블릭 IPv4 주소, EIP란? (0) | 2024.11.14 |
---|---|
[AWS] 클라우드 기반 SMTP 설정, 이메일 서비스 공급자란? (1) | 2024.11.08 |
[AWS] 클라우드 공동 책임 모델 (0) | 2024.11.04 |
[법/규제] 금융분야 망분리 규제 개선 로드맵 - Cloud (2) | 2024.11.04 |
[Infra] 서버 구성도 정리 방법 (1) | 2024.08.08 |
[GCP] Cloud Storage Cache 설정 (0) | 2024.07.29 |
[GCP] IAM 및 관리자, 역할 적용 불가 이슈, Cloud ID (0) | 2024.06.11 |
[Server] 클라우드별 서버 비용 단순 분석 (0) | 2024.05.14 |