Skip to content

Latest commit

 

History

History
673 lines (408 loc) · 17.9 KB

배포_조사.md

File metadata and controls

673 lines (408 loc) · 17.9 KB

환경



실습

CI의 경우 Github Actions라는 명확한 무료 툴 존재

CD에서 후보들을 산정하여 조합

Github Actions with



1. Heroku 👆

비용 실제 테스트 비고
무료 O (완료) 30분간 트래픽 없는 경우 서버 다운 이슈 해결
p.s. 헤로쿠 잠들지 않게

< 사용법 >

  1. 스프링 프로젝트 준비

    ⚠️ 주의 : 로컬에서 빌드(./gradlew build)를 하고 git push를 하는 것을 기준으로 작성


  2. 프로젝트 루트 경로에서

    • Procfile 파일 만들기 (확장자 없음)

      web: java -Dserver.port=$PORT $JAVA_OPTS -jar [빌드명].jar
      
    • system.properties 파일 만들기 (필수는 아님)

      heroku가 자바를 지원하는 방식

      java.runtime.version=11
      
    • gradlew를 사용한다면, /gradle/wrapper 폴더는 gitignore로 빼면 안됨

    => Heroku 공식 홈페이지


  3. heroku 앱 만들기 (회원가입 필요)

    heroku App 화면에서 new로 생성


  4. 레포지토리 Actions탭 > 'set up a workflow yourself'를 선택

    (이미 만든적 있다면 New workflow)

    image

    그러면 루트에 .github/workflows 라는 폴더의 yml파일 수정

    name: [원하는 이름]
    
    on:
      push:
        branches: [ main ]
    
    jobs:
      build:
        runs-on: ubuntu-latest    # 돌릴 OS
        
        steps:
          - uses: actions/checkout@v2
          
    #      - name: Build project    # 로컬에서 build해서 확인하고 배포할 것이기 때문에 이건 굳이 필요는 없음 
    #        run: ./gradlew build
      
          - name: Deploy to Heroku
            uses: AkhileshNS/heroku-deploy@v3.12.12
            with:
              heroku_api_key: ${{ secrets.heroku_api_key }}
              heroku_email: ${{ secrets.heroku_email }}
              heroku_app_name: ${{ secrets.heroku_app_name }}
    • heroku_api_key
    • heroku_email
    • heroku_app_name

    값의 경우, Settings탭 > Secrets에서 값을 숨겨서 변수로 사용

cf) 헤로쿠 배포





2. CodeDeploy /w EC2 👆

비용 (1Month) 실제 테스트 비고
CodeDeploy비용(0원)
+
EC2비용(약 11232원)
O (완료) CodeDeploy로 AWS EC2에 배포하면 무료 (참고 링크)

<사전 준비>

EC2 배포 테스트 선행.

cf) 요금은

  • 온디맨드

  • 아시아(서울)

  • Linux

을 기준으로 아래표.

image

AWS 공식 요금 페이지 참조

t3.micro부터 테스트 예정.

(t3.micro는 한 달에 11232원 정도 (환율 : 1200원 기준)가 예상)

EC2에는 jar 배포 파일과 MySQL DB서버만 두는 전략.


1) 로컬

  1. 빌드 후 jar 준비

    ./gradlew build

  2. AWS EC2로 수동 전송 (CodeDeploy로 자동화 예정)

    scp -i [키이름].pem dev-event-server-0.0.1-SNAPSHOT.jar ubuntu@[서버IP]:~/

2) 서버

  1. jvm 설치 (참조 링크)

    $ sudo apt-get update
    $ sudo apt-get upgrade
    
    # JAVA11 설치
    $ sudo apt-get install openjdk-11-jdk
    

  2. mysql 설치 (참조 링크)

sudo apt-get update # 우분투 서버 업데이트
sudo apt-get install mysql-server # mysql-server 설치
sudo ufw allow mysql # 외부 접속 기능 설정 (포트 3306 오픈)
sudo systemctl start mysql # MySQL 실행
sudo systemctl enable mysql # Ubuntu 서버 재시작시 MySQL 자동 재시작
sudo /usr/bin/mysql -u root -p # MySQL 접속

CREATE DATABASE dev_event default CHARACTER SET UTF8; # DB생성
  • 클라우드 방화벽 오픈: 참고

cf) 참고로 현재 port 9000으로 픽스 해두었으므로, EC2에서 방화벽(인바운드 규칙) 9000 오픈 필요.


3) 모니터링

http://[서버IP]:9000/admin/v1/events/2021/7 로 해보면 기본적인 API 응답 가능한 것 확인 완료.

