Step Functios으로 구현한 실시간 웹훅 처리 시스템

Today I Learned 날짜 2025년 7월 28일 일요일 내용 건강하고 빠른 웹훅을 향한 여정 입사 76주차부터 WIL을 남기지 못했다. 웹훅 이슈로 인한 실시간 데이터 처리 지연과 누락이 지속적으로 발생하고 있었기 떄문이다. WIL을 읽는 사람 입장에서 “애는 배웠다고 하는데, 웹훅 계속 박살나고 있구만 뭘 배운겨” 라는 생각이 들까봐 그랬다. 사실 이걸 쓰고 있는 지금도 마음 한구석에 괜히 사망 플래그를 세우는 건 아닌지 걱정이 되지만, 더 미루면 영영 회고를 하지 못할까봐 지금이라도 이 여정을 정리하는 글을 쓰려고 한다. 제 부족한 실력으로 괜한 피해를 입은 분들(사실상 샐러드랩 모두)께 죄송스러운 마음을 가지며 글을 시작하고자 한다. ...

2025년 7월 28일 · 11 분 · 배준수

EC2 내 파일 소유권 변경하기

Today I Learned 날짜 2024년 7월 31일 수요일 내용 실서버 운영을 위한 EC2 구축하기 실서버 배포를 위한 환경을 구축했다. VPC를 만들고, ECR, ECS 클러스터 이것 저것 다 만들고 CI CD도 구축했다. 이제 나름 몇번 해봤다고 할 줄 알게 됨.. 물론 실서버에서 이슈처리를 위해 X-Ray를 구축할 예정인데, 이 부분은 아직 건드리지 못헀다는 게 첫번쨰 문제고 두번째는 서비스를 운영할 기반을 만드는 거였다. 실서버에서 마이그레이션을 하거나, 커맨드를 돌리기 위해 사용할 EC2를 만들어주려고 한다. 기존 글로벌 프로덕트 리뷰가 그렇게 되있다. ECS에서 돌아가는 컨테이너가 실서버는 항상 2개길래 “아 하나가 사용하는 서버고, 나머지 하나가 EC2를 위한 거구나” 라고 생각했다. ECS는 도커 이미지로 서버를 돌리는데 사용량에 따라 자동으로 스케일이 조정되는 Fargate 방식과, 생성해둔 EC2 인스턴스에서 구동하는 방식이 있기 떄문에 그런줄 알았다. 설정을 들어가보니 전혀 아니었지만… ...

2024년 7월 31일 · 2 분 · 배준수

개발자답게 단순노동하기

Today I Learned 날짜 2024년 7월 30일 화요일 내용 사소한 듯 한 에러처리 어제 나는 분명 기능을 완성하고 갔다. 분명. 그런데 오늘 2차 QA를 시작하자마자 안 만들어진다. 하… 헛고생 했다는 생각에 1차 분노, QA 하는 분들의 시간을 낭비했다는 생각에 2차 분노했다. 화를 삭히고 열심히 원인을 찾았다. 네이버 API 호출 제한 네이버 검색광고에서 데이터를 불러올 때, 호출 횟수의 제한이 있다. 초당 2030회가 넘어가면 429 코드가 반환되면서 “Too many requests” 라는 메시지를 뱉는다. 담당자의 답변에 의하면 1초 후 다시 시도하란다. 데이터를 불러올 떄, 이런 일이 발생하면 1초 후 로직을 다시 시작하도록은 구현해 놨다. 우선 테스트를 위해 요청 횟수를 적게 해놔서 발생할 일은 없을 거라고 예상했는데.. 오늘 QA 과정에서 문제가 됐다. 여러 명이 동시에 진행하는 QA에서 모두가 같은 네이버 계정을 사용했기 떄문이다. 100일치만 불러오느라 괜찮을 줄 알았는데 동시에 23 명이 요청을 보내니 에러가 떴고 내가 짠 코드가 제대로 작동 안하는게 확인됐다. 400일치가 제대로 돌아가는지 꼭 재차 확인해야겄다. ...

2024년 7월 30일 · 2 분 · 배준수

