- 배포 (비용 분석중)
- 환경: AWS vs NCP
- DB
- AWS RDB
- Amazon RDS 요금
- 캐시
- Amazon ElastiCache
- cache.t3.small(0.049 USD)기준 한달 41817.6원 (참고. Amazon ElastiCache 요금)
- Amazon ElastiCache
- 멀티미디어 파일
- Cloud Front
- 조합
- Local + Git action
- Jenkins + EC2
- Docker(ECR)
- 탐색
- 정적 페이지
- 모니터링
- 비용: AWS 슬랙 hook
- 기타 고려사항
- 모바일을 위한 API
- 호출횟수 제한
CI의 경우 Github Actions라는 명확한 무료 툴 존재
CD에서 후보들을 산정하여 조합
Github Actions with
1. Heroku 👆
비용 | 실제 테스트 | 비고 |
---|---|---|
무료 | O (완료) | 30분간 트래픽 없는 경우 서버 다운 이슈 해결 p.s. 헤로쿠 잠들지 않게 |
< 사용법 >
-
스프링 프로젝트 준비
⚠️ 주의 : 로컬에서 빌드(./gradlew build
)를 하고 git push를 하는 것을 기준으로 작성
-
프로젝트 루트 경로에서
-
Procfile 파일 만들기 (확장자 없음)
web: java -Dserver.port=$PORT $JAVA_OPTS -jar [빌드명].jar
-
system.properties 파일 만들기 (필수는 아님)
java.runtime.version=11
-
gradlew를 사용한다면, /gradle/wrapper 폴더는 gitignore로 빼면 안됨
-
-
heroku 앱 만들기 (회원가입 필요)
heroku App 화면에서 new로 생성
-
레포지토리 Actions탭 > 'set up a workflow yourself'를 선택
(이미 만든적 있다면 New workflow)
그러면 루트에 .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
을 기준으로 아래표.
t3.micro부터 테스트 예정.
(t3.micro는 한 달에 11232원 정도 (환율 : 1200원 기준)가 예상)
EC2에는 jar 배포 파일과 MySQL DB서버만 두는 전략.
-
빌드 후 jar 준비
./gradlew build
-
AWS EC2로 수동 전송 (CodeDeploy로 자동화 예정)
scp -i [키이름].pem dev-event-server-0.0.1-SNAPSHOT.jar ubuntu@[서버IP]:~/
-
jvm 설치 (참조 링크)
$ sudo apt-get update $ sudo apt-get upgrade # JAVA11 설치 $ sudo apt-get install openjdk-11-jdk
-
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 오픈 필요.
http://[서버IP]:9000/admin/v1/events/2021/7 로 해보면 기본적인 API 응답 가능한 것 확인 완료.
모니터링 설정을 준비.
< CodeDeploy 사용법 >
JaeYoung 님 블로그 를 참고하여 작성하였습니다.
-
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이 설치되어 있어서 자바 어플리케이션이 실행가능한 상태에서 시작하였습니다.)
-
AWS 세팅 (위의 블로그를 참고하여 세팅)
- EC2 IAM 설정
- CodeDeploy 어플리케이션 생성 및 IAM 설정
- S3 생성
- 사용자 생성 (accessKey, secretKey 필요)
-
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 &
-
# 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
STEP 1. ec2-micro 인스턴스에 MySQL 설치
설치 커멘드 기록
STEP 2. ec2-micro 인스턴스 비용 정책 기록
STEP 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 쿼리 실행
-
스크립트 실행
./mysql.sh
STEP 2.
GCP 무료 프로그램 을 참고하면 다음과 같은 안내글을 볼 수 있습니다.
- 특정 리전 (오리건:
us-west1
, 아이오와:us-central1
, 사우스캐롤라이나:us-east1
) - 스토리지 30GB
까지는 월 720시간까지 무료로 사용할 수 있습니다.
그래서 다음과 같이 설정하였습니다.
(월별 예상 가격은 720시간 초과 후의 가격이지 않을까 생각됩니다.)
STEP 1. GCP 인스턴스에 설치한 MySQL에 헤로쿠 연동
MySQL 정보는application-real.yml 설정정보 추가
STEP 2. DEV GROUP real data로 insert
STEP 3. API 몇번 호출해보고 평균 응답 ms 기록
- 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
만 허용할 것
- 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
로 테스트 확인
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 |
스토리지는 오라클 오브젝트 스토리지
로 결정되었으므로, 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은 해외 트래픽을 지원하지 않습니다.
=> 직접 사용 전에 비교했을 시에는 비용적인 부분을 제외하고는 큰 차이가 없는 것 같습니다.