Home Terraform으로 AWS ECS 서비스 배포하기 — 시리즈 소개와 전체 그림
Post
Cancel

Terraform으로 AWS ECS 서비스 배포하기 — 시리즈 소개와 전체 그림

Terraform을 제대로 써본 적이 없어서, 실제 MSA 구조를 흉내 낸 테스트 프로젝트를 만들고 AWS ECS(Fargate)에 올려보기로 했다. 코드로 인프라를 만들고, 서비스를 띄우고, 브라우저에서 응답을 확인하고, 다시 전부 지우는 것까지가 목표다. 이 포스트는 그 과정 전체를 요약하고, 시리즈 전체의 인덱스 역할을 한다.


무엇을 만들었나

서비스 6개짜리 가짜 MSA다. 로직은 전혀 없고, 루트(/)로 접근하면 자기 이름만 텍스트로 돌려준다.

서비스포트응답
gateway9000gateway-service
chatting8080chatting-service
session8081session-service
user8082user-service
push8084push-service
push-worker8085push-worker-service

앱이 단순한 이유는 단 하나, Terraform을 테스트하기 위해서다. 앱 로직에 신경 쓰면 인프라 학습이 흐려진다.

그리고 gateway는 Spring Cloud Gateway라서 /user, /chatting 같은 경로를 각 서비스로 전달한다. 결국 브라우저에서 http://<ALB 주소>/user를 치면 user-service가 나오는 구조다.


전체 아키텍처

flowchart LR
    U[브라우저] -->|HTTP :80| ALB[ALB]
    ALB --> GW[gateway :9000]
    GW -->|Service Connect| US[user :8082]
    GW --> CH[chatting :8080]
    GW --> SE[session :8081]
    GW --> PU[push :8084]
    ECR[(ECR)] -.->|이미지 pull| PRV
    PRV -.->|NAT 경유| NAT

    subgraph VPC["VPC"]
        subgraph PUB["퍼블릭 서브넷"]
            ALB
            NAT[NAT Gateway]
        end
        subgraph PRV["프라이빗 서브넷"]
            GW
            US
            CH
            SE
            PU
            WK[push-worker :8085]
        end
    end
  • 외부에 노출되는 건 ALB뿐이다. 서비스는 전부 프라이빗 서브넷에 있다.
  • ALB는 gateway 하나만 바라본다. 나머지 서비스는 gateway가 Service Connect라는 ECS 기능으로 이름(http://user:8082)을 써서 호출한다.
  • 컨테이너 이미지는 ECR에 두고, ECS가 NAT Gateway를 통해 받아온다.

시리즈 구성

  1. 시리즈 소개와 전체 그림 (이 글)
  2. 테스트용 MSA 앱 만들기 — 로직 없이 이름만 돌려주는 6개 서비스
  3. Terraform 코드 구조 설계 — global, envs, modules를 나눈 이유
  4. Terraform 실행 준비 — AWS 로그인, state 버킷, global 적용
  5. 이미지 올리고 서비스 띄우기 — dev 적용과 트러블슈팅

각 글은 실제로 겪은 에러와 해결 과정을 그대로 담았다. 성공 경로만 정리한 글은 이미 많으니, 이 시리즈는 어디서 막히는지에 무게를 뒀다.


사용한 도구와 버전

항목값
Terraform1.10 이상 (S3 state 락에 필요)
AWS Provider~> 6.4 (실제 설치 6.67)
앱Java 25, Spring Boot 4.1, Gradle 9.6
이미지 빌드Jib (Docker 없이 빌드·push)
리전ap-northeast-2 (서울)

결과 미리보기

모든 적용이 끝나고 ALB 주소로 접근하면 이렇게 나온다.

1
2
3
4
5
6
$ curl http://<ALB 주소>/
gateway-service
$ curl http://<ALB 주소>/user
user-service
$ curl http://<ALB 주소>/chatting
chatting-service

Terraform 코드는 총 약 67개의 AWS 리소스(VPC, 서브넷, NAT, ALB, 보안그룹, IAM, ECS 클러스터와 서비스 등)를 만든다.

이 구성은 NAT Gateway와 ALB가 켜져 있는 동안 계속 과금된다. 테스트가 끝나면 반드시 terraform destroy로 지운다. 이 부분은 마지막 글에서 다룬다.

➡️ 다음 글: 테스트용 MSA 앱 만들기 — 로직 없이 이름만 돌려주는 6개 서비스

This post is licensed under CC BY 4.0 by the author.

ai-crew 실사용기 — 조직도에 직원을 추가하고 실제로 일을 시켜봤다

테스트용 MSA 앱 만들기 — 로직 없이 이름만 돌려주는 6개 서비스