파이널 프로젝트 배포 1 - EC2, S3, CodeDeploy

mjjin·2023년 10월 14일
0

이제 백엔드 서버를 구축하려고 한다.

내가 진행할 작업 단계는 아래와 같다.


  1. 도메인 발급 (구매) (HTTPS) [1년]
  2. main 브랜치로 Merge
  3. EC2 생성
  4. AWS S3, CodeDeploy 생성
  5. EC2 내부 작업
  • CodeDeploy 설치
  • Timezone 설정
  • Redis-Server 설치
  • Docker(compose) 설치
  • nginx 설치와 설정
  • Dockerfile 작성 (nginx + springboot)
  1. 깃액션 CI/CD 구축
  • 시크릿 환경변수값 추가
  • deploy.yml 코드 작성
  1. Deploy 작동 테스트

  2. 블루-그린 무중단 배포 설정

  • nginx config 변경
  • 깃액션 CI/CD deploy 코드 변경

1. 도메인 구입

도메인은 SSL 인증서 적용을 위해 구입했다.
이후 nginx 설정 때 다시 언급하겠지만 도메인을 구입한 뒤,
Let's Encrypt로 무료 인증서를 받을 예정이다.

도메인 구입은 클라우드플레어에서 진행했다.

2. main 브랜치로 Merge

현재 우리 프로젝트의 브랜치는 develop에서 작성되어있고,
develop 브랜치는 현재 이전에 사용했었던 클라우드타입을 통해
테스트서버로 CI/CD구축을 해놓은 상태이다.

실제 서비스 배포는 main 브랜치에서 작업 예정이기 때문에
develop > main으로 소스파일을 합쳐주었다.

3. EC2 생성

aws로 접속해 로그인을 진행한 상태에서 시작하겠다.

콘솔 홈에서 좌측 상단의 서비스에서 EC2를 검색해 들어간다.

인스턴스 시작을 눌러 인스턴스 생성을 시작한다.

이름을 입력한 뒤, OS 이미지를 선택해준다.
Ubuntu는 기존에 사용해봤던 20.04LTS로 진행했다.
20.04의 지원은 2025.04까지 진행된다. (5년)

밑으로 내려 키 페어(로그인)에서 키 페어를 생성해준다.
이 때, 발급받은 키는 잘 저장해두도록 한다.

네트워크 설정으로 간다.
기존에 사용하던 보안 그룹이 있다면 기존 보안 그룹을 선택하면 된다.
현재 프로젝트 계정에는 보안 그룹이 없어 생성을 진행했고,
ssh 포트, http 포트, https 포트를 열어주었다.

스토리지 구성시, 프리티어 사용자는 30GB까지 지원이 가능하므로
30GB로 설정해준다.

EC2로 인스턴스를 할당받으면, 기본적으로 유동IP서비스를 제공한다.
그렇기 때문에 인스턴스를 재시작하면 IP가 변하게 된다.
우리는 고정 IP 주소로 사용하고자 탄력적 IP를 설정해주기로 한다.

좌측의메뉴에서 탄력적 IP로 들어간다.

탄력적 IP 주소 할당을 누른다.

따로 설정해 줄 사항은 없다. 할당을 누른다.

작업 - 탄력적 IP 주소 연결을 누른다.

연결할 인스턴스를 설정한 뒤, 연결 버튼을 누른다.

이제 EC2 인스턴스 내부로 들어가 퍼블릭 주소가
방금 만든 탄력적 IP 주소로 변경되어있음을 확인한다.

주의 : 과금을 주의하자! 과금이 되는 경우
1. 탄력적 IP를 받고 인스턴스에 연결하지 않는 경우
2. 유료 인스턴스에 연결하는 경우
3. EC2 인스턴스를 중지시키거나 삭제하여 탄력적 IP 혼자 있을경우!

이 외에 추가 구성이 필요할 경우 추가적으로 구성해주면 된다.

4. AWS S3, CodeDeploy 생성

AWS S3

Github Actions에서 빌드된 프로젝트를 업로드하기 위한 S3 bucket을 생성해준다.

좌측상단의 서비스를 눌러 S3를 검색 후 들어간다.

기존에 다른 용도로 사용중인 버킷이 있지만,
CI/CD용 버킷을 별도로 만들어본다.

버킷 만들기를 눌러 들어간다.

버킷 이름과 AWS 리전을 설정한다.

이 외에 추가적으로 설정할 사항들이 있다면 추가해준뒤
버킷 만들기를 누른다.

이제 사용자를 만들러 갈 차례다.
우측 상단 - 계정클릭 - 보안 자격 증명으로 들어간다.

그리고 액세스 관리 - 사용자를 누른 뒤, 사용자 생성 버튼을 클릭한다.

사용자 이름을 입력한 뒤 다음 버튼을 누른다.

권한 옵션에서 직접 정책 연결을 선택한 뒤,
권한 정책에서 AWSCodeDeployFullAccess, AmazonS3FullAccess를 선택한 뒤 다음버튼을 누른다.

검토 및 생성에서 제대로 권한이 설정되었는지 확인 후 사용자 생성 버튼을 눌러준다.

생성 뒤 액세스 키를 만들고, 잘 보관해두도록 하자

이제 CodeDeploy 서비스에서 EC2 연동을 위한 IAM 역할을 생성한다.
좌측에서 역할을 선택하고, 역할 만들기를 누른다.

사용 사례에서 EC2를 찾아 클릭해준 뒤, 다음 버튼을 누른다.

