성장 스택

AWS Console 클릭 대신 PR로 끝내는 루틴 – Terraform (1)

류큐큐 2025. 8. 27. 23:59

예전엔 보안 그룹 하나 열어야 하면 그냥 콘솔 들어가서 바로 수정했다.

  1. AWS 콘솔 로그인
  2. VPC → Security Groups 찾아 들어가기
  3. 목록 중 올바른 SG 찾기
  4. 인바운드 규칙 편집
  5. 규칙 추가 → 저장

작업 자체는 금방 끝난다. 그런데 시간이 지나면서 문제가 드러나기 시작했다.

  • 누가, 언제, 왜 이 규칙을 열었는지 알 수 없음
  • 잘못된 규칙을 넣어도 즉시 티가 안 남
  • 팀 작업으로 가면 변경이 겹침
  • 롤백이 사실상 불가능
  • 변경 전에 검증하거나 리뷰받을 방법 없음

결국 콘솔 클릭으로 만든 인프라는 시간이 지나면 불안감으로 돌아온다.
바로 수정할 수 있는 건 편하지만, 그 모든 “즉흥적인 변경”이 쌓이면 시스템이 언제 터져도 이상하지 않은 상태가 된다.

Before vs After

 
변경 추적 CloudTrail에만 남음 (찾기 어려움) Git에 모든 변경 이력 기록
리뷰/검증 불가능 PR 리뷰 + 자동 검증
롤백 직접 다시 클릭해서 되돌려야 함 git revert 한 번
비용 반영 청구서 보고 알게 됨 Infracost로 PR에서 바로 확인
보안/정책 검사 없음 tfsec, checkov, OPA 자동 실행
문서화 따로 작성해야 함 코드 자체가 문서
협업 “OO 열었어요” 메시지에 의존 변경 이유/컨텍스트가 PR에 정리됨
재사용성 매번 다시 클릭 모듈로 재사용

해결: Infrastructure as Code로 전환

핵심은 단순하다.

인프라를 코드로 관리하면, 결국 ‘일반 개발 코드’와 똑같은 워크플로우를 적용할 수 있다.

보안 그룹 하나 추가하는 일도 예외가 아니다.

 

Before (콘솔):

1. AWS 콘솔 로그인
2. VPC → Security Groups
3. prod-api-server-sg 선택
4. 인바운드 변경
5. HTTPS 규칙 추가
6. 저장

After (Terraform):

resource "aws_security_group_rule" "api_server_https" {
  type              = "ingress"
  from_port         = 443
  to_port           = 443
  protocol          = "tcp"
  cidr_blocks       = ["10.0.0.0/16"]
  security_group_id = aws_security_group.api_server.id

  description = "Allow HTTPS from private subnet for ALB health checks"
}

PR 프로세스:

1. feature/add-api-https-rule 브랜치 생성
2. HCL 코드 작성
3. git commit -m "feat: Add HTTPS rule for ALB health checks"
4. PR 생성 → 자동 검증
   - fmt/validate
   - tfsec/checkov
   - 비용 분석
   - OPA 정책 검사
5. 리뷰 후 merge
6. Atlantis가 자동 apply

 

콘솔에서 하던 모든 작업이 PR 기반으로 구조화된다.

전체 워크플로우

개발자                     GitHub                     AWS
  │                          │                         │
  ├─ 코드 작성               │                           │
  ├─ git push ─────────────> │                         │
  │                          ├─ PR 생성                 │
  │                          ├─ 자동 검증                │
  │                          │   ├─ plan               │
  │                          │   ├─ 보안 스캔            │
  │                          │   ├─ 비용 분석            │
  │                          │   └─ 정책 검증            │
  │ <─────────────────────── PR 코멘트 (결과)             │
  │                          │                         │
  ├─ 리뷰                    │                          │
  ├─ merge ────────────────> │                         │
  │                          └─ terraform apply ─────> │
  │                                         인프라 변경   │
  │ <─────────────────────────── 완료                   │

핵심 이점 요약

1) 변경 이력 추적이 쉬워진다

# 특정 SG 변경한 사람 찾기
git log terraform/network/security-groups.tf

# 변경 내용까지 확인
git log -p -- terraform/network/security-groups.tf

자동 검증이 기본값이 된다

PR이 열리면 자동으로 다음이 실행된다:

  • Terraform fmt/validate
  • tfsec
  • checkov
  • Infracost 비용 분석
  • OPA 정책 검증

잘못된 설정, 과한 권한, 비용 폭증 같은 문제들이 PR 단계에서 바로 차단된다.

3) 팀 협업이 체계적으로 바뀐다

PR 템플릿 하나로 다음이 해결된다:

  • 변경 이유
  • 기술적 배경
  • 테스트 방법
  • 보안 검토
  • 체크리스트

“누가 무엇을 왜 변경했는지”가 기록으로 남는다.

4) 모듈화로 인프라 품질이 올라간다

재사용 가능한 패턴을 모듈로 만들면 실수는 줄고 속도는 빨라진다:

 

module "api_server_sg" {
  source = "../../modules/security-group"

  name   = "api-server"
  vpc_id = module.vpc.vpc_id

  ingress_rules = [
    {
      from_port = 443
      to_port   = 443
      protocol  = "tcp"
      cidr_blocks = ["10.0.0.0/16"]
    }
  ]
}

실제 사례: 서비스 간 통신 허용

콘솔 방식 (지양)

“Payment API 보안 그룹에서 Order API 인바운드 열어주세요.”

→ 규칙은 열렸지만 이유는 기록되지 않는다.
→ 나중에 보면 “이거 왜 열려 있지?” 상태가 된다.

Terraform 방식

resource "aws_security_group_rule" "from_order_api" {
  type                     = "ingress"
  from_port                = 8080
  to_port                  = 8080
  protocol                 = "tcp"
  source_security_group_id = data.aws_security_group.order_api.id
  security_group_id        = aws_security_group.payment_api.id

  description = "Allow Order API to call Payment API for payment processing"
}

PR에는 자연스럽게 컨텍스트가 붙는다

  • Order → Payment 통신 필요
  • 포트 8080 명확 명시
  • Source SG 제한
  • 최소 권한 원칙 준수

자동으로 붙는 Terraform plan + 보안/비용 검증도 PR에서 확인 가능하다.

 

마무리

콘솔 클릭은 빠르고 간단하지만, 결국 “결정적 순간에 아무 기록도 남지 않는 방식” 이라는 걸 깨달았다.
Terraform + PR 루틴을 도입한 뒤로는 인프라 변경이 훨씬 안정적이고 예측 가능한 흐름을 가지게 됐다.

다음 글에서는 이 PR 루틴을 실제로 자동화하고 있는 Atlantis, GitHub App, Infracost, 그리고 AI 요약 흐름까지 이어서 정리해보겠다.