고영민mandu05.com

둘러보기

  • 홈
  • 글
  • 프로젝트
  • 지식 그래프
  • 이력서
본문으로 건너뛰기
  1. 고영민
  2. /
  3. 글
고영민/글
© 2023-2026 Youngmin. All rights reserved.
rhdudals0505@naver.comGitHubLinkedIn
이 사이트는 Next.js로 만들었습니다.갱신 2026.09.26
글/프로젝트 · 해커톤 · 대회 · 해커톤 (인프라)

SoftBank Hackathon 2025: 슬랙 한 줄로 끝나는 무중단 배포를 48시간에 만들다

2025-11-14·4분 읽기
DevOpsCI/CDAWSGitHub ActionsHackathon
← 이전 글 LG Aimers 수요 예측 해커톤: 체계적인 실험으로 앙상블 전략 최적화하기 다음 글 →한화에어로스페이스 2025 하반기 R&D SW 채용연계형 인턴 전형 후기

댓글 불러오는 중…

← 글

목차

  • 겉은 귀엽게, 속은 단단하게
  • 슬랙 명령 한 줄이 배포가 되기까지
  • 전체 시퀀스
  • Lambda 비동기 패턴
  • GitHub Actions 워크플로우
  • DynamoDB + CodeDeploy 훅
  • 부딪힌 오류 네 가지
  • 서비스를 멈추지 않는 Blue/Green
  • 무엇을 배웠나
  • 인프라를 코드로 남기지 못했다
  • 배포가 끝날 때 웃는 팀

배포라고 하면 보통 긴장감, 딱딱한 로그 화면, 에러가 나지 않기를 비는 모습이 떠오른다.

11월 9일 SoftBank Hackathon 2025에서 우리 팀 Watermelon은 반대로 생각해 봤다. 배포가 스트레스가 아니라 웃는 시간이 될 수는 없을까?

그렇게 나온 프로젝트가 <치이카와, 오늘도 배포 중입니다>다. 귀여운 그림만 띄우는 게 아니라, AWS ECS Fargate와 Lambda로 서비스를 멈추지 않는 Blue/Green 배포를 만들고, 그 전 과정을 슬랙 봇으로 조작하게 했다.

나는 서버리스와 클라우드 인프라를 맡아 Lambda로 배포 흐름을 제어하고, API Gateway를 연결하고, IAM 권한을 구성했다.

겉은 귀엽게, 속은 단단하게

콘셉트는 귀엽게 잡았지만, 구조는 장애를 줄이는 쪽을 먼저 봤다. 흐름은 네 단계다.

  1. Trigger: 개발자가 Slack 명령어나 Git Push로 배포를 요청한다.
  2. CI (Build): GitHub Actions가 Docker 이미지를 빌드하고 GHCR에 푸시한다.
  3. CD (Deploy): AWS CodeDeploy와 ECS가 Blue/Green 배포를 수행한다.
  4. Interaction: Lambda가 배포 단계별 Hook을 감지하여 Slack으로 치이카와 이미지와 함께 진행 상황을 중계한다.
CI/CD 파이프라인 다이어그램

구축한 CI/CD 파이프라인 아키텍처

슬랙 명령 한 줄이 배포가 되기까지

48시간 안에 슬랙 명령 한 줄로 Blue/Green 배포가 돌게 하려고 이렇게 엮었다.

전체 시퀀스

mermaid
1flowchart LR
2  Slack[/Slash Command/] --> APIGW --> LambdaPrimary
3  LambdaPrimary -->|3초 내 응답| Slack
4  LambdaPrimary -->|Invoke(Event)| LambdaAsync
5  LambdaAsync --> GitHubAPI[(repository_dispatch)]
6  GitHubAPI --> GHActions[GitHub Actions]
7  GHActions --> ECS --> CodeDeploy --> LambdaHooks
8  LambdaHooks --> DynamoDB[(DeploymentStatus)]
9  LambdaHooks --> Slack

Lambda 비동기 패턴

python
1lambda_client.invoke(
2    FunctionName=os.environ["ASYNC_FUNCTION_NAME"],
3    InvocationType="Event",
4    Payload=json.dumps({
5        "async_task": "github_deploy",
6        "command_text": body["text"],
7        "response_url": response_url,
8    })
9)

슬랙은 3초 안에 답이 없으면 시간 초과로 처리한다. 그래서 첫 Lambda는 명령에 곧바로 답하고, 자기 자신을 비동기로 한 번 더 불러 GitHub 호출은 뒤에서 처리하게 했다. 시간 초과가 이걸로 사라졌다.

