본문으로 건너뛰기
실습 랩

실습 랩

코드를 직접 작성하고 실행해보는 핵심 실습 목록입니다. 각 Lab은 독립적으로 수행 가능하지만 순서대로 진행하면 학습 효과가 높습니다.

실습 환경 준비: AWS 계정, Terraform CLI, AWS CLI가 필요합니다. 모든 실습은 AWS 프리 티어 또는 최소 비용으로 진행 가능합니다.

Lab 목록

Lab제목소요 시간단계
QuickLabEC2 웹서버 퀵실습15분입문
Lab 01S3 버킷 첫 번째 실습15분입문
Lab 02VPC + EC2 기본 스택30분기초
Lab 03변수와 Outputs 실습20분기초
Lab 04모듈 만들기45분실무
Lab 05dev/prod 환경 분리30분실무
Lab 06Remote State 설정30분협업
Lab 07기존 리소스 Import30분협업
Lab 08GitHub Actions 파이프라인60분자동화
Lab 09보안 스캔 통합30분보안
Lab 10State 복구 시나리오45분운영
Lab 11모듈 버전 관리와 레지스트리40분실무 심화
Lab 12Policy as Code40분거버넌스
Lab 13멀티 리전 배포45분아키텍처
Lab 14IAM 최소권한과 컴플라이언스 태깅40분보안
Lab 15모니터링 as Code40분운영
Lab 16Terraform 네이티브 테스트40분품질
Lab 17드리프트 탐지 자동화40분운영
Lab 18ECS 컨테이너 서비스 배포45분컨테이너
Lab 19Kubernetes(EKS) 프로비저닝60분컨테이너

실무 JD 기반 역량 매핑

Lab 11~19는 LinkedIn의 실제 Terraform 채용공고(Terraform Infrastructure Engineer, Senior Terraform Engineer, Cloud Terraform Engineer, DevSecOps Specialist, SRE 등 11건)를 분석해, 현업에서 반복적으로 요구되는 역량을 실습으로 옮긴 것입니다. 각 랩의 “이 랩이 입증하는 실무 역량” 섹션에서 원문 JD 인용을 확인할 수 있습니다.

채용공고 요구 역량원문 표현 (JD 인용)대응 Lab
재사용 모듈 설계·거버넌스“build and maintain reusable Terraform modules”Lab 04, Lab 11
모듈 레지스트리 운영“Private Module Registry”Lab 11
정책 기반 배포 통제“Terraform Sentinel”Lab 12
멀티 리전·고가용성 설계“multi-region, or active-active cloud infrastructure patterns”Lab 13
규제 환경 보안 (IAM·태깅)“IAM… in HIPAA-regulated production”Lab 14
모니터링·자가 복구 구성“self-scaling and self-healing configurations”Lab 15
테스트 주도 인프라 개발“Test-Driven Development (TDD)”Lab 16
안전한 운영 자동화“safe, scalable cloud automation”Lab 10, Lab 17
컨테이너 오케스트레이션“VPC, EC2, ECS, EKS, IAM, S3, and SQS”Lab 18, Lab 19
Kubernetes 환경 구성·운영“Configure and manage Kubernetes environments”Lab 19
CI/CD 파이프라인 통합“Integrate Terraform into CI/CD pipelines”Lab 08, Lab 09
State 운영·복구“support production infrastructure changes”Lab 06, Lab 10

Lab 01: 첫 번째 리소스 배포

목표: S3 버킷 하나를 직접 생성하고 삭제하며 Terraform 기본 실행 흐름 체험

학습 내용: terraform init, plan, apply, destroy

# 작업 디렉토리 생성
mkdir lab01-first-resource && cd lab01-first-resource

# main.tf 작성
cat > main.tf << 'EOF'
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_s3_bucket" "my_first_bucket" {
  bucket = "my-terraform-lab01-${random_string.suffix.result}"
}

resource "random_string" "suffix" {
  length  = 8
  special = false
  upper   = false
}

output "bucket_name" {
  value = aws_s3_bucket.my_first_bucket.id
}
EOF

terraform init
terraform plan
terraform apply
terraform destroy

예상 결과: S3 버킷 생성 → 이름 출력 → 삭제 완료


