ws-ingestor 모노레포 CircleCI 설정 요약
목적
•
각 앱(ws-chat-ingestor, ws-chat-persistor 등)별 Docker 이미지 빌드
•
빌드된 이미지 AWS ECR에 자동 푸시
•
(EKS 배포는 별도 CD에서 처리)
환경 변수 (CircleCI > Project Settings > Environment Variables)
변수명 | 예시 값 | 설명 |
AWS_ACCESS_KEY_ID | (IAM 사용자 Access Key) | AWS 인증 |
AWS_SECRET_ACCESS_KEY | (IAM 사용자 Secret Key) | AWS 인증 |
AWS_REGION | ap-northeast-2 | ECR/EKS 리전 |
AWS_ECR_REGISTRY | 197565756669.dkr.ecr.ap-northeast-2.amazonaws.com | ECR 레지스트리 |
주요 워크플로우/잡
•
build-and-push
◦
파라미터(app_dir, ecr_repo)로 앱별 재사용
◦
Docker build context는 항상 레포 루트(.)
◦
Dockerfile은 -f 옵션으로 각 앱별 지정
◦
이미지는 $AWS_ECR_REGISTRY/<<ecr_repo>>:$CIRCLE_SHA1로 태깅 후 push
◦
ECR 로그인 후 push
•
workflows
◦
build-and-push-all: 각 앱별 build-and-push job 실행
예시:
▪
chat-ingestor: chat-ingestor/fyc-chat-ingestor
▪
chat-persistor: chat-persistor/fyc-chat-persistor
config.yml 예시
version: 2.1
executors:
node-docker:
docker:
- image: cimg/node:20.12
jobs:
build-and-push:
executor: node-docker
parameters:
app_dir:
type: string
ecr_repo:
type: string
steps:
- checkout
- setup_remote_docker
- run:
name: Install AWS CLI
command: |
sudo apt-get update && sudo apt-get install -y awscli
- run:
name: Build Docker image
command: |
docker build -f << parameters.app_dir >>/Dockerfile -t $AWS_ECR_REGISTRY/<< parameters.ecr_repo >>:$CIRCLE_SHA1 .
- run:
name: Login to ECR
command: |
aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ECR_REGISTRY
- run:
name: Push Docker image
command: |
docker push $AWS_ECR_REGISTRY/<< parameters.ecr_repo >>:$CIRCLE_SHA1
workflows:
version: 2
build-and-push-all:
jobs:
- build-and-push:
name: build-and-push-chat-ingestor
app_dir: apps/ws-chat-ingestor
ecr_repo: chat-ingestor/fyc-chat-ingestor
- build-and-push:
name: build-and-push-chat-persistor
app_dir: apps/ws-chat-persistor
ecr_repo: chat-persistor/fyc-chat-persistor
YAML
복사
동작 순서
1.
커밋/푸시 → CircleCI가 전체 레포 체크아웃
2.
각 앱별 Docker 빌드 및 ECR 푸시
3.
ECR 이미지 → EKS 등에서 pull하여 배포
장점
•
모노레포 구조에 최적화(여러 앱 동시 관리)
•
환경 변수로 유연성 확보(ECR 주소, 리전 등 쉽게 변경)
•
완전 자동화(수동 빌드/배포 불필요)
주의사항
•
환경 변수 미설정 시 인증/빌드 에러 100% 발생
•
Docker build context는 항상 루트로 지정!→ 그렇지 않으면 packages, 공통 모듈 접근 불가
•
ECR 리포지토리/권한/네이밍 불일치 시 이미지 푸시 실패
추가 개선 포인트
•
develop/main 등 브랜치별 빌드/배포 분리
•
테스트/빌드/배포 job 분리 및 조건부 실행
•
EKS 자동 배포(job 추가)
설정 중 문제 & 해결 방법
1. Docker build context 문제
•
현상: COPY ../../packages ./packages 실행 시failed to compute cache key: ... "/packages": not found 에러
•
원인: build context를 앱 디렉토리로 잡으면 상위 디렉토리 접근 불가
•
해결: build context를 반드시 **레포 루트(.)**로 지정(docker build -f apps/ws-chat-ingestor/Dockerfile .)
2. TypeScript 빌드 에러 (존재하지 않는 export)
•
현상:
◦
Cannot find module './types/websocket'
◦
Module '"@ws-ingestor/util"' has no exported member 'parseMessage'
•
원인: 실제 없는 파일/타입/함수 import/export 시도
•
해결: 해당 코드 삭제/주석
3. SQS MessageGroupId 에러
•
현상:
◦
The request must contain the parameter MessageGroupId.
•
원인: SQS FIFO 큐는 MessageGroupId, MessageDeduplicationId 필수
•
해결:
◦
groupId: chat.extras.streamingChannelId
◦
dedupId: ctime+uid → ctime+cid → ctime+type → uuid 순 fallback
◦
값 없으면 에러 로그 후 skip
4. AWS CLI/ECR 인증 에러
•
현상:
◦
Unable to locate credentials...
◦
aws: error: argument --region: expected one argument
◦
Cannot perform an interactive login from a non TTY device
•
원인: 환경 변수 미등록
•
해결: CircleCI Project Settings > Environment Variables에 정확히 등록
5. ECR 레지스트리 주소 관리
•
현상: config.yml에 ECR 주소 하드코딩 → 관리 불편
•
해결: AWS_ECR_REGISTRY 환경 변수 사용, config.yml에 치환
