[CI/CD] Github Action으로 CI/CD 구축하기 - 2. AWS EC2 생성 및 Dockr 환경 세팅

Ogu·2024년 9월 14일
0
post-thumbnail

이번 시간에는 앞선 [CI/CD] Github Action으로 CI/CD 구축하기 - 1. Flow 설계에 이어 배포를 위한 서버인 AWS EC2를 생성 및 세팅해보겠습니다.
RDS는 기존에 생성되어 사용하고 있던 상황이라 생략하도록 하겠습니다.
또한 AWS 계정도 이미 생성되어있다고 가정하고 진행하겠습니다.

AWS 생성 및 세팅하기

🗂️ AWS Region 설정

우선 AWS에 로그인을 하고, Region을 서울로 설정합니다.

🗂️ EC2 인스턴스 생성

앞서 보았던 사진에서 EC2 클릭 또는 EC2를 검색하여 EC2 대시보드에 들어갑니다.
중간에 보이는 인스턴스 시작 버튼을 누릅니다.

🧩 OS, 및 기본 세팅

EC2 이름을 본인의 서비스에 맞게 지어줍니다.

EC2 서버의 운영체제를 선택합니다.
저는 익숙한 운영체제인 ubuntu와 프리티어가 제공되는 LTS 버전을 선택했습니다.

인스턴스 유형을 선택합니다. 프리티어가 제공되는 유형인 t2.micro를 선택했습니다.

🧩 키페어 생성

EC2 서버에 로컬 등의 환경에서 원격으로 접속하기 위한 키페어를 생성합니다.
키페어는 한번 생성한 이후 다시 받을 수 없으므로 처음 받을 때 내 로컬에 잘 보관하도록 합니다.

우리가 만든 sshKey를 사용하도록 설정해줍니다.

🧩 네트워크 설정

기존에 생성해둔 보안 그룹이 있다면 선택하고, 저는 EC2 생성 후에 따로 세팅하도록 하겠습니다.

SSH 트래픽 허용은 EC2 인스턴스를 외부에서 접속하기 위한 설정으로, 보통 로컬환경에서 접속합니다.
저는 생성했던 pem키를 통해 ip(위치)무관하게 접속할 것이기 때문에 위치 무관을 선택했습니다.

🧩 스토리지 설정

아래의 안내 문구에 따라 프리티어 내에서 가능한 최대 볼륨으로 설정합니다.
30GB와 범용 스토리지를 선택합니다.

🧩 생성

기본적인 세팅은 모두 끝났으니, 오른쪽 요약 탭에서 설정한 정보들을 최종으로 확인하고 인스턴스 시작을 눌러 생성합니다.

🧩 생성 확인

EC2의 인스턴스 메뉴에서 생성되어 실행중인 인스턴스를 볼 수 있습니다.

🗂️ 보안 그룹 생성 및 설정

🧩 보안 그룹 생성

[EC2 > 네트워크 및 보안 > 보안그룹] 메뉴를 눌러 보안그룹 생성을 클릭합니다.

다음과 같이 기본 세부 정보를 입력합니다.

인바운드 규칙을 다음과 같이 편집합니다.
인바운드 규칙은 인스턴스에 도달하도록 허용된 수신 트래픽을 제어합니다.
HTTPS(443 포트), 8080포트(SpringBoot), HTTP(80 포트), SSH(22 포트)를 어디서나 접근 가능하도록 열어줍니다.

아까 생성했던 pem키를 통한 인스턴스 내부에 직접 접속하는 SSH(22 포트)를 내 IP(특정 IP)에서만 접속하고 싶다면 [내 IP]로 설정합니다.

모두 설정했다면 아래의 규칙 저장 버튼을 눌러 최종 생성합니다.

🧩 EC2에 보안 그룹 설정

이젠 우리가 생성한 보안 그룹을 EC2 서버에 설정합니다.

우리가 생성한 인스턴스에서 [작업 > 보안 > 보안 그룹 변경] 탭을 클릭합니다.

방금 생성한 보안그룹으로 변경합니다.

잘 적용되었는지 EC2에서 확인합니다.

🗂️ 발급받은 ssh .pem키로 EC2 우분투 콘솔에 접속

우선 EC2 인스턴스에서 연결 탭을 클릭합니다.

나와있는 설명을 참고하여 진행해봅시다.

  1. pem키가 있는 폴더에서 터미널 창을 엽니다.
  2. pem키의 파일 권한을 400으로 설정합니다. -> chmod 400 "clothstar-v3-sshKey.pem"
    -> 권한이 없는 경우 sudo 명령어로 실행하거나, 윈도우의 경우 관리자 터미널로 설정을 변경합니다.

