일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Spring
- 네트워크
- 객체지향
- Spring Security
- TCP/IP
- RDS
- OOP
- 알고리즘
- 스프링부트
- 성능 개선
- JMeter
- 트러블 슈팅
- 동시성 문제
- N+1 문제
- redis
- OSI 7계층
- AWS
- JWT
- 인메모리
- 로그인
- 4-way-handshake
- docker
- EC2
- 백준
- 형상관리
- 코딩테스트
- 프로토콜
- Java
- 3-way-handshake
- Today
- Total
열공스토리
[AWS] AWS EC2에 Docker로 스프링부트 프로젝트 배포하기 본문
Docker Compose에 포함된 스프링부트 프로젝트를 AWS EC2 서버에 배포해 보았습니다.
EC2 인스턴스 생성
1. 이름 및 태그
인스턴스의 이름과 태그를 설정합니다.
2. AMI 설정
운영체제는 우분투를 선택했습니다. 여기서 문득, 다른 개발자 블로그들을 보면 ec2 운영체제를 선택하는 부분에서 대부분 우분투를 선택하는 데 그 이유가 궁금해졌습니다. 그래서 찾아본 결과,
1. 우분투는 리눅스의 배포판이므로 리눅스의 기능들을 사용할 수 있다.
2. 오픈소스 소프트웨어와 호환이 잘 되기 때문에 웹 서버, 데이터베이스, 애플리케이션 서버 등의 설치와 운영에 최적화 되어 있다.
정도로 정리할 수 있었습니다. (이외에도 다른 이유들이 있겠지만 그러한 부분들은 다음에 제대로 활용해 보면서 찾아봐야 겠다고 생각했습니다.)
3. 인스턴스 유형
인스턴스 유형은 프리티어 기본 값인 t2.micro를 선택해 주었습니다.
4. 키 페어 생성
키 페어는 ec2 인스턴스에 접속할 때 사용되는 암호 키입니다. 또, 키 페어는 공개 키와 개인 키가 한 쌍으로 이루어져 있다고 합니다.
위와 같이 키 페어를 생성해 주었습니다.
5. 네트워크 설정
네트워크 설정에서는 보안 그룹을 생성하여 접속 가능한 IP 주소를 설정해 줍니다. 저는 어떤 네트워크에서든 접속할 수 있도록 설정하였습니다.
처음에는 기존에 RDS의 데이터베이스를 생성할 때 만들어 둔 보안 그룹을 그대로 사용하려고 했으나, 생각해 보니 RDS는 ec2 서버에서만 접속이 가능해야 하고 ec2는 외부에 공개 되어야하므로 그 역할이 다르다는 것을 알아차리고 ec2 서버에 대한 새로운 보안 그룹을 만들어 주었습니다.
6. 스토리지 구성
프리 티어 최대 용량인 30GB로 설정했습니다.
위 단계에 걸쳐 인스턴스를 생성해 주면,
이렇게 인스턴스가 생성된 것을 확인할 수 있습니다.
7. 보안 그룹 설정
보안 그룹의 인바운드 규칙을 위와 같이 추가해 주었습니다.
HTTPS 통신과 HTTP 통신은 사용자가 브라우저를 통해 접속할 수 있도록 모든 외부 IP를 허용하도록 설정했고 SSH는 접근 허용 IP 주소를 수정하여 집에서만 접근할 수 있도록 설정 했습니다.
추가적인 설명을 보태면, 배포하려는 스프링부트 프로젝트는 현재 Nginx를 프록시 서버로 사용하고 있어서 Nginx 포트를 통해서만 서비스를 제공받을 수 있도록 인바운드 규칙을 추가했습니다.
EC2 서버 접속
1. EC2 서버 접속
인스턴스 연결을 참고하여 아래와 같이,
(1) 터미널을 열고
(2) 발급 받은 키 페어 (.pem)파일이 존재하는 디렉토리 위치로 이동해서
(3) 키 페어 파일에 대해 400 권한을 준 다음,
(4) ec2 서버에 접속합니다.
Docker를 이용하여 EC2 서버에 프로젝트 배포
1. Docker Compose 빌드
[Dockerfile]
# 베이스 이미지 설정
FROM amazoncorretto:17 AS builder
# Gradle 및 소스 코드 복사
WORKDIR /app
COPY . .
# Gradle 빌드 실행 (테스트 제외)
RUN ./gradlew clean build -x test
# 최종 이미지
FROM amazoncorretto:17
# 작업 디렉토리 설정
WORKDIR /app
# 빌드된 JAR 파일 복사
COPY --from=builder /app/build/libs/*.jar app.jar
# 컨테이너가 실행될 때 Java 애플리케이션 실행
ENTRYPOINT ["java", "-jar", "app.jar"]
[docker-compose.yml]
version: "3.8"
services:
redis:
image: redis:latest # :latest 태그(명시하지 않아도 default 값)는 가장 최신 안정 버전을 의미함(redis:6.2.6는 redis 6.2.6 버전을 의미)
ports:
- 6379:6379
spring_boot:
image: devhub
build: .
expose:
- 8080 # 컨테이너 내부에서만 해당 포트를 인식하게끔 하는 속성. 즉, 다른 컨테이너에서는 8080으로 통신이 가능하지만, 외부에서는 8080으로 접근할 수 없음
volumes:
- /data/DevHubProject:/data/DevHubProject # ec2 환경
depends_on:
- redis # redis 컨테이너가 먼저 올라간 다음 nginx가 올라가도록 설정
nginx:
image: nginx
ports:
- 80:80
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d # nginx/conf.d 폴더를 컨테이너 내부의 /etc/nginx/conf.d로 마운트
depends_on:
- spring_boot
Dockerfile과 docker-compose.yml 파일을 작성하고
docker-compose build
위 명령어로 도커 컴포즈 파일을 빌드하면
위와 같이 이미지 도커 이미지가 생성된 것을 확인할 수 있습니다. (docker compose 빌드 테스트)
2. ec2 서버에 Docker 설치
# docker의 공식 GPG 키 추가:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# apt 소스에 저장소 추가:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
# docker 관련 플러그인 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
[공식 문서]를 참고하여 docker를 설치해 줍니다. (docker compose 플러그인 포함)
docker가 정상적으로 설치 됐는지 테스트도 해주고
# 도커 그룹에 사용자 추가
sudo usermod -aG docker $USER
# 변경사항 적용 (새로고침)
newgrp docker
docker 명령을 실행할 때, docker 데몬(docker 백그라운 서비스)에 접근이 가능하도록 docker 그룹에 사용자를 추가해 항상 관리자 권한으로 docker 명령을 실행할 수 있도록 설정해 줍니다.
3. ec2 서버에서 docker compose로 프로젝트 실행
git clone {레포지토리 URL}
이제, 깃허브 저장소에 올려놓은 프로젝트를 ec2 서버에 클론하고
# format
scp [옵션] [pem파일 경로] [송신 파일 경로] [호스트 이름]@[퍼블릭 DNS]:[파일 수신 경로]
위 형식에 맞춰, scp 명령으로 개인 pc에 있는 서버 설정 파일을 ec2서버에 전송해 주었습니다. (application.yml 파일은 gitignore로 깃허브에 올라가지 않게 막아두었기 때문에 해당 작업이 필요했습니다.)
# 프로젝트 내부에 docker-compose.yml 파일 위치로 이동
cd ~/devhub-server
# docker compose 실행
docker compose up
그리고 프로젝트 내부에 docker-compose.yml 파일 위치로 이동한 다음 docker compose 명령을 입력하면…
스프링부트가 정상적으로 실행되고
스프링부트를 포함한 nginx, redis 3개의 컨테이너가 잘 띄어지고
브라우저로 접속할 수 있게 됩니다!
이로써 docker를 이용하여 aws ec2 서버에 스프링부트 프로젝트 배포가 되었습니다.
다음 목표
1. HTTPS 통신을 위한 SSL 인증서 적용
2. 도메인 연동
3. CI/CD를 구축하여 배포 자동화 (GitHub Action)
+ Active Profile을 설정하여 개발 환경 설정과 배포 환경 설정 분리
참고
'AWS' 카테고리의 다른 글
[AWS] 스프링부트 프로젝트에 AWS RDS 연동하기 (0) | 2024.10.24 |
---|