당근페이, 6개월 간의 인프라 구축 이야기 (SRE 밋업 2회)
원문 정보
- 원문: 당근페이, 6개월 간의 인프라 구축 이야기 | 당근마켓 SRE 밋업 2회 (29:00)
- 매체 · 게시일: YouTube 당근 채널 · 2021-12-02 (영상 검색 목록에는 영문 제목으로 나오지만 한국어 발표입니다)
- 발표자: 강진우 (Alden, 당근페이 SRE 팀). 영상 설명란과 슬라이드 표지로 확인했습니다.
- 근거: YouTube 자동 자막 전체 + 발표 슬라이드. 슬라이드 PDF는 글자 추출이 깨져서 페이지를 이미지로 보고 확인했습니다.
- 이 문서는 영상을 읽고 재구성한 요약이며 원문 자체가 아닙니다.
주요 구간
- 00:00 팀 소개와 핀테크 인프라의 어려움
- 04:00 로그인 시스템: 멀티 어카운트
- 07:30 서버 접근: Teleport
- 10:00 애플리케이션과 배포 파이프라인
- 19:30 관측 시스템
- 24:30 성능 테스트와 서비스 오픈
구축 배경
이 발표는 당근페이가 클라우드 인프라를 구축하며 한 고민 여섯 가지를 차례로 다룹니다. 발표자가 꼽은 핀테크 인프라의 어려움은 금융 라이선스 문서 작업, 감독 규정 준수, 보안과 업무 효율을 고려한 망 분리, 금융 서비스 운영 경험 부족, IDC가 아닌 클라우드 환경에서의 구축이라는 다섯 가지였습니다.
초기 인프라 팀은 네 명이었고, 이 중 당근마켓 소속 보안 엔지니어 한 명이 라이선스 취득을 도왔습니다. 발표자는 자신들의 선택을 정답으로 제시하기보다 비슷한 고민을 하는 사람에게 참고가 되기를 바란다고 밝혔습니다.
도구 선택과 구성
로그인에는 환경별 계정 분리, 로그인 창구 최소화, 계정 탈취 시 노출 정보 제한이라는 조건이 있었습니다. 팀은 멀티 어카운트를 선택해 security 계정에는 IAM 사용자만 두고 다른 리소스는 두지 않았습니다. 개발용 계정과 서비스용 계정에는 IAM 사용자가 없어, 루트 사용자로 들어가거나 security 계정에서 역할 전환(switch role)을 해야 합니다.
서버 접근 도구는 Session Manager, SSH, Teleport 세 가지를 비교했습니다. Teleport는 프록시와 인증 서버가 필요하고 노드마다 설치해야 해 구성이 복잡했습니다. 그래도 오픈소스 버전에서 역할 기반 접근, SSO 연동, 세션 레코딩까지 지원하고, 누가 접속해 무엇을 했는지 화면으로 재생할 수 있다는 점이 컸다고 합니다.
애플리케이션 실행 환경을 EC2에서 Kubernetes로 정하는 일이 가장 어려웠다고 합니다. 경험이 많은 EC2를 쓰고 싶었지만, 팀에 Kubernetes에 능숙한 엔지니어가 있고 당근마켓도 이미 Kubernetes로 운영하고 있다는 점을 근거로 선택했습니다. 클러스터는 직접 구축하는 대신 EKS를 써서 운영 부담을 줄였습니다.
배포에는 GitHub Actions, Argo CD, Argo Workflows를 사용했습니다. 컴플라이언스 문제로 github.com을 쓸 수 없어 GitHub Enterprise Server를 직접 구축했고, 장애 대비는 프라이머리와 레플리카 구성까지만 했습니다. 사람이 PR을 리뷰하고 병합하면 셀프 호스트 Actions 러너가 빌드하고, Jib 라이브러리로 컨테이너 이미지를 만들어 ECR에 올립니다. 이어 매니페스트 저장소의 이미지 태그를 바꾸면 Argo CD가 감지해 적용하고 슬랙으로 완료 알림을 보냅니다.
관측 도구도 컴플라이언스 때문에 고를 폭이 좁았습니다. SaaS를 쓰고 싶었지만 데이터를 외부로 내보내기 어려워 직접 구축했습니다. 로그는 Filebeat와 Logstash를 거쳐 Elasticsearch로 보내고, 메트릭은 Prometheus Operator와 Grafana로 보며, 트레이스는 APM 서버로 보냅니다. 서비스 헬스는 Elastic Uptime으로 확인합니다. AWS 리소스 알림은 CloudWatch 알람에서 SNS와 AWS Chatbot을 거쳐 슬랙으로 전달해, 별도 Lambda 없이 메트릭 이미지까지 받습니다.
성능 테스트는 최대 성능을 막연히 재지 않도록 목표부터 정했습니다. klocust로 측정한 기준은 “10분 동안 99 percentile 응답 시간이 100ms 이내일 때의 최대 TPS"였습니다.
성능 테스트와 서비스 오픈
테스트에서 462 TPS를 넘으면 p99가 100ms를 초과해, 애플리케이션의 안정 구간을 400 TPS까지로 잡았습니다. 같은 테스트에서 close_wait 소켓이 쌓이는 현상을 발견해 Undertow를 Netty로 바꿨고, 파드 메모리 크기도 2GB로 정했습니다.
서비스는 2021년 11월 1일 17시에 제주도 지역에 먼저 열었습니다. 발표에서는 이날부터 트래픽이 올라가는 그래프를 보여 줍니다.
참고할 때의 전제
당근페이 팀은 전원이 이미 써 본 Elastic Stack, Prometheus, Argo, Actions 등을 기준으로 구성을 골랐습니다. 발표자도 이 구성이 정답은 아니라고 밝혔습니다. 발표 당시에는 전국 서비스 오픈과 인프라 자동화가 남아 있었고, 영상 끝에는 보안·컴플라이언스, 서버, 프런트엔드 채용 안내가 있습니다.
이 영상이 설명하는 범위는 2021년 말까지여서 이후 구성 변화는 확인할 수 없습니다. 이후 당근페이의 네트워크 재설계는 나가는 길을 다시 그리다에서 다룹니다.
근거와 세부 수치
| 항목 | 내용 | 근거 |
|---|---|---|
| 팀 구성 | SRE 엔지니어 2명, 보안 엔지니어 1명, 당근마켓 보안 엔지니어 1명(초반 4명) | 슬라이드, 자막 기준 |
| 고민 여섯 가지 | 로그인, 서버 접근, 애플리케이션 구성, 배포 파이프라인, 관측 시스템, 성능 테스트 | 슬라이드 |
| GitHub Enterprise Server | m5.4xlarge급 한 대에서 운영했으며, 6개월간 문제가 없었다고 설명 | 자막 기준 |
| 성능 기준 | 10분 동안 부하를 주며 p99 100ms 이내를 유지하는 최대 TPS | 슬라이드 |
| TPS 기준 | 462 TPS 초과 시 p99 100ms 초과, 400 TPS까지 안정 운영 | 슬라이드 |
| 메모리 크기 | 애플리케이션별 파드 메모리 2GB | 슬라이드 |
| 서비스 오픈 | 2021-11-01 17:00 제주도 지역 선오픈 | 슬라이드 |
| 구성 요약 | 멀티 어카운트, Teleport, EKS, GitHub Actions + Jib + Argo CD + Argo Workflows, Elastic Stack + Prometheus + Grafana + CloudWatch, klocust | 슬라이드 |
자막에서는 오픈 시점을 “어제"라고 하지만, 슬라이드의 2021-11-01과 영상 게시일 2021-12-02가 맞지 않아 슬라이드 날짜만 사용했습니다. 자막에서 Filebeat와 Logstash 사이의 중간 단계를 언급하는 듯하지만, 인식이 깨져 있어 요약에 넣지 않았습니다.