gengminy
갱미니의 코딩일지
gengminy
전체 방문자
오늘
어제
  • 분류 전체보기 (61)
    • 🚀 프로젝트 (16)
      • 🎸 고스락 티켓 (4)
      • 🌞 내친소 (5)
      • 🥁 두둥 (7)
    • 📡 백엔드 (31)
      • 🌱 Spring Boot (13)
      • 🐱 Nest.js (10)
      • ⭐ Node.js (8)
    • 🏭 Infra (11)
      • ⚙ 준비를 위한 준비 (2)
      • 🥑 AWS (3)
      • 🐳 Docker (3)
      • ⚡ Github Actions (3)
    • 🌊 프론트엔드 (1)
      • 🌌 React.js (1)
    • 😎 주저리 (2)

블로그 메뉴

  • 💻Github
  • 📸Instagram
  • ✨Blog

공지사항

인기 글

태그

  • nodejs
  • 네스트
  • oauth2
  • 스프링부트
  • 깃헙액션
  • Spring
  • nestjs
  • nest
  • 스프링
  • OAuth
  • 도커
  • AWS
  • docker
  • SlackAPI
  • 슬랙알림
  • GithubActions
  • JSON
  • JWT
  • github
  • springboot

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
gengminy

갱미니의 코딩일지

[Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 3 (AWS EC2 서버에서 배포)
🏭 Infra/⚡ Github Actions

[Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 3 (AWS EC2 서버에서 배포)

2022. 8. 8. 14:53

쉘 스크립트로 AWS까지 조종하는 깃헙 액션

 

2편에 이어서 3편도 계속

EC2 와 RDS 프리티어를 구매한 후 세팅까지 완료

자세한 세팅은 나중에 시간 나면 올려보도록 하겠읍니다...

 

💻 작업 환경

Windows + MacOS
AWS EC2 + RDS
Spring Boot (Gradle)
PostgreSQL
Redis
Docker

 

🚀 실제 운영 서버에 배포하기

사실 실 배포는 아니지만 어쨌든 개발 서버와 운영 서버를 통합했기 때문에

운영 서버라고 하는게 맞겠지

 

Deploy 전용 레포지토리를 만들어주고

프록시를 위한 nginx와 쉘 스크립트를 셋팅해준다

 

📝 deploy.sh

#!/bin/bash

# Installing docker engine if not exists
if ! type docker > /dev/null
then
  echo "docker does not exist"
  echo "Start installing docker"
  sudo apt-get update
  sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
  curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
  sudo apt update
  apt-cache policy docker-ce
  sudo apt install -y docker-ce
fi

# Installing docker-compose if not exists
if ! type docker-compose > /dev/null
then
  echo "docker-compose does not exist"a
  echo "Start installing docker-compose"
  sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  sudo chmod +x /usr/local/bin/docker-compose
fi

이건 깃헙 액션에서 제일 처음 실행하는 쉘 스크립트이다

물론 액션에서 바로 명령어를 입력할 수도 있지만

지저분해지니까 따로 빼놓는 게 좋다

 

나는 도커 이미지를 사용하기 때문에

도커와 도커 컴포즈가 반드시 깔려 있어야한다

 

따라서 도커와 도커 컴포즈가 설치되어 있는지 확인하고

만약 없으면 다운받아 실행시킨다

 

도커를 사용하지 않는다면 자바나 파이썬, 노드, npm 등등

셋팅을 확인하는 응용이 가능하겠죠?

 

 

📝 deploy.yml

name: Deploy to EC2
on:
  workflow_dispatch:
  push:
    branches:
      - main

jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@master

      - name: create env file
        run: |
          touch .env
          echo "${{ secrets.ENV_VARS }}" >> .env
      - name: create remote directory
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          password: ${{ secrets.PASSWORD }}
          script: mkdir -p ~/srv/ubuntu

      - name: copy source via ssh key
        uses: burnett01/rsync-deployments@4.1
        with:
          switches: -avzr --delete
          remote_path: ~/srv/ubuntu/
          remote_host: ${{ secrets.HOST }}
          remote_user: ${{ secrets.USERNAME }}
          remote_key: ${{ secrets.KEY }}
          
      - name: executing remote ssh commands using password
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          key: ${{ secrets.KEY }}
          script: |
            sh ~/srv/ubuntu/deploy.sh
            echo "start docker-compose up: ubuntu"
            sudo docker-compose -f ~/srv/ubuntu/docker-compose.yml pull
            sudo docker-compose -f ~/srv/ubuntu/docker-compose.yml --env-file ~/srv/ubuntu/.env up -d

deploy/main 브랜치를 리스닝하는 액션

실 배포 환경을 위한 .env 파일을 만들어주고

리눅스에 원격 로그인 해서 쉘 명령어까지 입력한다

 

여기서는 secrets에 여러 환경 변수를 입력해두었는데

  • HOST : EC2 public IP
  • USERNAME : EC2 username (ubuntu를 사용하기 때문에 기본 ubuntu)
  • PASSWORD : EC2 password (기본 패스워드는 없어서 사용하고 싶다면
    EC2 콘솔에서 password authentication 세팅해줘야함)
  • KEY : EC2 pem 키 (windows에서는 ppk로 변환되는데 이거는 잘 안먹으니까 조심)

 

중간에 rsync 를 사용하는게 있는데

이건 github action runner에 복사된 내 deploy 레포지토리의 소스를

remote, 즉 내 EC2 서버로 동기화하여 복사해주는 리눅스 명령어다

 

따라서 자동으로 내 레포지토리의 소스가 EC2 까지 복사된다

 

이후 EC2 서버에 복사된 deploy.sh 파일을 실행하고

도커 셋팅을 완료하면 도커 컴포즈로 서버 배포가 완료된다

 

 

📝 docker-compose.yml

version: "3.7"
services:

# redis 설정
  redis:
    image: "redis:alpine"
    network_mode: "host"

# 서버 설정
  backend:
    image: gengminy/hifi-dev:dev
    container_name: backend
    network_mode: "host"
    env_file:
      - .env

# nginx 설정
  nginx:
    network_mode: "host"
    depends_on:
      - backend
    restart: always
    build:
      dockerfile: Dockerfile
      context: ./nginx

RDS 를 사용하기 때문에

인메모리 DB인 redis 를 제외한 DB관련 컨테이너는 띄우지 않는다

redis는 jwt 리프레시 토큰을 편하게 사용하기 위해 도입했다

 

nginx를 이용한 프록시 설정으로

80번 포트에서 서버 포트인 8000번 포트로 포워딩 시켰다

 

nginx는 도커 파일과 default.conf 파일을 따로 두어서 빌드시켰다

 

단일 서버를 띄우기 때문에 편하게 사용하고자

network_mode 를 host 로 두었다

 

기본 네트워크 모드는 bridge라서

컨테이너가 독립적으로 존재하는 네트워크를 구성하는데

host로 두게 되면 호스트의 네트워크를 각 컨테이너가 사용하게 된다

 

이렇게 쓰면 편한게 localhost로도 각 컨테이너에 접근이 가능하다

 

 

📝 default.conf

server{
    listen 80;
    server_name {내 서버 도메인};
    access_log  /var/log/nginx/access.log  backend;

    location / {
        proxy_pass http://backend:8000;
        proxy_redirect     off;

        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

nginx에 대해서는 따로 설명을 붙이지 않겠다

80번 포트에서 들어온 요청을 서버 8000번 포트로 포워딩 한다

 

server_name 은 내가 구매해서 사용중인 도메인을 적어주면 된다

 

 

🚀 배포 확인

빌드에 성공한 모습

 

 

이후 EC2 서버에 접속해서

sudo docker-compose logs 찍으면 배포가 되었는지 확인할 수 있다

 

 

postman에서 리퀘스트 보내도 잘 오는 것을 확인

DB와 redis 관련 동작까지 잘 된다

 

이렇게 깃헙 액션을 통해 CI/CD 자동화를 해보았는데

처음에는 되게 막막하고 어렵다 생각했는데

자세하게 알아보니까 꽤 재밌었다

 

 

물론 하루종일 이거만 붙잡고 있어서 머리가 꽤 아팠는데

아마도 성장통이지 않을까

 

 

🔍 Series

  • [Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 1 (깃헙 액션 사용법)
  • [Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 2 (스프링 Gradle 빌드 + 도커 푸시)
  • [Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 3 (AWS EC2 서버에서 배포)

 

저작자표시 (새창열림)

'🏭 Infra > ⚡ Github Actions' 카테고리의 다른 글

[Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 2 (스프링 Gradle 빌드 + 도커 푸시)  (0) 2022.08.08
[Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 1 (깃헙 액션 사용법)  (0) 2022.08.07
    '🏭 Infra/⚡ Github Actions' 카테고리의 다른 글
    • [Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 2 (스프링 Gradle 빌드 + 도커 푸시)
    • [Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 1 (깃헙 액션 사용법)
    gengminy
    gengminy
    코딩

    티스토리툴바