잡다한 오류 뜯어 고치기

Today I Learned 날짜 2024년 7월 29일 월요일 내용 오류 뜯어고치기 QA를 계속 진행중. 자잘한 오류를 뜯어 고치는 중이다. 데이터베이스상으론 등록된 스프레드시트가 존재하지만, 실제로 구글 드라이브에는 존재하지 않을 떄에 대한 처리가 없었다. 스프레드시트는 존재하지만 이름이 바뀌었을 경우, 정해진 로우데이터 이름대로 변경하는 코드가 없었다. 템플릿 데이터가 int로 들어오는데, 올바른 스키마 형태로 처리하지 못했다. 로직이 실패했을 때 올바른(?) 이유가 저장되거나 실패처리가 되지 않았다. 등등… 뭔가 큰 틀에서는 이상이 없는데 온갖 자잘한 곳에서 자꾸 삐그덕거린다.. 뒤늦게 이 코드 저 코드 추가하니 모양새가 영 보기 좋지 않다. ...

2024년 7월 29일 · 1 분 · 배준수

쿼리문에서 또는 사용법

Today I Learned 날짜 2024년 7월 26일 금요일 내용 또 이슈.. 또 이슈가 터졌다. 우리 프로덕트 리뷰 기능에는 구글 검색에 나타나는 제품 스니펫을 추가해주는 기능이 있다. 제대로 들어갔는지는 링크에서 확인해보면 되는데, aggregateRating과 리뷰가 없다고 결과가 나온다. 스니펫이 없다거나, 스니펫에 들어갈 데이터가 상품 메타필드에 없거나 하는 문제가 있을까 싶어 열심히 찾아봤는데 다 있다. 그럼 도대체 어디가 문제인가… 비정상을 찾는 최고의 방법은 정상과 비교해보는 법. 우리 서비스를 이용하는 다른 샵들의 대시보드로 들어가서 구글 스니펫을 사용하는 샵들도 테스트를 돌려봤다. 근데 다 똑같은 오류가 뜬다..? 그럼 둘 중 하나다. 저게 뜨는게 정상적인 상태였거나, 애초에 기능 자체가 고장나버린 상태거나.. 월요일에 도움을 받아 다시 봐야 겠다. 혹시나해서 구글에 검색해봤는데 역시나 리뷰 갯수나 평점 등의 스니펫은 안뜨긴 한다. 아마 고장났나보다… ...

2024년 7월 26일 · 2 분 · 배준수

AWS 람다함수의 재요청 방지

Today I Learned 날짜 2024년 7월 25일 목요일 내용 람다의 재요청 방지 데이터 임포트를 요청하면 boto3로 AWS Lambda를 호출하도록 구현했다. 맨 처음에는 RequestResponse로 보냈었다. 그런데 디버깅 과정에서 요청이 실패할때마다 1분 간격으로 재시도가 발생해서, 데이터가 꼬이고 쓸데없는 로그가 많이 남아 힘들었다. 그래서 비동기 호출인 Event로 바꾸었다. 근데 비동기 함수라 로직이 원하는대로 실행되지 않았다.. 알아보니 RequestResponse 호출을 했을 때 요청이 실패하면 AWS에서 자동으로 3회 정도 재시도를 한다고 한다. Lambda 클라이언트를 설정할 때 config를 설정해서 이를 방지 할 수 있었다. ...

2024년 7월 25일 · 1 분 · 배준수

리뷰 요청 메일 조회 기능

Today I Learned 날짜 2024년 7월 24일 수요일 내용 리뷰 요청 메일 리뷰를 요청하는 메일은 중요한 기능이기 떄문에 매일매일 확인하고 있다. 발송 자체는 올바르게 되나 한가지 문제점을 발견했다. 발송 여부에 관한 데이터를 메시징 로그라 하는데, 이 데이터가 조회가 안된다. 메뉴에서 collect 메뉴에 들어가면 유저는 메시징 로그가 생성된 메일들 목록을 볼 수 있다. 특정 날짜에 발송되었거나, 취소되었거나, 발송할 예정인 메일들과 그 메일의 기점이 된 주문 데이터를 볼 수 있다. 주문데이터를 볼떄는 필터링을 추가할 수 있는데 주문시점, 배송완료 시점, 요청 메일 발송 시점 3가지다. ...