모니터링 설정을 준비.

< CodeDeploy 사용법 >

JaeYoung 님 블로그 를 참고하여 작성하였습니다.

  1. EC2에 ruby설치 후 code-deploy agent를 설치

    sudo apt-get update
    sudo apt-get install ruby
    sudo apt-get install wget
    cd /home/ubuntu
    
    wget https://`bucket-name`.s3.`region-identifier`.amazonaws.com/latest/install
    chmod +x ./install
    sudo ./install auto

    bucket-name과 region-identifier은

    AWS 공식 문서를 기준으로 설정하되 저는 다음과 같습니다.

    wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install

    (참고로, 현재 EC2에는 jvm과 mysql이 설치되어 있어서 자바 어플리케이션이 실행가능한 상태에서 시작하였습니다.)

  2. AWS 세팅 (위의 블로그를 참고하여 세팅)

    • EC2 IAM 설정
    • CodeDeploy 어플리케이션 생성 및 IAM 설정
    • S3 생성
    • 사용자 생성 (accessKey, secretKey 필요)
  3. EC2 배포스크립트 작성

    프로젝트 루트 경로에

    • appspec.yml

      version: 0.0
      os: linux
      
      files:
        - source: /
          destination: /home/ubuntu/sangjin-deploy
      permissions:
        - object: /home/ubuntu/sangjin-deploy/
          owner: ubuntu
          group: ubuntu
      hooks:
        AfterInstall:
          - location: scripts/deploy.sh
            timeout: 60
            runas: ubuntu
      
    • deploy.sh

      #!/usr/bin/env bash
      
      REPOSITORY=/home/ubuntu/sangjin-deploy
      cd $REPOSITORY
      
      APP_NAME=actions
      JAR_NAME=$(ls $REPOSITORY/build/libs/ | grep 'SNAPSHOT.jar' | tail -n 1)
      JAR_PATH=$REPOSITORY/build/libs/$JAR_NAME
      
      CURRENT_PID=$(pgrep -f $APP_NAME)
      
      if [ -z $CURRENT_PID ]
      then
        echo "> 종료할것 없음."
      else
        echo "> kill -9 $CURRENT_PID"
        kill -15 $CURRENT_PID
        sleep 5
      fi
      
      echo "> $JAR_PATH 배포"
      nohup java -jar $JAR_PATH > /dev/null 2> /dev/null < /dev/null &
      
      

STEP 4. .github/workflows에서 yml 생성

# This is a basic workflow to help you get started with Actions

name: github actions + heroku

on:
  push:
    branches: [ main ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

env:
  PROJECT_NAME: CDapp

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v2

      - name: Make zip file
        run: zip -qq -r ./$GITHUB_SHA.zip .   # GITHUB_SHA는 예약변수로, 커밋 해시값
        shell: bash

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.accessKey }}
          aws-secret-access-key: ${{ secrets.secretKey }}
          aws-region: ${{ secrets.region }}

      - name: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://sangjin-deploy/$PROJECT_NAME/$GITHUB_SHA.zip

      - name: Code Deploy
        run: aws deploy create-deployment --application-name CDapp --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name CDapp --s3-location bucket=sangjin-deploy,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip


5. 성공 ⭐️

image


3. GCP 사용


3-1. GCP Compute Engine + MySQL

STEP 1. ec2-micro 인스턴스에 MySQL 설치
        설치 커멘드 기록

STEP 2. ec2-micro 인스턴스 비용 정책 기록

STEP 1.

  1. 설치 스크립트 생성

    mysql.sh

    sudo apt-get -y update # 우분투 서버 업데이트
    sudo apt-get -y install mysql-server # mysql-server 설치 (혹은 mariadb-server)
    sudo ufw allow mysql # 외부 접속 기능 설정 (포트 3306 오픈)
    sudo systemctl start mysql # MySQL 실행
    sudo systemctl enable mysql # Ubuntu 서버 재시작시 MySQL 자동 재시작
    
    
    query="CREATE DATABASE [DB명] default CHARACTER SET UTF8; # DB생성
    
    CREATE USER '[사용자명]'@'[Spring서버 IP]' IDENTIFIED BY '[비밀번호]'; # 사용자 생성
    FLUSH PRIVILEGES;
    
    GRANT ALL PRIVILEGES ON [DB명].* TO '[사용자명]'@'[Spring서버 IP]';
    FLUSH PRIVILEGES;
    SHOW GRANTS FOR'[사용자명]'@'[Spring서버 IP]';"
    
    sudo /usr/bin/mysql -u root -D mysql -e "${query}"  # DB 쿼리 실행
  2. 스크립트 실행

    ./mysql.sh