GitHub Actions 워크플로우

yaml
1name: Backend Deploy
2
3on:
4  repository_dispatch:
5    types: [dev_deploy]
6
7jobs:
8  deploy:
9    runs-on: ubuntu-latest
10    steps:
11      - uses: actions/checkout@v4
12      - name: Build Docker
13        run: docker build -t ghcr.io/${{ github.repository }}:${{ github.sha }} .
14      - name: Push to GHCR
15        run: |
16          echo "${{ secrets.GHCR_TOKEN }}" | docker login ghcr.io -u mandu --password-stdin
17          docker push ghcr.io/${{ github.repository }}:${{ github.sha }}
18      - name: Notify Slack
19        if: ${{ secrets.SLACK_BOT_TOKEN != '' }}
20        run: node scripts/notify-slack.js success

한 번은 GitHub가 204로 잘 받았다고 답했는데도 워크플로가 돌지 않았다. 워크플로 파일이 main 브랜치에 없었기 때문이다. 그 뒤로는 이벤트 수신 설정, 토큰 권한, 워크플로 파일 위치를 점검표로 만들어 팀에 돌렸다.

DynamoDB + CodeDeploy 훅

python
1dynamodb.put_item(
2    TableName="DeploymentStatus",
3    Item={
4        "deployment_id": {"S": deployment_id},
5        "hook_execution_id": {"S": hook_execution_id},
6        "status": {"S": "PendingApproval"},
7    },
8)

테스트 트래픽이 열리는 시점에 배포 정보를 저장해 두고, 슬랙에서 승인 버튼을 누르면 그 배포의 정확한 훅 ID로 다음 단계를 진행시켰다.

부딪힌 오류 네 가지

증상원인과 해결
슬랙 시간 초과비동기로 자기 자신을 다시 부르는 구조로 해결
204인데 워크플로 미실행워크플로 파일이 main에 없었음
권한 거부Lambda 역할에 자기 호출 권한 추가
404토큰 권한 부족이거나 저장소 이름 오타

재현이 어려운 오류는 CloudWatch 로그에 요청과 응답을 구분선과 함께 남겨 두고 그대로 다시 돌려 봤다.

배포된 웹사이트

배포된 웹사이트 화면

서비스를 멈추지 않는 Blue/Green

배포 자동화에서 한 걸음 더 나가, 새 버전으로 바꾸는 동안에도 서비스가 멈추지 않게 했다.

AWS ALB 타겟 그룹 다이어그램

Blue/Green 배포를 위한 ALB 타겟 그룹 구성

로드밸런서의 규칙으로 트래픽을 기존 버전(Blue)에서 새 버전(Green)으로 옮긴다.

  1. 새로운 컨테이너(Green)가 뜨면 Test Listener 포트로 상태 검사를 진행한다.
  2. 슬랙으로 테스트 대기 중 알림이 오고, 개발자가 배포된 웹사이트에서 확인 후 승인한다.
  3. 승인이 완료되면 ALB가 프로덕션 트래픽을 Green으로 스위칭하고, Blue 컨테이너를 종료한다.

이 과정이 모두 슬랙 대화 안에서 끝나서, 아무도 AWS 콘솔에 들어갈 필요가 없었다. 팀원들이 "이거 진짜 편하다"고 했을 때가 가장 기억에 남는다.

배포 승인 알림

배포 승인 알림

배포 완료 알림

배포 완료 알림

무엇을 배웠나

인프라를 코드로 남기지 못했다

시간에 쫓겨 Terraform 없이 GitHub Actions와 AWS 콘솔을 오가며 자원을 만들었다. 권한과 로드밸런서 설정이 복잡해질수록 코드로 관리했으면 훨씬 편했을 거라는 아쉬움이 남는다. 다음에는 처음부터 인프라를 코드로 남기겠다.

배포가 끝날 때 웃는 팀

파이프라인은 복잡했지만 결과는 귀여웠다. 배포가 끝날 때마다 뜨는 치이카와 그림을 보고 팀원들이 웃는 걸 보면서, 배포 파이프라인을 만드는 일이 결국 개발하는 사람의 하루를 편하게 만드는 일이라는 걸 다시 느꼈다.

SoftBank Hackathon 2025 수료증

SoftBank Hackathon 2025 수료증

SoftBank Hackathon 2025 그룹 사진

SoftBank Hackathon 2025 참가자들과의 기념 사진

Technical Documentation: Chiikawa Is Still Deploying Today

GitHub Repository: watermelon_bot_test