SoftBank Hackathon 2025: 슬랙 한 줄로 끝나는 무중단 배포를 48시간에 만들다
댓글 불러오는 중…
댓글 불러오는 중…
배포라고 하면 보통 긴장감, 딱딱한 로그 화면, 에러가 나지 않기를 비는 모습이 떠오른다.
11월 9일 SoftBank Hackathon 2025에서 우리 팀 Watermelon은 반대로 생각해 봤다. 배포가 스트레스가 아니라 웃는 시간이 될 수는 없을까?
그렇게 나온 프로젝트가 <치이카와, 오늘도 배포 중입니다>다. 귀여운 그림만 띄우는 게 아니라, AWS ECS Fargate와 Lambda로 서비스를 멈추지 않는 Blue/Green 배포를 만들고, 그 전 과정을 슬랙 봇으로 조작하게 했다.
나는 서버리스와 클라우드 인프라를 맡아 Lambda로 배포 흐름을 제어하고, API Gateway를 연결하고, IAM 권한을 구성했다.
콘셉트는 귀엽게 잡았지만, 구조는 장애를 줄이는 쪽을 먼저 봤다. 흐름은 네 단계다.

구축한 CI/CD 파이프라인 아키텍처
48시간 안에 슬랙 명령 한 줄로 Blue/Green 배포가 돌게 하려고 이렇게 엮었다.
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 --> Slack1lambda_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 호출은 뒤에서 처리하게 했다. 시간 초과가 이걸로 사라졌다.
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 브랜치에 없었기 때문이다. 그 뒤로는 이벤트 수신 설정, 토큰 권한, 워크플로 파일 위치를 점검표로 만들어 팀에 돌렸다.
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 배포를 위한 ALB 타겟 그룹 구성
로드밸런서의 규칙으로 트래픽을 기존 버전(Blue)에서 새 버전(Green)으로 옮긴다.
이 과정이 모두 슬랙 대화 안에서 끝나서, 아무도 AWS 콘솔에 들어갈 필요가 없었다. 팀원들이 "이거 진짜 편하다"고 했을 때가 가장 기억에 남는다.

배포 승인 알림

배포 완료 알림
시간에 쫓겨 Terraform 없이 GitHub Actions와 AWS 콘솔을 오가며 자원을 만들었다. 권한과 로드밸런서 설정이 복잡해질수록 코드로 관리했으면 훨씬 편했을 거라는 아쉬움이 남는다. 다음에는 처음부터 인프라를 코드로 남기겠다.
파이프라인은 복잡했지만 결과는 귀여웠다. 배포가 끝날 때마다 뜨는 치이카와 그림을 보고 팀원들이 웃는 걸 보면서, 배포 파이프라인을 만드는 일이 결국 개발하는 사람의 하루를 편하게 만드는 일이라는 걸 다시 느꼈다.

SoftBank Hackathon 2025 수료증

SoftBank Hackathon 2025 참가자들과의 기념 사진
Technical Documentation: Chiikawa Is Still Deploying Today
GitHub Repository: watermelon_bot_test