STEP 2.

GCP 무료 프로그램 을 참고하면 다음과 같은 안내글을 볼 수 있습니다.

image

  • 특정 리전 (오리건: us-west1, 아이오와: us-central1, 사우스캐롤라이나: us-east1)
  • 스토리지 30GB

까지는 월 720시간까지 무료로 사용할 수 있습니다.


그래서 다음과 같이 설정하였습니다.

image

(월별 예상 가격은 720시간 초과 후의 가격이지 않을까 생각됩니다.)



3-2. 헤로쿠 연동 테스트

STEP 1.  GCP 인스턴스에 설치한 MySQL에 헤로쿠 연동
          MySQL 정보는application-real.yml 설정정보 추가

STEP 2. DEV GROUP real data로 insert

STEP 3. API 몇번 호출해보고 평균 응답 ms 기록

STEP 1. GCP MySQL 서버 IP 확인 후 프로젝트 설정 값 변경

  • MySQL IP : xx.xxx.xx.xxx
  • appliction-real.yml
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://xx.xxx.xx.xxx:3306/dev_event?characterEncoding=UTF-8&serverTimezone=UTC
    username: [사용자명]
    password: [비밀번호]
  • ⛱ 주의할 점
    • mysql 서버의 사용자를 만들때 스프링 서버 ip 만 허용해서 만들것
    • db서버 ip오픈은 스프링 서버 ip 만 허용할 것


STEP 2. MySQL 서버 오픈

vi /etc/mysql/mariadb.conf.d/50-server.cnf

50-server.cnf


bind-address = [스프링 서버 ip]

service mysql restart
netstat -lntp  # 3306번 포트 열린 ip 확인  
  • cf) mysql -h '[MySQL서버 IP]' -u [사용자명] -p 로 테스트 확인



STEP 3. 이렇게 하면 배포는 완료~!

image


cf) heroku 참고

$ heroku login

$ heroku git:remote -a sangjin-test

$ git add .
$ git commit -am "make it better"
$ git push heroku master





STEP 3.

ID 호출 url 소요 시간
1 [인증] 관리자 계정 로그인 약 700ms
2 [인증] 관리자 계정 가입 약 1500ms
3 [ROLE] 생성 약 300ms
4 [ROLE] 전체 조회 약 600ms
5 [관리자] 태그 생성 약 600ms
6 [관리자] 태그 전체 조회 약 500ms
7 [관리자] 개발자 모임 생성 약 700ms
8 [관리자] 개발자 모임 전체 조회 약 500ms



3-3. 정적 파일 제공

스토리지는 오라클 오브젝트 스토리지 로 결정되었으므로, CDN 서비스만 비교하겠습니다.

비용 산정 기준은 다음과 같습니다.

< Dev-Event 서비스 >

  • 트래픽

    : 먼저 Dev-Event Github 저장소 visitor 통계 근거로 하루 120~220views 이며, 웹으로 쉽게 사용할 수 있을 때 트래픽을 넉넉잡아 하루 300view로 산정하였습니다.

    => 9000views/Month

  • 이미지 크기

    : application.yml 기준 이미지 파일 하나의 크기는 최대 3MB이며, 한 페이지에서 10개의 이미지를 보여주며, 최소 2페이지 이상 방문이라고 가정하였습니다.

    => 60MB/1view


< 네트워크 서비스 >

  • 네트워크 : 50GB/월
  • HTTPS요청 : 20000/월 (크케 의미 있는 factor는 아닙니다.)


선택1. AWS Cloud Front

비용, 장점

비용 실제 테스트 장점
약 7100원
(AWS 가격측정기)
O (완료) 사용 편의성 우수

cf) 1년 사용에 대한 약정 시 CloudFront Savings Bundle을 사용하여 최대 30%를 절감할 수 있습니다.


선택2. GCP Cloud CDN

비용, 장점

비용 실제 테스트 장점
약 5320원
(GCP 가격측정기)
X

선택3. NCP CDN+

비용, 장점

비용 실제 테스트 장점
4500원
(NCP 가격측정기)
X

선택4. NHN CDN

비용, 장점

비용 실제 테스트 장점
5000원
(NHN 가격)
X

선택5. 가비아 로컬 CDN

비용, 장점

비용 실제 테스트 장점
3500원
(gabia가격)
X

cf) 로컬 CDN은 해외 트래픽을 지원하지 않습니다.



=> 직접 사용 전에 비교했을 시에는 비용적인 부분을 제외하고는 큰 차이가 없는 것 같습니다.