상황 EC2는 총 세대가 있다. 두 대는 서비스용, 한 대는 서비스 관리용으로 프로메테우스 + 그라파나가 실행중이다. 그런데 이 EC2끼리 보안을 이유로 https로 통신하도록 만들어야 하는 상황이 있었다.문제 AWS에서 인증서 발급을 무료로 해주긴 하지만, 그건 도메인이 존재하는 경우였고, 도메인이 있어서 발급을 받는다해도 AWS에서는 인증서 파일을 제공하지 않을 뿐더러 인증서는 EC2에 바로 연결할 수 없고, 로드밸런서 등을 연결해야 했다. 하지만 더 큰 문제가 있었는데 우선 서버 자체가 https로 실행되어야 하기 때문에 서버 자체에 인증서 파일이 필요했다. 이제 서버 자체에 인증서 파일을 어떻게 만드느냐가 문제였다. Caddy를 사용할까 했지만 이것도 애초에 self-signed 인증서이고, 설정..
원래는 서버1 + 서버2가 붙어 있는 구조로 개발했었다. 그래서 EC2 두 대에 각각 서버 2가 있었던 상황이다. 이 상황에서 서버2만 한대로 따로 다른 EC2로 가게 되었다. 그런데 서버2는 이미 다른 사람들이 사용중이었다. 이 상황에서 어떻게 눈치채지 못하게 서버2를 다른 EC2로 갈아끼웠을까에 대한 이야기이다.서버 소스 분리 우선 서버 소스를 분리하는 작업이 먼저였다. 이 부분은 원래 분리를 고려하고 개발이 되었어서 그다지 어렵진 않았다. 서버1과 서버2의 url도 앞부분도 분리되어 있는 상태였다.새로운 EC2에 서버 세팅 새로운 EC2를 만들고 서버를 세팅했다. DB 연결에 문제가 있었지만 보안그룹 문제였다.ALB로 특정 경로만 다른 서버로 호스팅 설정 로드밸런서로 가서 [리스너 및 규칙]에서 설..
프로젝트에서 suneditor를 사용중인데 이미지 업로드를 구현할 일이 생겼다. 그래서 multer를 이용하여 이미지 업로드를 구현했는데 이 부분은 구글에 찾아봐도 잘 안 나와서 혼자 해결해서 누군가도 헤맬 것 같아 여기에 정리해둔다.MulterModule 설정@Module ({ imports: [ MulterModule. register({ storage: diskStorage({ destination: '/public/uploads', // public 하위의 uploads 폴더에 이미지가 저장됨. filename: (req, file, callback) => { const uniqueSuffix = Da..
오늘 아침에 막 출근해서 이슈를 처리하려는데 서버에 문제가 생겼다. 서버 로그를 살펴보니 DB에 연결되지 못하고 있었고, Unable to connect to the database(lock)이 발생하고 있었다.RDS 상태와 로그를 확인하자 제일 먼저 RDS 상태와 로그를 확인하기 위해 콘솔에 접속했다. RDS 상태는 정상. 에러로그에도 별다른 사항이 없었고, 모니터링 지표를 봐도 문제가 될 부분이 없었다.lock이 실제로 걸려 있는가? 원래 잘 작동되고 있던 서버였고, lock 관련해서는 이미 테스트를 했던터라 갑자기 발생한 게 의아했다. 우선 RDS의 상태가 정상인지 확인했는데 정상이었고, datagrip으로 접속해서 lock이 걸려 있는지 확인했다. 그런데 걸려 있는 락이 없었다.최후의 방법, 재기..
서비스 오픈을 준비하면서 내가 가장 걱정했던 것인 AWS에 서버 구축하기를 마쳐서 그 과정을 정리해본다. 우선 구축하려는 아키텍처는 아래와 같았다.EC2 인스턴스 만들기 EC2 인스턴스를 만드는 과정은 다른 블로그에 잘 나와 있으므로 생략한다. 서버1을 먼저 인스턴스 생성으로 만든 후에 서버1을 이미지화하여 템플릿 생성 후 템플릿으로 인스턴스를 복제하여 서버2를 생성했다. 이때, 서버1을 접속하기 위한 .pem 파일을 함께 사용할 수 있었다. 만약 각 서버마다 다른 .pem 파일로 관리하기를 원한다면 새로 만들어주는 수 밖에 없는 듯하다.RDS로 Master-Slave 만들기RDS로 DB를 하나 만든 후, 그 DB를 선택하고 읽기 전용 복제본 생성을 선택한다. 이렇게 되면 Master로는 CRUD가 전부..
지난번 Lock 관련해서 문제 해결을 고민하면서 Redis를 사용한 방법도 고민하지 않은 것은 아니지만, Redis를 사용한다고 했을 때 구축하는 것도 비용이고 관리포인트가 하나 더 늘어나기 때문에 제외했었는데, 또 다른 문제가 발생했고, Redis를 사용하여 해결하면 참 쉬울 것 같은데 Redis를 정말 사용할지 고민이 된다. 이제 갓 오픈하는 서비스이니 우선 간단하게 시작하자는 마음으로 최대한 Redis를 안 쓰고 해결할 수 있는 방법을 찾는 게 맞는가, 아니면 Redis를 사용하면 간단하게 해결될 문제이니 사용하는 것이 맞는가.
내가 처음 모니터링 시스템에 대한 필요성을 느꼈던 건 2022년 4월쯤이다.(https://dakafakadev.tistory.com/154) 그 이후로 이것저것 모니터링 시스템을 찾아보았고, 듣고 있던 강의 내용 중에 Prometheus + Grafana를 잠시 알려주긴 했지만(https://dakafakadev.tistory.com/240) 실전에 사용은 못하고 있던 터에 이번 서비스 모니터링을 위해 드디어 사용해보게 되었다. 우선 프로메테우스와 그라파나를 내 로컬에서 도커로 띄워서 서버에서 설정한 내용으로 잘 돌아가는지 확인한 후 VM을 생성하여 연동했다. 진짜 너무 이상하다싶을 정도로 간단하게 설치 완료. 설치를 다 하고 팀원들과 팀장님께 이러한 게 있다고 보여드렸는데, 팀장님이 알고는 있었지만 ..
서비스 오픈을 위해 개발에 힘쓰던 중 동시성 문제를 해결해야할 상황이 왔다. 개발중인 서비스는 가계부인데, 거래가 입력되거나 수정되거나 삭제될 때마다 금액에 대한 업데이트를 정확하게 해줘야할 필요가 있었다. 그러나 고려해야 할 사항은 아래 두 가지가 있었다.첫번째, 서버의 스케일 아웃을 고려해야 한다.두번째, 서버 개발에는 최소의 비용이 들어야 한다. 첫번째 사항인 서버의 스케일 아웃을 고려하면 당연히 소스코드 내에서 처리하는 것은 불가능했고, 비관적 락, 낙관적 락, Named Lock, 혹은 분산 시스템을 사용하여 락을 구현하는 방법 등 여러 가지 방법이 있었는데 내가 선택한 방법은 Named Lock이었다. 비관적 락의 경우, 실제로 로우나 테이블 단위로 데이터에 락을 거는 방법인데, 충돌이 빈번하..