[AWS] EC2 인스턴스에 Docker 컨테이너 배포하기
이전에 Google Cloud Platform (GCP)를 이용하여 Docker 컨테이너를 배포하는 방법을 포스팅한 적 있다.
이번에는 AWS를 사용하여 배포하는 방법을 살펴보도록 하자.
AWS 인스턴스에, Docker 컨테이너를 실행시키고, 네트워크 설정을 통해 외부에서 접근가능하게 하는 설정까지를 시도하여 간단하게 배포하는 방법을 간략하게 다루어보도록 하겠다.
해당 포스팅에서는 Docker에 대한 자세한 설명은 다루지 않으므로, Docker에 대해서 모른다면 블로그 내의 다른 Docker 관련 포스팅을 참고하자.
무엇을 할 것인가
해당 포스팅은 AWS 프리티어의 한도 안에서 서버를 구축하는 것을 목표로 한다. 즉 RDS, LB 등 비용이 필요한 다른 AWS의 기능들 없이 가장 간단한 형태로 웹 애플리케이션을 배포할 것이다.
목표 : 컴퓨터를 빌리고, 안에서 Docker를 이용하여 앱을 실행시키고, 네트워크를 설정시켜서 외부에서 접속 가능하게 하는 것!
- AWS EC2 인스턴스 만들기 (컴퓨터 빌리기)
- AWS EC2 접속하기 (컴퓨터 접속하기)
- Docker-compose 설치한다
- 빌린 컴퓨터에서 깃을 통해 필요한 파일(docker-compose.yaml)를 다운로드 받는다
- Docker-compose로 App 컨테이너를 실행한다
- 네트워크 설정으로 포트를 뚫어주어, App을 외부에서 접속 가능하도록 해준다.
AWS 인스턴스 만들기
먼저 빌릴 컴퓨터를 만들어야 한다. EC2 -> 인스턴스 -> 인스턴스 시작으로 들어가주자.
이름은 자유롭게 지어주고, 플랫폼 이미지를 선택해준다. 일반적으로 Ubuntu를 많이 사용하므로 선택해주었다.
아키텍쳐에서 플랫폼 유형을 정할 수 있는데 amd에 해당하는 64비트를 선택해주었다.
키 페어는, 빌린 컴퓨터에 접속할 때, SSH 접속을 통해 보안상으로 안전하게 접속하도록 해주는 역할을 한다.
해당 포스팅에서는 해당 절차를 생략하고 진행하기는 했지만. 하지만 실제 배포를 목적으로 한다면 키 페어를 생성하여 SSH 접속을 통해 넣어주는 것이 좋다.
네트워크 설정은 말 그대로 빌린 컴퓨터의 네트워크를 설정해주는 부분인데, 일단 현재 디폴트로 설정되어 있는 것을 보면
1. 외부 IP는 자동으로 할당받도록 설정되어 있다.
2. 0.0.0.0/0은 모든 IP에서 SSH 접속을 할 수 있도록 허용해준다는 뜻이다. SSH 접속은, AWS에 로그인하여, 생성한 인스턴스에 접근할 때(Shell 접속) 사용된다.
디폴트 값으로 설정해보고 넘어가도록 하겠다.
스토리지는 EC2 내부의 저장공간을 선택하는 곳이다. 일단 운영 목적이 아니므로 8GB의 스토리지를 선택하였다.
고급 세부 과정에서는 이외의 원하는 추가 옵션을 설정할 수 있다.
해당 과정까지 마쳤으면 우측의 인스턴스 시작을 클릭하여 생성을 완료하도록 하자.
인스턴스 Shell 접속하기
좌측에서 인스턴스 탭을 보면 방금 생성한 EC2 인스턴스, 즉 대여한 컴퓨터를 확인할 수 있다.
퍼블릭 IPv4주소를 보면, 자동으로 외부에서 접근할 수 있는 IP가 할당된 것을 볼 수 있다.
연결을 위해서 해당 인스턴스 ID를 클릭하여 들어가보자.
해당 인스턴스의 ID를 클릭하면 다음과 같은 화면이 보일 것이다. 우측 상단의 연결 버튼을 클릭하자.
EC2 Instance Connect를 사용하여 연결을 통해 Shell에 접속해주도록 하자.
앞에서 키 페어를 등록해주었다면, SSH 클라이언트를 이용하여 보안 Shell에 접속하는 것이 가능하다.
필요한 애플리케이션 세팅
APT 업데이트, Docker 다운로드 및 Git Version 확인
sudo apt update
Ubuntu에서 패키지를 다운로드 받을 때 사용하는 apt를 업데이트 해주자.
sudo apt install docker.io
sudo apt install docker-compose
Docker를 설치하는 과정이다. Docker 컨테이너 빌드 및 실행에 필요한 패키지들을 다운로드받아주자.
git --version
기본적으로 Ubuntu Image에서 제공되는 Git이 설치되어 있는 것을 확인해주자.
Git Repository Clone
이후, 사용하려는 브랜치로 체크아웃을 진행하여, 소스코드를 확인해주자.
sudo git clone YOUR_REPOSITORY_URL
필요한 소스코드가 저장되어있는 Git Repository를 Clone해주자.
cd YOUR_REPOSITORY #클론받은 디렉터리로 이동
sudo git checkout YOUR_BRANCH
Git에서 다른 브랜치를 사용하려면 Clone받은 Repository 디렉터리 안으로 이동해서, 체크아웃 해주자.
Docker 컨테이너 실행
이제 EC2 인스턴스에서 Application을 실행시켜야 한다. 앞서 말했듯 Docker를 사용하여, 컨테이너 기반으로 앱을 실행시킬 것이다.
version: "3.7"
networks:
wisefee-network-dev-deploy:
driver: bridge
services:
wisefee-database:
image: mariadb:10.11.2
container_name: wisefee-database-dev-deploy
environment:
MYSQL_DATABASE: "wisefee-database"
MYSQL_ROOT_PASSWORD: "1111"
ports:
- 3309:3306
volumes:
- ./volumes/mariadb:/var/lib/mysql
networks: #사용할 네트워크 지정
- wisefee-network-dev-deploy
wisefee-app:
image: sjh9708/devserver-wisefee-app5:latest
restart: always
depends_on:
- wisefee-database
- wisefee-redis
ports:
- 8082:8080
container_name: wisefee-app-dev-deploy
environment:
SPRING_DATASOURCE_URL: jdbc:mariadb://wisefee-database-dev-deploy:3306/wisefee-database?characterEncoding=UTF-8&serverTimezone=UTC
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: 1111
SPRING_REDIS_HOST: wisefee-redis-dev-deploy
SPRING_REDIS_PORT: 6379
volumes:
- ./volumes/storage/upload:/app/wisefee/storage/upload
- ./volumes/log:/app/wisefee/log
networks:
- wisefee-network-dev-deploy
wisefee-redis: # container name
image: redis:6.2.6-alpine
ports:
- 6391:6379
container_name: wisefee-redis-dev-deploy
command: redis-server /usr/local/etc/redis/redis.conf
volumes:
- ./volumes/redis/data:/data
- ./volumes/redis/conf:/usr/local/etc/redis/redis.conf
restart: always
networks:
- wisefee-network-dev-deploy
해당 내용은 필자가 사용하려는 docker-compose 파일이다.
해당 내용을 살펴보면, Spring Application, MariaDB, Redis를 Compose를 통해 컨테이너를 실행시키려고 하며, 모든 컨테이너들은 미리 빌드된 이미지를 사용하고 있다.
Spring Application 같은 경우에는, 미리 Dockerhub에 빌드해 둔 이미지를 사용하고 있다.
sudo docker-compose up -d
빌드할 이미지가 없으므로, 곧바로 docker-compose up -d를 통해, 이미지를 다운로드 받고, 컨테이너를 실행해주자.
sudo docker ps
해당 명령어를 통해 Docker 컨테이너가 잘 실행되고 있는지 확인해보자. 필자는 log까지 찍어보아 실행이 성공한 것을 확인해 볼 수 있었다.
네트워크 설정
지금까지 앱 실행까지는 성공했으나, EC2의 Public IP(외부 IP)를 통해 접근할 수 없는 상태일 것이다.
이유를 생각해보면, 처음부터 모든 포트를 접근할 수 있도록 허용해주면 문제가 발생할 것이다.
따라서 우리는 어떤 사용자가, 어떤 포트로 접속을 가능하게 할 것인지에 대한 네트워크 규칙을 추가해 주어야 한다.
네트워크 및 보안 -> 보안 그룹으로 들어가 주자.
위에서 EC2 인스턴스를 생성할 때, 네트워크 설정을 했을 때 기본 규칙 이름이 launch-wizzard-1이었다. 해당 보안 그룹 ID를 클릭해보자.
클릭하면 다음과 같은 화면이 보일 것이다. 인바운드 규칙 편집에 들어가주자.
규칙 추가를 클릭하자.
유형에서 사용자 지정 TCP를 지정하면 원하는 포트의 접근제어를 할 수 있다.
포트 범위에서 접근 가능하게 하려는 포트, 우리의 경우에는 스프링 Application의 포트번호를 입력하면 될 것이다.
0.0.0.0/0은 앞에서도 말했듯, 모든 IP에 대해서 해당 Public IP에 대한 8082 포트의 접근을 허용해주겠다는 뜻이다.
결과 확인
할당받은 Public IP를 통해 허용해준 포트로 접속해보니, 배포한 Spring API에 접속이 성공한 것을 확인할 수 있다.
<함께 보기> CI/CD 구축하기 : AWS EC2 + Docker + GitHub Actions
해당 포스팅 내용을 기반으로 GitHub Actions를 사용하여 자동적으로 Git에 소스코드가 Push되면 이를 자동으로 배포하는 CI/CD 파이프라인을 구축한 내용을 포스팅한 글이다. 본 글과 마찬가지로 AWS 프리티어의 한도 안에서 가장 간단하게 적용하는 방법을 작성하였다. 더 나아가 CI/CD를 적용하고 싶다면 해당 포스팅을 참고하면 좋을 것 같다.
https://sjh9708.tistory.com/237
'Cloud > AWS' 카테고리의 다른 글
[AWS & Github Actions] CI/CD 파이프라인 구축 (Spring + Docker) (0) | 2024.07.17 |
---|