← 글 목록

Terraform 기초 실습: AWS EC2 생성 및 자동화

/ 8분 분량

2026년 4월 9일, 클라우드 컴퓨팅 과목의 일환으로 Terraform을 이용해 AWS EC2 인스턴스를 생성하고 웹 서버를 자동 설정하는 실습을 진행했습니다. 이번 실습을 통해 Terraform의 기본 파일 구조, 실행 흐름, 그리고 `user_data`를 활용한 자동화 과정을 깊이 이해할 수 있었습니다.

Terraform 기초 실습: AWS EC2 생성 및 자동화

2026년 4월 9일, 클라우드 컴퓨팅 과목의 일환으로 Terraform을 이용해 AWS EC2 인스턴스를 생성하고 웹 서버를 자동 설정하는 실습을 진행했습니다. 이번 실습을 통해 Terraform의 기본 파일 구조, 실행 흐름, 그리고 user_data를 활용한 자동화 과정을 깊이 이해할 수 있었습니다.

학습 주제

  • 공부 주제: Terraform 기초 및 AWS EC2 인스턴스 자동 설정
  • 대화 제목: 0409클라우드컴퓨팅과목테라폼기초실습기록
  • 학습 날짜: 2026년 4월 9일

질문과 탐구

이번 실습에서 가장 큰 궁금증은 다음과 같았습니다.

  • Terraform의 variables.tf, main.tf, *.tfvars, outputs.tf와 같은 기본 파일들이 서로 어떻게 관계하고 어떤 순서로 실행되는가?
  • user_data는 정확히 무엇이며, EC2 생성 시 어떻게 활용되는가?
  • AWS 아카데미 계정의 제한된 권한으로 인해 발생했던 ec2:DescribeImages 및 ec2:CreateSecurityGroup 오류를 어떻게 우회하여 실습을 완료할 수 있었는가?
  • Terraform apply 명령 실행 시 내부적으로 어떤 과정이 순차적으로 발생하는가?

이 질문들을 바탕으로 Claude AI와 대화를 나누며 Terraform의 작동 방식과 AWS 리소스 관리 방법을 탐구했습니다.

핵심 학습 내용

Terraform 기본 파일 관계 및 실행 흐름

Terraform은 선언형 IaC 도구로, 위에서 아래로 순차 실행되는 스크립트 언어와 달리 "원하는 인프라 상태"를 선언하면 Terraform이 이를 바탕으로 실행 계획을 세우고 적용합니다.

  • variables.tf: 사용할 변수들을 선언합니다. (타입, 설명 등)
  • *.tfvars: variables.tf에 선언된 변수에 실제 값을 주입합니다. 환경별로 dev.tfvars, prod.tfvars 등으로 분리하여 사용합니다.
  • main.tf: 실제 AWS 리소스(EC2, S3 등)를 정의하는 핵심 파일입니다. variables.tf의 변수를 참조하여 사용합니다.
  • outputs.tf: apply 완료 후 콘솔에 출력하거나 다른 모듈에서 참조할 값들을 정의합니다.
  • terraform.tfstate: Terraform이 현재 실제 인프라 상태를 기록하는 파일입니다. plan 실행 시 이 파일과 코드를 비교하여 변경 사항을 계산합니다.

실행 흐름은 init (프로바이더 다운로드), plan (변경 사항 사전 확인), apply (실제 리소스 생성/수정/삭제) 순서로 진행됩니다.

user_data를 활용한 EC2 자동 설정

user_data는 EC2 인스턴스가 최초 부팅될 때 단 한 번 자동으로 실행되는 스크립트입니다. 이를 통해 사람의 개입 없이 서버 환경을 원하는 상태로 구성할 수 있습니다. 이번 실습에서는 user_data를 사용하여 다음과 같은 작업을 자동화했습니다.

