금요일 저녁 8시였다. 애들 셋 씻기고 이제 좀 앉아볼까 하는데 폰이 울렸다. 슬랙 알람. "DB 연결이 안 됩니다." 운영 서버 로그를 열어보니 익숙하면서도 제일 보기 싫은 그 문구가 찍혀 있었다. SQLSTATE[HY000] [1040] Too many connections.RDS를 몇 년 써봤다는 사람도 이 에러 앞에서는 한 번씩 당황한다. 나도 그랬다. 커넥션이 왜 고갈됐는지, 지금 당장 뭘 해야 서비스가 살아나는지, 그리고 다시는 안 터지게 하려면 뭘 고쳐야 하는지가 머릿속에서 한 번에 정리가 안 되기 때문이다. 이 글은 그날 밤 내가 했던 삽질과, 그 뒤에 정리해둔 대응 순서를 기록한 것이다. 같은 에러로 검색해서 들어온 분이라면 긴급 대응 섹션부터 보셔도 된다.증상: Too many conn..
매달 초가 되면 저는 습관처럼 AWS 청구서를 엽니다. 예전 회사에서 월 청구액이 예상보다 40% 넘게 튀어나온 적이 있었는데, 그때 원인을 추적하면서 알게 된 게 하나 있습니다. AWS 요금은 큰 실수 하나로 터지는 게 아니라, 아무도 안 보는 작은 낭비들이 조용히 쌓여서 터진다는 겁니다.이번 글은 제가 실무에서 실제로 잡아냈던 AWS 비용 낭비 포인트들을 정리한 것입니다. 콘솔에서 바로 확인할 수 있는 것들 위주라, 오늘 점심시간에 하나씩 열어보면서 따라 해볼 수 있는 수준으로 썼습니다.사진: Unsplash의 Growtika0. 시작은 무조건 비용 가시화부터비용 절감 얘기를 하면 다들 인스턴스 줄이는 것부터 떠올리는데, 순서가 틀렸습니다. 뭐가 얼마나 나가는지 모르는 상태에서 줄이는 건 감으로 하는..
RDS Proxy 는 2019년 12월에 발표된 AWS 의 서비스입니다. 관계형 DB의 connection 을 관리해주는 서비스인데, 사실 Java 개발자들은 이게 왜 필요하지 싶겠지만, 서버리스( 예 : Lambda ) 나 php, ruby 같은 언어에서는 이부분이 상당히 머리 아픈 구석이었습니다. 구글링을 해보면 여러가지 사례들이 있습니다. 우리도 해당 사례들과 비교해보며 서버에 스트레스 테스트를 해보았지만, 앞선 업체들과는 다른 양상을 보여 도입에 대한 고민을 엄청 했습니다. 저희 같은 경우는 PHP Laravel을 AWS ECS Fargate 에 올린 상태입니다. 즉 DB pool 관리는 안해주는 대환장 파티이다. 이번에 RDS Proxy를 적용하며 바뀐 DB 메트릭을 공개하려고 한다. 자신이 서..
CodePipeline과 Slack Bot으로 스마트하게 배포하는 구조를 정리한다. 핵심은 배포 직전에 Slack에서 사람이 승인하도록 만드는 것이다.만들고 싶었던 흐름GitHub push 하면 Docker 자동 빌드 및 테스트빌드가 완료되면 배포 직전에 confirm을 Slack Bot으로 받기Slack에서 최종 컨펌을 하면 배포 시작배포가 완료 및 실패가 되면 Slack으로 알림 받기트리거는 GitHub Actions vs CodePipeline빌드 트리거는 GitHub Actions와 CodePipeline으로 하는 방법 2가지가 있다.트리거 종류로는 비용이 바뀌지 않으니 CodePipeline에서 처리하는 것이 관리적 측면에서 좋다고 판단했다. AWS 리소스 접근 권한을 IAM 역할로 처리할 수 ..
ECS Fargate로 컨테이너를 운영하면서 정리한 순서와 개념이다. 서버를 직접 관리하지 않고 컨테이너만 올리면 되는 게 Fargate의 핵심이다.CODE 영역Dockerfile 생성buildspec.yaml 작성AWS 영역 준비 순서클러스터 생성리포지토리(ECR) 생성작업 정의(Task Definition) 생성보안 그룹(SG) 생성Application Load Balancer 생성 (미리 해둬야 편함)Target Group 생성 (로드밸런서 생성할 때 미리 생성, 필수는 아님)서비스 및 작업 생성ALB를 먼저 만들어두라는 게 실무 팁이다. 서비스를 생성하는 화면에서 ALB를 고르게 되는데, 그 자리에서 새로 만들려면 화면을 왔다 갔다 해야 한다.서비스와 작업의 차이서비스는 항상 돌아가는 개념작업(T..
AWS DMS(Database Migration Service)로 DB를 옮기면서 겪은 문제들을 기록해둔다. 마이그레이션이 "완료"로 뜨는데 데이터가 원본과 일치하지 않는 상황이 반복됐다.문제 1. 데이터가 완전히 일치하지 않는다DB 이전 시 deleted_at 같은 몇몇 컬럼들에 이전 시간 값이 박혀 있었다. 스키마에도 원래 없던 default 값이 들어가 있었다.원인: DMS는 스키마를 자동 생성할 때 원본 DDL을 그대로 복제하지 않는다. 타입을 자체 중간 타입으로 변환한 뒤 대상 DB 타입으로 다시 매핑하기 때문에, 이 과정에서 default 값이나 nullable 속성이 달라질 수 있다.해결: 스키마는 dump로 먼저 이전하고, DMS는 데이터만 옮기게 한다.# 1. 스키마만 덤프 (데이터 제외..