2024년 7월 24일 · 2 분 · 배준수

서버에서 사용하기 위한 데이터 테이블

Today I Learned 날짜 2024년 7월 23일 화요일 내용 자주 추가될 템플릿. 네트워크 문제를 해결하니 무사히 람다함수가 완성됐다. 그동안 임시로 멀티스레드로 처리하도록 구현해놓은거를 다 바꿔주었다. 그런데 변경사항이 발생했다. 템플릿이 여러 스프레드시트에 나눠져서 만들어질 것이고 자주 추가될 듯하다. 매번 코드를 엎거나 수정하기엔 번거로울 듯하여 새로운 방안을 모색했다. 각 템플릿의 정보를 담은 테이블을 사용하려고 한다. 그동안은 유저에 의해 생성되는 데이터들만을 위해 데이터베이스를 사용했지만, 이번엔 기능에 추가되는 템플릿들을 저장하는 테이블을 생성하려고 한다. 1 2 3 4 5 6 7 8 9 template : { "id" : 데이터베이스 내 고유 id, "number" : 각각에게 부여되는 고유 숫자, "name" : 템플릿 이름(ex. NSA_GTD 항목별 캠페인 유형, "description": 템플릿에 관한 설명, "spreadsheet_id": 템플릿 원본이 존재하는 스프레드시트의 아이디, "sheetfile_id": 템플릿 원본이 존재하는 시트파일의 아이디, "raw_data_foramt_type": 템플릿이 참조하는 로우데이터의 형식 } 쯤으로 만들면 되지 않을까! 앞으로 추가, 삭제, 변경도 쉬워지도록… ...

2024년 7월 23일 · 1 분 · 배준수

AWS VPC Subnet

Today I Learned 날짜 2024년 7월 22일 월요일 내용 Public Subnet VS Private Subnet 지난 주 금요일부터 계속 처리하던 람다 함수를 계속 만졌다. 웬걸? 람다함수는 구글 드라이브에 스프레드 시트를 생성하는 것부터 실패하고 있었다. 아예 요청 자체가 가질 못하고 있었다. 요청의 문제라기보단 통신의 문제였다. 람다함수가 외부 인터넷과 통신을 못하고 있는게 분명했다. AWS Lambda 함수가 VPC 내의 퍼블릭 서브넷에 배치될 때, 자동으로 퍼블릭 IP를 할당받지는 않습니다. Lambda 함수는 ENI(Elastic Network Interface)를 사용하여 VPC 내에서 네트워크 통신을 수행합니다. 이러한 ENI는 퍼블릭 IP를 갖지 않기 때문에 퍼블릭 서브넷에 배치되어도 인터넷에 직접 접근할 수 없습니다. ...

2024년 7월 22일 · 3 분 · 배준수

람다와 중복된 메일 요청(2)

Today I Learned 날짜 2024년 7월 19일 금요일 내용 람다 AWS Lambda란 무엇인가요? ✔ 서버 프로비저닝 또는 관리, 워크로드 인식 클러스터 확장 로직 생성, 이벤트 통합 유지 또는 런타임 관리 없이 코드를 실행합니다. ✔ 사실상 모든 유형의 애플리케이션이나 백엔드 서비스에 대한 코드를 실행합니다. 코드를 ZIP 파일 또는 컨테이너 이미지로 업로드하기만 하면 Lambda는 자동으로 컴퓨팅 실행 능력을 할당하고, 모든 트래픽 규모에 대하여 수신 요청 또는 이벤트를 기반으로 코드를 실행합니다. ✔ Lambda 기능을 선호하는 언어(Node.js, Python, Go, Java 등)로 작성하고 서버리스 및 컨테이너 도구(AWS SAM 또는 Docker CLI)를 사용하여 기능을 구축, 테스트 및 배포합니다. ...

2024년 7월 19일 · 3 분 · 배준수