[인턴] 같은 자물쇠를 두 트리거가 공유할 때 — 비대칭 flock으로 푼 동시성
30분마다 오는 sync webhook과 하루 한 번 도는 systemd timer가 같은 run-dbt.sh를 공유한다. 둘이 겹칠 때 누가 양보하느냐를 비대칭으로 둔 이야기. flock 한 줄을 조건부로 바꾸고, 그 조건을 한쪽에만 흘리지 않으려 며칠을 신경 쓴 기록.
30분마다 오는 sync webhook과 하루 한 번 도는 systemd timer가 같은 run-dbt.sh를 공유한다. 둘이 겹칠 때 누가 양보하느냐를 비대칭으로 둔 이야기. flock 한 줄을 조건부로 바꾸고, 그 조건을 한쪽에만 흘리지 않으려 며칠을 신경 쓴 기록.
Dagster나 Airflow 같은 오케스트레이터 없이, Go 단일 바이너리 하나로 Airbyte sync 성공과 dbt 실행을 이어 붙인 이야기. POST 한 방이 dbt까지 가닿는 경로를 따라가며, 그 과정에서 며칠씩 헤맸던 지점들을 정리했다.
abctl로 띄운 진짜 Airbyte 클러스터의 kubectl 출력을 한 줄씩 뜯어보며, Pod·Deployment·Job·Service·ReplicaSet·StatefulSet이 서로 어떻게 연결되는지, 그리고 ‘Deployment와 Job은 같은 층인가’라는 질문의 답을 Rep...
EL을 Airbyte로 옮기고 나니 dbt 모델이 읽던 raw 스키마가 달라져 있었다. Fivetran(소문자)과 Airbyte(camelCase 인용)의 컬럼 규칙, _fivetran_deleted와 _ab_cdc_deleted_at의 차이를 staging 한 겹에서 흡수하며 r...
공인망에 포트를 열지 않고 SSH 터널로만 접근하는 원칙, 짧은 수명의 API 토큰을 자동 재발급하는 함수, Merge refresh로 미달 스트림만 소탕하기, count 게이트로 진짜 적재를 판정하기까지 — 파일럿에서 실측 검증한 운영 절차를 런북으로 묶었다
33 스트림 파일럿 sync에서 만난 무단 스킵·가짜 succeeded·비대 JSON 컬럼 OOM·빈 state 전염. job status를 믿지 않고 destination count로만 판정하게 된 이유와, 대량 sync를 수렴 루프로 운영하게 된 기록
abctl(kind) + 외부 RDS 메타DB + S3 스토리지 구성으로 Airbyte OSS를 EC2에 올리는 과정. Helm 차트 V2 키 규칙, bootloader/temporal/IMDS/리소스 부족까지 실제로 밟은 함정과 그 해결을 순서대로 정리한 기록
무료로 쓰던 Fivetran을 Airbyte OSS(abctl)로 대체하기 위한 사전 테스트. 왜 옮기려 했고, MySQL→Postgres CDC 미러링을 어떻게 재현하려 했는지에 대한 설계 기록
비개발자가 agent로 코드를 만들고 개발자가 검수하는 워크플로우에서, 테스트가 자꾸 빈약해지는 문제를 마주하며 다시 정리한 테스트 작성의 기준
토요일 새벽 알람과 Summary 카드의 빈 값이라는 두 증상을 추적하다가, ECS Fargate cutover 이후 collector가 옛 TG suffix를 그대로 보고 있었음을 발견한 디버깅 기록
여기저기 흩어진 관측 지표를 비개발자도 읽을 수 있는 한 페이지로 모으기 위해, Pulumi로 S3 + Lambda(collector/builder) + EventBridge 구조를 구성한 과정을 정리
오늘 동일 stacktrace로 세 번 반복 crash한 ECS Fargate 태스크의 원인을 추적한 기록. AllExceptionsFilter가 GraphQL subscription 컨텍스트에서 Express req를 만지다가 죽는 패턴과, 빌드 산출물에서 빠진 .html 자산으...
수동 배포하던 ALB+EC2 프론트 서버를 CloudFront+S3 정적 호스팅으로 이전하고 GitHub Actions로 배포를 자동화한 과정, 그리고 Route53 IP-based Routing 카나리가 본사 네트워크에서 실패한 원인(ECS 미전달)을 추적한 기록
프로덕션 Fargate 태스크 하나가 ETIMEDOUT으로 자살한 사건을 ECS API → CloudWatch → 소스코드 순으로 역추적하며 정리한 포스트모템 기록
고정 IP가 필요한 외부 연동 환경에서 Fargate를 Private Subnet + NAT Gateway로 전환하고, 배포 실패 시 자동 롤백을 위한 Circuit Breaker를 세팅한 과정 정리
ECS on EC2에서 다시 Fargate로 방향을 틀고, ALB 가중치 대신 Source IP 기반으로 특정 지역 트래픽만 먼저 ECS로 보내는 이전 전략으로 변경한 배경과 설계 정리
PM2 + Nginx + Docker Compose 기반 백엔드를 ECS on EC2로 옮기면서, ALB 카나리 가중치로 트래픽을 점진적으로 넘기기 위해 세운 5단계 이전 전략 정리
카나리 배포 중 Blue/Green 서버가 공존할 때, 컬럼 추가·삭제·변경·제약 조건별로 Migration을 언제 실행해야 하는지 정리한 기록
EC2 + Docker Compose 구조에서 ECS Fargate로 전환하며 설계한 Blue/Green·카나리 배포 전략과 DB 스키마 변경 충돌 해법
모노레포 공통 빌드 이미지의 COPY ./ ./가 캐시를 무력화하는 구조적 원인을 파악하고, 자립형 Dockerfile과 ECR 외부 캐시로 전환한 과정
NestJS 백엔드를 ECS Fargate에 브랜치별로 자동 배포하는 Preview 환경을 구축하면서 마주친 다섯 가지 문제와 해결 과정
path-filter 기반 조건부 빌드의 치명적 약점을 발견하고, Docker 레이어 캐시를 단일 진실 공급원으로 삼아 파이프라인을 전면 재설계한 과정
GitHub Actions에서 ECR 레지스트리 기반 Docker BuildKit 캐시를 적용해 build-common 빌드 시간을 11분에서 3~4분으로 단축한 과정
모노레포에서 변경된 서비스만 선택적으로 빌드하고 ECR에 푸시하는 CI/CD 파이프라인을 GitHub Actions로 구성한 과정 기록
EC2 + nginx 환경에서 ALB 헬스체크 진단이 부정확한 원인을 분석하고, 이를 해결하기 위해 ECR + ECS로 마이그레이션한 과정 기록
spec.ts 파일 구조부터 Testing Module, Mocking, 실무 테스트 패턴까지 NestJS 백엔드 단위 테스트의 모든 것
.env는 값 주입, environments/*.ts는 검증·변환·캐싱을 담당하는 이유를 실무 관점에서 정리한 글
Datadog의 Metrics, Logs, APM, Dashboard, Monitor를 실제 업무에서 어떻게 활용했는지 정리한 기록
NestJS의 모듈 시스템을 활용해 @Injectable 서비스에 기본 설정을 주입하는 구조로 개선한 기록
운영 에러를 신호 중심으로 분류해 대응 우선순위를 정리한 기록
기존의 naive한 에러 알람 방식의 고도화 진행을 위한 기획
Pulumi의 config 기반 다중 stack yaml 기반 매개변수 관리 및 기존 AWS 리소스 풀링을 설명.
Pulumi의 상태 관리 단위인 Stack의 관리 및 다중 Stack의 기초적인 관리 방식을 설명.
기본 템플릿에 포함되어 있던 SSM·CloudWatch Agent 구성을 분리하고, Pulumi 코드를 기능별 디렉토리로 재구성한 과정을 정리합니다.
AWS CloudWatch 메트릭 수집부터 대시보드 구성, Slack 알람 연동까지 Pulumi IaC로 구현하는 전 과정을 정리합니다.
EC2 인스턴스에 기본으로 제공되는 AWS/EC2 네임스페이스 CloudWatch 메트릭 18개를 카테고리별로 정리합니다.
다양한 로그·메트릭 수집 도구를 비교 정리하고, NestJS 백엔드에서 실제로 활용하기 좋은 조합을 소개합니다.
인턴십 기간동안 진행하게 될 내용의 요약입니다.
DDIA 03~04장의 스터디 내용 입니다.