이후 AmazonEC2RoleforAWSCodeDeploy를 입력해 권한 정책을 추가해준 뒤 다음으로 넘어간다.

역할 이름을 지정해준 뒤, 역할생성을 진행한다.

이전에 만들어두었던 EC2로 들어가기 위해 좌측 상단의 서비스에서 EC2를 검색한다.

인스턴스 - 작업 - 보안 - IAM 역할 수정으로 들어간다.

만들어두었던 EC2용 IAM 역할을 설정해준 뒤, 역할 업데이트를 진행한다.

역할을 연결한 후 인스턴스 상태 - 인스턴스 재부팅을 눌러
인스턴스를 재부팅 해준다.

이제 CodeDeploy 서비스에서 사용하기 위한 iam 역할을 생성해 줄 차례다.
우측 상단 - 계정클릭 - 보안 자격 증명을 눌러 들어가서 역할 만들기를 진행할 것이다. (이전에 했던 과정으로 이미지는 생략한다.)

CodeDeploy로 설정한다.

권한을 확인해준 뒤 다음을 누른다.

역할 이름을 입력한 뒤, 역할 생성까지 해준다.

좌측 상단의 서비스에서 AWS CodeDeploy를 입력해 들어간다.

어플리케이션을 생성한다.

어플리케이션 이름과 컴퓨팅 플랫폼을 설정한 뒤 어플리케이션 생성을 누른다.

배포 그룹을 생성해준다.

배포 그룹 이름 입력 및 서비스 역할을 지정한다.

환경 구성에서 Amazon EC2 인스턴스를 선택한 뒤,
태그 그룹 1에 키와 값을 선택한다.

배포 구성을 확인 한 후, 로드 밸런서는 체크를 풀어준 뒤 배포 그룹을 생성해준다.

5. EC2 내부 작업

어느 정도 구성이 완료되었다.
이제 EC2 내부로 들어가 필요한 파일들을 설치할 예정이다.

나는 윈도우를 사용하므로 윈도우로 작업을 진행 할 예정이다.

터미널을 관리자 권한으로 열어준다. (git bash가 익숙해서 git bash로 작업을 진행했다.)

ssh -i {key파일} ubuntu@EC2IP로 접속한다.

5-1) CodeDeploy 설치

// 경로
$ cd /home/ubuntu

// update
$ sudo apt update

// wget 설치
$ sudo apt install wget

// ruby 설치
$ sudo apt install ruby-full

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

// 권한
$ chmod +x ./install

$ sudo ./install auto > /tmp/logfile

// CodeDeploy 상태 확인
$ sudo service codedeploy-agent status

상태 확인 시 active로 되어있다면 설치가 완료된것이다.

5-2) Timezone 설정

접속중인 터미널에서 date를 입력시 UTC가 나온다.

시간대를 바꿔주기 위한 설정을 진행한다.

$ sudo rm /etc/localtime
$ sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime

설정 후 재부팅 시켜준다.

$ sudo reboot

다시 접속 후 date를 입력하면 KST가 뜨는 것을 확인할 수 있다.

5-3) 레디스 server 설치

현재 프로젝트의 경우, 레디스의 사용량이 많지 않고,
정해진 예산이 매우 작고 소중하기 때문에 비용을 최소화 시키고자
EC2 내부에 Redis를 설치하여 사용하기로 했다. (localhost)

// 업데이트, 업그레이드
$ sudo apt-get update
$ sudo apt-get upgrade


// redis 다운로드 및 설치
$ sudo apt-get install redis-server

설치 후 redis-cli를 통해 제대로 설치되었는지 확인한다.

// redis.conf 설정파일 오픈
$ sudo vim /etc/redis/redis.conf

이제 redis conf 파일을 아래와 같이 수정한다.

bind 0.0.0.0
daemonize yes
maxmemory 500m
maxmemory-policy allkeys-lru

그 외의 옵션값이 필요하다면 따로 검색해서 확인해보길 바란다.

vim 팁(?)
:set nu 입력시 줄 번호가 출력된다.
/로 검색할 수 있다.

설정파일을 변경했을 시, redis-server를 재시작 해준다.

sudo systemctl restart redis-server

만약, redis를 외부에서 접속한 다음 사용하려면
EC2 인스턴스에 6379 port를 열어준 뒤

redis-cli -h [EC2 인스턴스의 IP or DNS] -p 6379 -a [redis.conf에 설정한 비밀번호]

로 확인해보면 된다.

5-4) Docker(compose) 설치

Docker를 20.04LTS와 22.04LTS에서 설치해 본 경험으로는,
20.04버전과 22.04 버전에서 설치방법이 다르니 확인해보길 바란다.
해당 기준은 20.04LTS를 기준으로 작성하였다.

업데이트 및 HTTP 패키지 설치

$ sudo apt update
$ sudo apt-get install -y ca-certificates \ 
    curl \
    software-properties-common \
    apt-transport-https \
    gnupg \
    lsb-release

GPG 키 및 저장소 추가

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Repository 등록

 echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

최신 버전 설치

$ sudo apt update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Docker 실행권한 부여

$ sudo usermod -aG docker $USER
$ newgrp docker

Docker 설치 확인

$ docker --version

Docker compose 설치

$ sudo curl -L https://github.com/docker/compose/releases/download/v2.1.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
// 권한설정
$ sudo chmod +x /usr/local/bin/docker-compose

// 버전 확인
$ docker-compose --version

0개의 댓글