윈도우에서는 리눅스 기반 명령어인 chmod를 사용할 수 없습니다. 따라서 cmd에서 아래 명령어를 차례대로 입력해주세요.

icacls.exe myec2.pem /reset
icacls.exe myec2.pem /grant:r %username%:(R)
icacls.exe myec2.pem /inheritance:r
  1. 위 ssh클라이언트 안내에서 아래에 있는 예 ssh -i "~~~.pem" ubuntu@~~~ 를 복사하여 터미널창에 입력합니다.

아래와 같이 EC2 인스턴스에 ubuntu 계정으로 접속한 것을 확인할 수 있습니다.

🗂️ Docker , Docker Compose 설치

🧩 Docker 설치

아래 명령어를 차례대로 입력하여 Docker를 설치합니다.

1. 패키지 목록 업데이트

# 패키지 목록 업데이트
sudo apt-get update

리눅스 계열 운영체제에서 쓰이는 패키지 관리 툴인 apt를 최신 버전으로 업데이트 합니다. 최신 버전의 소프트웨어를 설치하기 위해서는 최신 패키지 목록이 필요합니다.

2. 필요한 패키지 설치

sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

Docker를 설치하기 전에 필요한 패키지들을 설치합니다.

  • apt-transport-https: HTTPS를 통해 패키지를 가져올 수 있도록 합니다.
  • ca-certificates: SSL 인증서를 관리하기 위한 패키지입니다.
  • curl: 데이터를 전송할 때 사용되는 커맨드 라인 도구로, 링크로 데이터를 다운 받을 수 있습니다.
  • gnupg-agent: GPG 암호화에 사용되는 에이전트입니다.
  • software-properties-common: 우분투에서 PPA를 사용하기 위한 패키지로, add-apt-repository 명령어를 사용할 수 있습니다.

PPA : Personal Package Archive.
우분투는 우분투 소프트웨어 센터에 등록된 프로그램 및 버전만 다운받을 수 있습니다. 이 방식이 편리하고 검증된 프로그램만 다운 받을 수 있다는 점에서 안전하지만 새로운 버전이 빨리 업데이트 되지 않는다는 단점이 있습니다. 업데이트 주기는 우분투가 업데이트 되는 6개월인데, 보다 자유롭게 최신 버전과 등록되지 않은 프로그램을 다운 받을 수 있도록 도와 주기 위한 패키지가 PPA 입니다.

3. Docker의 공식 GPG 키 추가

# Docker GPG 키 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Docker의 공식 GPG 키를 다운로드하고 시스템에 추가합니다.
이 키는 Docker 패키지의 신뢰성을 확인하는 데 사용됩니다.

이 명령어는 Docker의 공식 GPG 키를 다운로드하고, 해당 키를 시스템에 추가하는 역할을 합니다. 명령어의 각 부분을 자세히 살펴보면 다음과 같습니다:

  • curl -fsSL https://download.docker.com/linux/ubuntu/gpg:
    이 옵션들을 사용하여 Docker의 GPG 키를 조용히 (-s) 다운로드하고, 오류 발생 시 명령을 실패하게 합니다.

    • curl은 URL에서 데이터를 가져오는 데 사용되는 명령줄 도구입니다.
    • -f: HTTP 오류가 발생하면 실패하게 합니다.
    • -s: 출력 메시지를 숨기고 조용히 실행합니다.
    • -S: 오류가 발생할 경우만 오류 메시지를 출력합니다.
    • -L: HTTP 리다이렉션이 있는 경우 이를 따라가도록 합니다.
  • | sudo apt-key add -:

    • | (파이프)는 첫 번째 명령어의 출력을 두 번째 명령어의 입력으로 전달하는 데 사용됩니다.
    • sudo: 관리자 권한으로 명령을 실행합니다.
    • apt-key add -: apt-key 명령은 패키지 관리자(apt)가 사용하는 키를 관리하는 명령어입니다. add -는 파이프로 전달된 GPG 키를 추가하라는 의미입니다.

💡 GPG 키?
GPG (GNU Privacy Guard) 키는 데이터의 무결성과 출처를 확인하는 데 사용되는 암호화 기술의 한 형태입니다. GPG 키는 소프트웨어 패키지가 신뢰할 수 있는 출처에서 왔으며, 설치하는 동안 변경되지 않았음을 보장합니다. 패키지 관리자는 이러한 GPG 키를 사용하여 패키지가 공식적인 소스에서 온 것인지 확인하고, 이를 설치할 수 있도록 합니다.

4. Docker 공식 APT 저장소 추가

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