Lab 02: VPC + EC2 기본 스택

목표: 실제 인프라 구성 요소(VPC, Subnet, Security Group, EC2)를 단계별로 배포

학습 내용: 리소스 간 참조, 암시적 의존성, 출력값 활용

# VPC 생성 → Subnet → Security Group → EC2 순서로 작성
# 각 단계에서 terraform plan으로 변경 내용 확인

실습 포인트:

  • aws_vpc.main.id처럼 참조로 의존성 표현
  • 보안 그룹에서 최소 권한 원칙 적용
  • Output으로 EC2 퍼블릭 IP 출력

Lab 03: 변수와 Outputs 실습

목표: 하드코딩된 값을 변수로 교체하고, outputs으로 필요한 정보 노출

학습 내용: variable, output, locals, tfvars 파일

# 1. 하드코딩된 main.tf에서 시작
# 2. 변수 추출: instance_type, environment
# 3. locals로 네이밍 규칙 중앙화
# 4. dev.tfvars, prod.tfvars 분리
terraform plan -var-file=dev.tfvars
terraform plan -var-file=prod.tfvars

Lab 04: 모듈 만들기

목표: 재사용 가능한 네트워크 모듈 작성 및 루트 모듈에서 호출

학습 내용: 모듈 입력/출력 설계, module 블록 사용

디렉토리 구조:
lab04/
├── modules/
│   └── network/
│       ├── main.tf
│       ├── variables.tf
│       └── outputs.tf
└── main.tf  (모듈 호출)

Lab 05: dev/prod 환경 분리

목표: 동일 모듈을 dev와 prod 환경에 다른 설정으로 배포

학습 내용: 디렉토리 기반 환경 분리, tfvars 활용

environments/
├── dev/
│   ├── main.tf
│   └── terraform.tfvars
└── prod/
    ├── main.tf
    └── terraform.tfvars

Lab 06: Remote State 설정

목표: S3 + DynamoDB로 Remote Backend 구성하고 팀 협업 기반 마련

학습 내용: S3 backend 설정, State Locking, State 공유

# backend.tf
terraform {
  backend "s3" {
    bucket         = "your-terraform-state-bucket"
    key            = "lab06/terraform.tfstate"
    region         = "ap-northeast-2"
    dynamodb_table = "terraform-state-lock"
    encrypt        = true
  }
}

실습 포인트: 두 터미널에서 동시 apply 시도 → Lock 동작 확인


Lab 07: 기존 리소스 Import

목표: 콘솔에서 수동 생성한 리소스를 Terraform State에 편입

학습 내용: terraform import, import block (Terraform 1.5+)

# 방법 1: CLI import
terraform import aws_s3_bucket.existing my-existing-bucket-name

# 방법 2: import block (Terraform 1.5+)
import {
  to = aws_s3_bucket.existing
  id = "my-existing-bucket-name"
}

Lab 08: GitHub Actions 파이프라인

목표: PR 생성 시 자동 plan, main 머지 시 자동 apply 파이프라인 구성

학습 내용: GitHub Actions workflow, OIDC 인증, 환경 승인

# .github/workflows/terraform.yml
on:
  pull_request:  # plan
  push:
    branches: [main]  # apply

실습 포인트: PR 코멘트로 plan 결과 자동 게시


Lab 09: 보안 스캔 통합

목표: tfsec와 checkov를 CI/CD 파이프라인에 추가

학습 내용: IaC 정적 분석, 보안 이슈 수정

# 의도적으로 보안 이슈 있는 코드 작성 후
tfsec .
checkov -d .
# 결과를 보고 코드 수정

Lab 10: State 복구 시나리오

목표: 실제 운영에서 발생하는 State 문제 상황을 재현하고 복구

학습 내용: state rm, state mv, terraform import, apply -replace

시나리오 1: 콘솔에서 리소스 수동 삭제 후 state 정리

시나리오 2: 리소스 코드 이름 변경 후 교체 없이 state mv로 처리

시나리오 3: 콘솔 수동 변경(Drift) 감지 및 복구

# Drift 감지
terraform plan -refresh-only

# State에서 리소스 제거
terraform state rm aws_instance.old_name

# 리소스 교체
terraform apply -replace="aws_instance.broken"