안녕하세요 JK 입니다.

github 에 push 되면 AWS EC2 에 배포 되는 환경을 설정 하려고 합니다.

git action 을 이용하면 EC2 뿐만 아니라 OCI 등에도 자동 배포 할수 있습니다.

.github/workflows/deploy.yml 파일이 있으면 github 에서 자동으로 읽어서 스크립트 를 수행 합니다.

절차는 민감 정보를 github 에 설정하고 deploy.yml 을 만들어 git push 하면 됩니다.

Step 01. GitHub Secrets 설정

  • GitHub 레포지토리 : Settings > Secrets and variables > Actions
  • 외부로 드러나면 안되는 설정을 환경 변수로 설정
    • EC2_SSH_KEY
    • HOST_DNS
    • USERNAME

Step 02. workflows 설정

  • local git repo root 위치에 .github/workflows/deploy.yml 파일 생성
name: Deploy Streamlit to EC2
 
on:
  push:
    branches:
      - main  # main 브랜치에 푸시할 때 실행
 
jobs:
  deploy:
    runs-on: ubuntu-latest
 
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
 
      # SSH 키 설정 및 EC2에 배포
      - name: Deploy to EC2
        env:
          PRIVATE_KEY: ${{ secrets.EC2_SSH_KEY }}
          HOSTNAME: ${{ secrets.HOST_DNS }}
          USERNAME: ${{ secrets.USERNAME }}
        run: |
          # SSH 키 파일 생성
          echo "$PRIVATE_KEY" > private_key && chmod 600 private_key
 
          # EC2에 SSH로 접속해 배포
          ssh -o StrictHostKeyChecking=no -i private_key ${USERNAME}@${HOSTNAME} << 'EOF'
            # 작업 디렉토리로 이동 및 코드 업데이트
            mkdir -p ~/JMD
            cd ~/JMD
            git clone https://github.com/taein2301/JMD.git . || git pull
 
            # 가상환경 생성 및 활성화
            python3 -m venv jmd_venv
            source jmd_venv/bin/activate
 
            # 의존성 설치
            pip3 install -r requirements.txt
 
            # 기존 Streamlit 프로세스 종료
            pkill -f "streamlit" || true
 
            # Streamlit 실행 (백그라운드)
            nohup streamlit run main.py --server.port 8501 --server.address 0.0.0.0 &
          EOF
 
          # 로컬 SSH 키 삭제
          rm -f private_key
  • 설명:
    • on: push: main 브랜치에 푸시할 때마다 실행.
    • actions/checkout@v3: 최신 코드를 가져옴.
    • env: GitHub Secrets에서 가져온 값을 환경 변수로 설정.
    • ssh 명령어: EC2에 접속해 코드를 클론하거나 업데이트하고, Streamlit을 백그라운드에서 실행.

설정이 끝나고 git push 하면 github 에서 확인 가능합니다.

최종 적으로 EC2 에서 streamlit 이 실행 되었음을 확인 합니다.

git action 을 이용 하여 AWS EC2 에 배포 할 여러 서비스들을 scp 나 git pull 을 수동으로 안할수 있어서 편리 합니다.

-EOF-