Docker의 공식 APT 저장소가 Ubuntu 시스템에 추가되어 시스템이 Docker 패키지를 Docker의 공식 저장소에서 가져올 수 있도록 설정됩니다.
이후 sudo apt-get update 명령어를 실행하여 패키지 목록을 업데이트하면, 새로운 Docker 패키지가 목록에 나타나게 됩니다.

5. 시스템 패키지 목록 업데이트:

# 시스템 패키지 업데이트
sudo apt-get update

6. Docker 설치

# Docker 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io

7. Docker 설치 확인 및 서비스 시작

# Docker 서비스의 상태를 확인
sudo systemctl status docker
# 수동으로 Docker 데몬 실행
sudo systemctl start docker
# Docker 서비스가 시스템 부팅 시 자동으로 시작되도록 설정
sudo systemctl enable docker

8. Docker 버전 확인

docker --version

🧩 Docker Compose 설치

아래 명령어를 차례대로 입력하여 최신 버전의 docker compose를 설치합니다.

1. Docker Compose 최신 버전 다운로드:

sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

GitHub의 Docker Compose 릴리스 페이지를 확인하고, 가장 최신 버전을 다운로드합니다. 위 명령어는 최신 버전을 자동으로 다운로드합니다.

2. 실행 권한 부여

sudo chmod +x /usr/local/bin/docker-compose

3. Docker Compose 설치 확인:

docker-compose --version

⛔️ docker compose 버전 관련 트러블 슈팅
사실 이전에 docker-compsoe를 1.xx를 사용하여 docker-compose, 파이썬을 수동으로 설치했을때의 버전들이 충돌하여 docker-compose를 실행할 수 없었던 에러가 있었습니다.

Docker Compose에 대한 버전 설명과 해당 트러블 슈팅은 아래 링크에서 확인할 수 있습니다.

[Trouble Shooting] ⛔️ Github Action - docker 버전과 Python 버전 충돌, Docker V1과 V2의 차이점

🧩 ubnutu 사용자 계정을 Docker 그룹에 추가하여 docker 명령어 권한 추가하기

docker 명령어가 사용이 가능해졌는지 확인해보기 위해 현재 가동중인 컨테이너 리스트를 출력해주는 docker ps 명령어를 입력해봅시다.

아래와 같이 permission denied가 뜬 것을 확인할 수 있습니다.
이는 현재 사용자가 Docker 데몬에 접근할 수 있는 권한이 없어서 발생하는 문제로, 기본적으로 Docker는 root 사용자나 docker 그룹의 사용자만 접근할 수 있습니다.

따라서 우리는 현재 접속한 계정인 ubuntu 사용자를 docker 그룹에 추가하여 docker 명령어를 사용할 수 있도록 해봅시다.

  1. docker 그룹에 현재(ubuntu) 사용자 추가
sudo usermod -aG docker $USER
  • usermod는 사용자를 수정하는 명령어입니다.
  • -aG 는 사용자를 기존 그룹에 추가할 때 사용됩니다. 여기서 docker는 그룹 이름이고, $USER는 현재 로그인한 사용자입니다.
  1. 변경사항을 적용하기 위해 로그아웃하고 다시 로그인
    사용자 그룹 변경 사항을 적용하려면 로그아웃 후 다시 로그인하거나 다음 명령어를 사용하여 쉘을 다시 시작할 수 있습니다
newgrp docker

⛔️ docker 명령어 권한 관련 트러블 슈팅
docker 명령어 권한 설정이 ubuntu 계정에서 사용하기 위한 설정이 필요한지 몰랐을 때 Github Action의 SSH로 서버에 연결 및 Docker compose 실행하는 스크립트에서 권한 오류가 난 적이 있습니다.

docker compose 관련 명령은 docker-compose 명령어로 실행하지만, 같은 도커 엔진에서 가동되기 때문에 docker 명령어에 대한 권한이 필요했기 때문이었는데, 관련 트러블 슈팅은 아래에서 확인할 수 있습니다.

[Trouble Shooting] ⛔️ Github Action 스크립트에서 docker-compose 명령어 권한 오류

이제 EC2 생성, 설정 및 Docker ,Docker Compose를 사용하기 위한 세팅이 끝났습니다.

다음 포스팅에서는 도커 이미지를 만들기 위한 SpringBoot와 Nginx의 DokerFile 을 만들어보도록 하겠습니다. 감사합니다.

참고

profile
Hello! I am Ogu, a developer who loves learning and sharing! 🐤🐤 <br> こんにちは!学ぶことと共有することが好きな開発者のOguです!🐤

0개의 댓글