
Roomeya는 실제 외부 기숙사 학생의 요구사항을 기반으로 만든 대학생들의 기숙사 룸메이트 매칭을 도와주는 서비스입니다. 학생들이 설문을 작성하면, 생활 패턴과 성향을 분석하여 최적의 룸메이트를 매칭해주고 결과를 이메일로 전송합니다.
저는 이 프로젝트에서 인프라 파트를 담당하여 요구사항 분석을 통한 AWS 클라우드 아키텍처 설계와 Terraform을 활용한 IaC(Infrastructure as Code) 구현을 맡았습니다.

사용자 → Cognito 인증 → API Gateway → Lambda → DynamoDB
↓
S3
↓
Step Functions (워크플로우)
↓
SES (이메일)
사용자 → Cognito 인증 → API Gateway → CreateForm Lambda → DynamoDB (Forms)
학생 → API Gateway → SubmitForm Lambda → DynamoDB (FormResponses)
관리자 → Step Functions 시작
↓
matchingProcessor (DynamoDB 조회)
↓
excelProcessor (결과 생성 → S3)
↓
emailSender (SES 이메일 발송)
| 카테고리 | 서비스 | 용도 |
|---|---|---|
| Compute | Lambda | 9개의 서버리스 함수 |
| Orchestration | Step Functions | 매칭 처리 워크플로우 |
| Storage | S3 | 파일 업로드/내보내기 |
| Database | DynamoDB | 폼, 응답, 결과, 학생 데이터 |
| API | API Gateway (HTTP) | REST API 엔드포인트 |
| Auth | Cognito | 사용자 인증 (OAuth 2.0) |
| Messaging | SES | 매칭 결과 이메일 발송 |
| Monitoring | CloudWatch | 로그 관리 |
처음에는 EC2 기반 아키텍처도 고려했지만, 다음 이유로 Serverless를 선택했습니다:
📦 Lambda Functions
├── upload-url # S3 Presigned URL 생성
├── getFormList # 폼 목록 조회
├── CreateForm # 새 폼 생성
├── SubmitForm # 폼 응답 제출
├── identify_student # 학생 식별
├── matchingProcessor # 매칭 알고리즘 실행
├── matchingResult # 매칭 결과 처리
├── excelProcessor # 엑셀 파일 생성
└── emailSender # 이메일 발송
각 Lambda에 필요한 최소 권한만 부여하는 Least Privilege 원칙을 적용했습니다.
# 4개의 테이블, PAY_PER_REQUEST 모드로 비용 최적화
Roomeya-Forms # PK: formId
Roomeya-FormResponses # PK: formId, SK: studentId (복합키)
Roomeya-Results # PK: formId
Roomeya-Students # PK: studentId
매칭 프로세스를 거쳐 이메일 발송까지는 여러 단계를 거쳐야 해서 Step Functions로 오케스트레이션했습니다.
{
"StartAt": "ProcessMatching",
"States": {
"ProcessMatching": { "Next": "ProcessExcel" },
"ProcessExcel": { "Next": "SendEmail" },
"SendEmail": { "End": true }
}
}
장점:
OAuth 2.0 기반 인증을 구현했습니다.
# 지원하는 인증 플로우
- Authorization Code Flow
- Implicit Flow
- User Password Auth
- SRP Auth
콜백 URL 설정:
http://localhost:5173https://dev.d20iv4pldubgty.amplifyapp.comRoomeya-Infrastructure-Terraform/
├── main.tf # Provider 설정
├── vpc.tf # 네트워크
├── lambda.tf # Lambda 함수 + IAM
├── apigateway.tf # API Gateway
├── dynamodb.tf # DynamoDB 테이블
├── cognito.tf # 인증
├── stepfunctions.tf # 워크플로우
├── s3.tf # 스토리지
├── ses.tf # 이메일
├── cloudwatch.tf # 로깅
└── outputs.tf # 출력값
IaC 도입
Serverless 아키텍처
소프트웨어 공학
State 관리
환경 분리
모니터링 강화
CI/CD 파이프라인
terraform plan 결과 PR 코멘트로 자동 게시문제: Lambda 코드와 인프라 코드가 다른 레포에 있어서 배포 경로 관리가 복잡
해결:
# 상대 경로로 배포 파일 참조
filename = "../Roomeya-Lambda-Deployments/upload-url.zip"
source_code_hash = filebase64sha256("../Roomeya-Lambda-Deployments/upload-url.zip")
문제: 프론트엔드에서 API 호출 시 CORS 에러 발생
해결:
cors_configuration {
allow_headers = ["content-type", "authorization", "x-requested-with"]
allow_methods = ["GET", "POST", "OPTIONS", "PATCH", "PUT", "DELETE", "HEAD"]
allow_origins = [
"https://dev.d20iv4pldubgty.amplifyapp.com/",
"http://localhost:5173"
]
}
문제: 이미 콘솔에서 만든 리소스를 Terraform으로 관리하고 싶음
해결:
1. terraform import로 State에 리소스 추가
2. terraform plan으로 현재 설정과 코드 비교
3. 코드를 실제 설정에 맞게 수정
4. drift 없이 terraform apply 가능한 상태로 만듦
이번 프로젝트를 통해 AWS 서버리스 아키텍처와 Terraform IaC에 대해 실전 경험을 쌓을 수 있었습니다. 특히 기존에 콘솔로 만든 리소스를 Terraform으로 마이그레이션하는 과정에서 많은 것을 배웠습니다.
다음 프로젝트에서는 처음부터 Terraform으로 시작하고, CI/CD 파이프라인까지 완성하는 것이 목표입니다! 🚀