user_data = <<-EOF
  #!/bin/bash
  apt-get update
  apt-get install -y apache2        # 아파치 설치
  sed -i -e 's/80/8080/' /etc/apache2/ports.conf  # 80 → 8080 포트 변경
  echo "Hello World" > /var/www/html/index.html   # 인덱스 교체
  systemctl restart apache2         # 재시작
EOF

이 스크립트는 Ubuntu AMI 기준으로 동작하며, 아파치 웹 서버를 설치하고 기본 포트인 80을 8080으로 변경한 뒤, /var/www/html/index.html 파일을 "Hello World"로 교체하고 웹 서버를 재시작합니다.

SG (Security Group)의 Stateful 특성

Security Group은 Stateful한 방화벽입니다. 이는 특정 트래픽을 허용하는 인바운드 규칙이 있으면, 해당 트래픽에 대한 응답 패킷은 별도의 아웃바운드 규칙 없이 자동으로 허용된다는 의미입니다. 이번 실습에서는 8080 포트로의 인바운드 접근을 허용하여 웹 서버에 접속할 수 있도록 설정했습니다.

이해한 내용

아카데미 계정의 제한된 IAM 권한으로 인해 ec2:DescribeImages (AMI 조회) 및 ec2:CreateSecurityGroup (보안 그룹 생성) API 호출에 실패했습니다. 이를 해결하기 위해 다음과 같은 방식으로 우회했습니다.

  • AMI ID 하드코딩: data "aws_ami" "ubuntu" 블록을 제거하고, variables.tf에서 region 값을 us-east-1로 설정한 후, main.tf의 ami 필드에 해당 리전의 Ubuntu AMI ID를 직접 입력했습니다. AMI ID는 리전마다 다르므로 region 값과 일치시키는 것이 중요합니다.
  • Security Group 코드 제거: aws_security_group 리소스 블록을 제거하고, 대신 콘솔에서 기본 보안 그룹에 8080 포트의 인바운드 규칙을 수동으로 추가하여 EC2 인스턴스를 연결했습니다.

이 과정에서 Terraform은 aws_instance가 aws_security_group의 ID를 참조한다는 점을 파악하여, SG 생성을 먼저 시도한 후 EC2 인스턴스를 생성하는 의존성 순서를 자동으로 결정했습니다.

실전 적용

Terraform은 클라우드 환경의 인프라를 코드로 관리하는 IaC(Infrastructure as Code)의 핵심 도구입니다. 이번 실습에서 배운 내용을 바탕으로 다음과 같은 곳에 Terraform을 적용할 수 있습니다.

  • 개발/테스트 환경 구축: 팀원들이 동일한 개발 환경을 쉽고 빠르게 구축할 수 있도록 Terraform 코드를 공유합니다.
  • 프로덕션 환경 배포: 복잡한 AWS 인프라(VPC, EC2, RDS, ALB 등)를 코드로 관리하여 안정적이고 반복 가능한 배포를 수행합니다.
  • 비용 최적화: Terraform 코드를 통해 인프라 구성을 최적화하고, 불필요한 리소스를 자동으로 삭제하여 비용을 절감할 수 있습니다.

실습 계획: 다음에는 terraform.tfstate를 S3와 DynamoDB를 이용해 원격으로 관리하고, 팀원 간의 동시 수정을 방지하는 State Lock 기능을 설정하는 실습을 진행해보고 싶습니다.

추가 학습 계획

  • Terraform 모듈 활용: 반복되는 인프라 구성을 모듈화하여 코드 재사용성을 높이는 방법을 학습하고 싶습니다.
  • Terraform Workspaces: 개발, 스테이징, 프로덕션 등 여러 환경을 같은 코드로 관리하는 workspace 기능을 깊이 이해하고 적용해보고 싶습니다.
  • Terraform Cloud/Enterprise: 팀 협업 및 CI/CD 파이프라인 연동을 위한 Terraform Cloud 또는 Enterprise 버전에 대한 학습을 계획하고 있습니다.

참고 자료