티스토리 뷰
지난 포스팅: 매뉴얼하게 로컬 개발환경에서 git push -> 서버 환경에서 git pull, deploy 수행
AWS 에 웹 서버 배포하기
[로컬 개발] → [Git push] → [AWS pull] → [Docker 재배포]Local(개발): Mac, AWS(배포): Unbuntu 배포와 개발 환경이 달라서 Docker 배포하기로 한다.순서1. 개발 환경에서 코드 수정 후 git push 한다.2. AWS 서버에
ttoogi.tistory.com
아래 순서로 CI/CD 적용해본다.
- GitLab에 코드 push
- 파이프라인이 자동 실행
- 브랜치에서는 빌드 수행
- main 브랜치 반영 시 AWS 서버 자동 배포
상세 과정
1. GitLab CI 파이프라인 추가
/.gitlab-ci.yml 파일 추가
브랜치 push 시에는 Docker 빌드만 하고
main push 시에는 AWS 배포를 하도록 분리.
GitLab에서는 MR이 merge되면 결국 main 에 push가 발생하므로, 그 시점에 deploy job이 실행된다.
2. AWS 서버 SSH 자동 접속 설정
GitLab CI/CD Variables에
AWS_HOST, AWS_USER, AWS_SSH_KEY, AWS_APP_DIR 변수 추가 (AWS_SSH_KEY는 File type)
CI 컨테이너 안에서 AWS 서버로 SSH 접속하도록 함
로컬 CLI에서 직접 ssh -i key.pem ubuntu@... 하는 걸, CI에서 하도록 수정.
3. 서버에서 실제 배포 수행
CI가 AWS 서버에 들어가면 deploy.sh 를 실행합니다.
<스크립트 동작>
- 원격 저장소에서 main 최신 코드 pull
- Docker 이미지 재빌드
- 기존 컨테이너 중지/삭제
- 새 컨테이너 실행
4. SSH 키/CI 오류 해결
중간에 ssh: not found, error in libcrypto, Permission denied 가능성을 줄이기 위해
CI 컨테이너에 openssh-client 설치
GitLab 변수의 개인키를 ~/.ssh/id_rsa 로 생성
권한 600 설정
ssh-keyscan 으로 known_hosts 등록
IdentitiesOnly=yes 로 특정 키만 사용
- .gitlab-ci.yml
stages:
- build
- deploy
build_image:
stage: build
image: docker:27
services:
- docker:27-dind
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: ""
rules:
- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH != "main"'
script:
- docker build -t bookserver .
deploy_to_aws:
stage: deploy
image: alpine:3.20
rules:
- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "main"'
before_script:
- apk add --no-cache openssh-client bash
- test -n "$AWS_HOST"
- test -n "$AWS_USER"
- test -n "$AWS_SSH_KEY"
- test -n "$AWS_APP_DIR"
- mkdir -p ~/.ssh
- |
if [ -f "$AWS_SSH_KEY" ]; then
awk '{ sub(/\r$/, ""); print }' "$AWS_SSH_KEY" > ~/.ssh/id_rsa
else
printf "%s\n" "$AWS_SSH_KEY" | awk '{ sub(/\r$/, ""); print }' > ~/.ssh/id_rsa
fi
- chmod 600 ~/.ssh/id_rsa
- ssh-keygen -y -f ~/.ssh/id_rsa > /dev/null
- ssh-keyscan -H "$AWS_HOST" >> ~/.ssh/known_hosts
- ssh -V
script:
- ssh -i ~/.ssh/id_rsa -o IdentitiesOnly=yes "$AWS_USER@$AWS_HOST" "cd '$AWS_APP_DIR' && chmod +x deploy.sh && ./deploy.sh"
deploy.sh
#!/bin/bash
set -e
echo "🔄 pulling code..."
git fetch origin main
git checkout main
git pull --ff-only origin main
echo "🐳 building docker..."
docker build -t bookserver .
echo "🛑 stopping old container..."
docker stop bookserver || true
docker rm bookserver || true
echo "🚀 starting new container..."
docker run -d -p 80:8000 --restart always --name bookserver bookserver
echo "✅ deploy complete!"
요약
GitLab CI는 코드를 직접 배포하지 않고, AWS 서버에 SSH로 접속해서 서버 내부 배포 스크립트를 실행한다.
서버는 그 스크립트를 통해 최신 코드를 가져오고 Docker 컨테이너를 재시작한다.
CI는 배포의 트리거와 원격 실행 담당, 실제 서비스 교체는 AWS 서버가 담당한다.
Tools
Codex
'IT > DEV' 카테고리의 다른 글
| AWS 에 웹 서버 배포하기 - 수동 배포 (0) | 2026.03.17 |
|---|---|
| [디자인패턴] 책임연쇄패턴 | Chain of Responsibility (0) | 2023.11.29 |
| [디자인패턴] Repository Pattern 레포지토리 패턴 (0) | 2023.11.06 |
| 정적 다형성, 동적 다형성 (0) | 2023.11.04 |
| //TODO [디자인패턴] 팩토리 패턴 (0) | 2023.10.17 |
- Total
- Today
- Yesterday
- multimodule
- InShot
- 맥북개발환경
- 클라우드 네이티브 애플리케이션 디자인 패턴
- VLLO
- 버전충돌
- Vlogr
- AdobeClip
- 코틀린코루틴의정석
- 수학 #다이나믹프로그래밍 #게임이론
- Kotlin
- gitlab_ssh_permission_denied
- https://kotlinlang.org/docs/object-declarations.html
- android
- 동기메시징기술
- 내채공
- 멀티모듈
- 통신패턴
- androidarchitecture
- 코루틴
- 디자인패턴
- 쇼코의미소
- 이펙티브코틀린
- 레포지토리패턴
- TKD
- 코틀린
- 내채공만기
- 아이폰영상편집어플후기
- 청년내일채움공제
- 프로그래머스
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |

