GitHub Actions로 EC2 자동 배포

Atmosphere·2025년 7월 15일

DevOps

목록 보기
4/6
post-thumbnail

🎯 목표

GitHub에 Push하면 EC2 서버에서 자동으로 git pull + Docker Compose 재시작되는 흐름을 만든다.

🧩 실습

1. EC2에서 SSH 키 발급

aws EC2 인스턴스가 이미 있다는 가정하에 진행한다.
인스턴스로 접속하여 해당 코드를 입력해 SSH 키를 발급한다.

ssh-keygen -t rsa -b 4096

2. 공개키를 GitHub에 등록 (Settings > Deploy Keys)

SSH 키를 발급받으면 공개키와 비밀키를 함께 받을 수 있다.

공개키 확인방법

cat ~/.ssh/id_rsa.pub

여기로 들어가면

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA7... (생략) ...==

요런 긴 문자열이 있다. 이 전체 문자열을 복사하자.

3. GitHub 레포지토리로 이동

  • GitHub에서 너의 프로젝트 레포로 이동
  • Settings > Deploy keys로 이동
  • Add deploy key 클릭
  • Title: EC2 Deploy Key
  • Key: 복사한 공개키 붙여넣기
  • Allow write access 체크 (git pull이니 읽기만 필요하지만, push도 할거면 체크)

4. 추가 완료

이러면 EC2에서 git pull 할 때 비밀번호 없이 SSH 키로 인증할 수 있다.

5. GitHub Actions 워크플로우 만들기

내가 GitHub에 푸시하면 → EC2가 자동으로 코드를 pull하고 → docker-compose를 재시작하게 만든다.
(이 부분이 제일 어려웠고 오래걸렸다..)

  • 로컬 프로젝트에 아래 경로에 디렉토리 만들기:
    .github/workflows/deploy.yml

  • 그리고 deploy.yml에 다음 코드 넣기:

name: Deploy to EC2

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - name: SSH and deploy
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.EC2_HOST }}
        username: ${{ secrets.EC2_USER }}
        key: ${{ secrets.EC2_SSH_KEY }}
        script: |
          cd /path/to/your/project
          git pull origin main
          sudo docker-compose down
          sudo docker-compose up --build -d

/path/to/your/project → EC2에서 내 프로젝트 경로로 바꿔준다.

  • EC2에서 내 프로젝트 경로 확인하는 방법: EC2 접속 -> git clone 해당 레포지토리 -> 클론한 프로젝트로 cd 한후 pwd입력하면 내 프로젝트 경로가 나온다. 실습할 때 나는 cd /home/ubuntu/Devops라고 썼다.

6. GitHub Secrets 설정

위에서 ${{ secrets.XXX }} 부분에 값이 있어야 실행된다.

  • GitHub 레포 Settings > Secrets and variables > Actions
  • New repository secret 클릭

아래 세가지를 등록

EC2_HOST: EC2의 퍼블릭 IP
EC2_USER: ec2-user (Amazon Linux) or ubuntu (Ubuntu)
EC2_SSH_KEY: EC2의 private key (id_rsa의 내용)

참고: EC2의 퍼블릭IP는 인스턴스를 중지하고 실행할때마다 매번 바뀐다.
그래서 탄력적IP를 설정하여 IP를 고정하는 것도 편한 방법 중 하나다.
물론 요금이 나온다 :)..

그리고 이때!! 중요한게 있다.
EC2_SSH_KEY에 EC2의 private key (id_rsa의 내용)을 등록할 때,
id_rsa의 내용은 대략 이렇다.

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA0V2Lt...
(중간 내용 수백 줄)
...QIDAQAB
-----END RSA PRIVATE KEY-----

여기서 저 BEGIN RSA~~랑 END RSA까지 전부 복사해서 붙여넣어야한다. 안에 있는 중간 내용만 맞는 줄 알고 넣어서 deploy했다가 오류났었다 :(

아, 그리고 여기에서 말하지만, 난 배포 후 내가 EC2에 docker-compose를 설치하지 않음을 깨달았다. 여러분은 꼭 미리 EC2에 docker와 docker-compose를 설치하기 바란다^^

간단한 EC2에 docker 설치 방법

  1. docker 설치
sudo apt update
sudo apt install docker.io -y

sudo systemctl start docker
sudo systemctl enable docker
  1. docker-compose 설치, 실행권한 부여
#docker-compose 설치
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

#실행권한 부여
sudo chmod +x /usr/local/bin/docker-compose
  1. 설치확인
docker-compose --version

정상설치되면 Docker Compose version v2.24.6
이렇게 버전이 나와야한다!

이렇게 설치한 후 다시 로컬 코드 수정 + git push 하면
GitHub Actions가 EC2에 접속해서 docker-compose up을 제대로 실행할 수 있다!.. 그치만 미리 추가 작업을 해줘야 오류 없이 잘 deploy할 수 있다.

추가로 미리 해둬야할 작업(에러 해결)

1. EC2내부에서만 .env파일을 만들자
겪은 에러: env file /home/****/Devops/.env not found
이유는?

  • 프로젝트의 docker-compose.yml 안에 환경변수 참조 (.env 파일)가 있거나, Node.js 앱 내에서 dotenv 패키지를 써서 .env 로드를 시도하고 있었다.
  • 그런데 GitHub에는 .gitignore 때문에 .env가 없음.
    그래서 EC2의 git pull 이후에도 .env 파일이 없다!
    해결방법: EC2내부에서만 .env파일을 만들어서 필요한 키들을 적어주고 저장한다(보안이슈 때문에 github엔 가급적 push하지 않는다!)

2. EC2 보안 그룹 확인
AWS 콘솔 → EC2 → 인스턴스 → 보안 → 보안그룹 → 인바운드 규칙에서
3000번 포트 (TCP)가 열려 있어야 한다.
없으면 추가하기

  • 포트 범위: 3000
  • 프로토콜: TCP
  • 소스: 0.0.0.0/0 (전부 허용, 테스트용) 또는 본인 IP

마무리, 전체적인 흐름

  • 로컬 VSCode에서 코드 수정
  • git add, commit, push
  • GitHub → Actions 자동 실행
  • EC2 SSH 접속 → git pull, docker-compose down, build, up -d
  • 변경사항 반영된 서비스가 EC2에서 자동 재실행
  • http://퍼블릭IP:3000 접속 → 변경 확인
    이렇게 구현을 완료했다.

배포는 되는데 EC2에서 자동으로 git pull, docker-compose down, build, up -d 가 안되서 오류를 해결하느라 시간이 좀 소요되었다.

배포 흔적을 보여주고 싶었는데 사진이 자꾸 깨져서..
여길 누르세요 이 링크를 누르면 확인할 수 있다.
예전에 했을땐(compose-todo-api 였나?) 배포까지만 하고 변경사항 반영되서 재실행 하게 하는건 안했다. 이번엔 다 해서 뿌듯하다.

이제 여기에 프론트를 추가해도 재밌겠고.. 다른 데브옵스 공부를 해서 추가해도 재밌겠다. 2학기에 수업으로도 배워서 실습은 일단 여기까지 해볼까.

profile
작게, 빠르게, 지속가능하게

0개의 댓글