이번과제 중 재일 많은 시간을 소비한 파트는 AWS연동 파트였다. AWS를 처음 사용해 봐서 세팅을 하는데 어려움이 있었는데 다음에 AWS 연동 세팅을 할 때 더 수월히 작업을 하기 위해 블로그에 해결한 방법들을 남겨 보려고 한다.
AWS EC2 (Elastic Compute Cloud)
EC2는 AWS에서 제공하는 클라우드 기반 가상 서버이다. 사용자는 EC2 인스턴스를 생성하여 클라우드에서 가상 서버를 실행할 수 있다.
- 기능 및 특징:
- 가상 서버 제공: EC2는 사용자가 필요할 때마다 가상 서버를 생성하고, 다양한 운영체제(예: Linux, Windows)를 선택하여 실행할 수 있다.
- 확장성: 사용자는 필요에 따라 서버의 크기를 조정할 수 있으며, 여러 개의 서버 인스턴스를 쉽게 생성하거나 종료할 수 있다.
- 유연성: 컴퓨팅 파워(CPU, 메모리, 스토리지 등)를 선택하고 조정할 수 있다.
- 온디맨드 사용 요금: 사용자는 EC2 인스턴스를 사용한 만큼만 비용을 지불한다. 필요할 때만 서버를 켜고, 사용하지 않을 때는 종료할 수 있어 비용 효율적이다.
- 사용 사례:
- 웹 서버나 애플리케이션 서버를 클라우드에 배포하고 운영할 때.
- 데이터 분석, 머신 러닝 작업 등의 대규모 컴퓨팅 작업을 처리할 때.
- 확장 가능한 서버 기반 애플리케이션을 개발할 때.
AWS RDS (Relational Database Service)
RDS는 AWS에서 제공하는 관계형 데이터베이스 관리 서비스이다. RDS를 사용하면, 데이터베이스 서버의 설정, 운영, 확장, 백업과 같은 작업을 AWS가 자동으로 관리해 주므로, 사용자는 데이터베이스 관리에 들어가는 복잡한 작업을 줄일 수 있다.
- 기능 및 특징:
- 자동 관리: RDS는 데이터베이스의 백업, 소프트웨어 패치, 모니터링 등을 자동으로 관리해 준다.
- 여러 데이터베이스 엔진 지원: RDS는 MySQL, PostgreSQL, MariaDB, Oracle, Microsoft SQL Server, Amazon Aurora 같은 다양한 관계형 데이터베이스 엔진을 지원한다.
- 확장성: 필요에 따라 데이터베이스의 용량을 확장할 수 있으며, 성능을 최적화할 수 있는 여러 옵션을 제공한다.
- 고가용성: Multi-AZ 배포를 통해 장애 복구가 용이하며, 읽기 복제본(Read Replicas)을 통해 읽기 성능을 확장할 수 있다.
- 사용 사례:
- 관계형 데이터베이스가 필요한 웹 애플리케이션에서 안정적인 데이터 관리를 원할 때.
- 데이터베이스 관리의 복잡도를 줄이고 싶을 때.
- 자동 백업, 고가용성, 데이터 복구 등의 기능을 원하는 경우.
JAR 파일 생성 및 이동
먼저 EC2환경에서 스프링 프로젝트를 실행하려면 JAR파일이 필요한데 JAR 파일은 Java ARchive의 약자로, 여러 Java 클래스 파일과 그 클래스들이 참조하는 리소스 파일들(텍스트, 이미지, 설정 파일 등)을 하나의 파일로 묶은 압축 파일이다. JAR 파일은 ZIP 형식으로 압축되며, 주로 Java 프로그램을 배포하고 실행하기 위해 사용된다.
JAR파일은 IntelliJ의 왼쪽 Gradle탭 내부에 Taks->build->bootjar을 클릭하면 프로젝트하위 폴터 build -> libs에 자동생성된다.
이 생성된 JAR파일을 이제 AWS EC2 서버 내부로 이동시켜 실행시켜 주면 된다. 그렇기 위해선 터미널에 이동하여 먼저 EC2에 등록된 keypair.pem의 권한을 받아와야 한다. 권한을 받기 위해 터미널을 켠 뒤 keypair가 등록된 디렉터리로 이동된 뒤 해당 명령어를 사용하면 된다.
chmod 400 {keypair이름}.pem
권한을 받았다면 EC2를 SSH 또는 웹을 통해 connect 한 뒤 아래 명령어를 통해 JAR파일을 전송할 수 있다. EC2 인스턴스 SSH접속 주소 뒤 :~/ 부분은 EC2유분투 서버 내에 저장할 디렉터리 위치인데 ~/로 지정한다면 가장 상단 디렉터리에 위치한다.
scp -i {keypair명}.pem ~/{JAR파일위치}/{Jar파일명}.jar {EC2인스턴스SSH접속 주소}:~/
EC2 환경변수 설정
Intellij에서 개발을 한뒤 EC2서버에서 실행을 하려고 할 때 JAR파일을 실행해도 환경변숫값들이 Intellij IDE내부에 저장이 되어 EC2환경에서는 안 돌아간다. 그래서 필수 환경변수들은 EC2 인스턴스에서도 설정을 해줘야 한다. 방법은 아래와 같다.
nano .bashrc
터미널 콘솔에 nano. bashrc를 입력하면. bashrc 파일을 수정할 수 있는데 가장 하단에 원하는 환경변수 키와 밸류 값들을 지정할 수 있다.
해당 환경변수들을 저장을 한 뒤 source. bashrc를 입력하여 해당 환경변수들의 source를 지정해 줄 수 있다.
source .bashrc
RDS 데이터베이슬 연결할떄에도 application.yaml에 있던 database url을 아래와 같이 환경변수화 하여 Intellij에서 localhost로 진행할 시에는 localhost로 EC2에서는 RDS로 연결할 수 있도록 위의 방법으로 database url을 수정할 수 있다.
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DBNAME}
RDS DB 유저 권한
RDS를 연동한뒤 MASTER ID와 Password를 이요한 유저를 사용하면 DB를 사용할 수 있는 줄 알았는데 따로 유저를 만들거나 사용 원하는 DB에 권한을 주어야 한다. 아래쿼리를 입력한 뒤 password를 입력하면 Mysql에 접근할 수 있다.
sudo mysql -u{MasterId} -p -h{RDS엔드 포인트}
Mysql에 접속한 뒤 사용하길원 하는 데이터베이스를 생성할 수 있다.
CREATE DATABASE {DB명};
만약 새로운 유저를 만들고 싶다면 해당 쿼리를 사용할 수 있다.
CREATE USER '{USERNAME}'@'%' IDENTIFIED BY '{PASSWORD}'; // USER생성
CREATE USER '{USERNAME}'@'localhost' IDENTIFIED BY '{PASSWORD}'; // USER생성
- @'localhost' 해당 컴퓨터에서만 접근가능
- @'%' 모든 클라이언트에서 접근 가능
유저를 만들었다면 이제 아래 쿼리를 사용하여 권한을 부여할 수 있다.
GRANT ALL PRIVILEGES ON *.* TO '{USERNAME}'@'%'; // 데이터베이스 내의 모든 DB & TABLE에 권한부여
GRANT ALL PRIVILEGES ON {DBNAME}.* TO '{USERNAME}'@'%'; // 특적 DB에 대해 모든 권한부여
GRANT select,insert, updated PRIVILEGES ON *.* TO '{USERNAME}'@'%';//특정 권한만 유저에게 부여
FLUSH PRIVILEGES;//변경된 권한을 즉시 반영
모든 작업을 맞추었다면 이제 알맞은 유저 정보를. bashrc 환경변수에 업데이트하여 RDS 데이터베이스를 활용할 수 있다.
소감
항상 로컬에서 IDE를 사용하여 개발을 하다가 AWS를 사용해 배포를 해보니 간단한 세팅이어도 많이 헤매서 시간을 많이 사용했다. 그래도 이제는 나름 익숙해져서 조금 수월하게 EC2나 RDS를 사용하여 프로젝트를 실행해 볼 수 있을 거 같다. RDS, EC2에 많은 시간을 들려서 S3 버켓을 사용한 이미지 업로딩은 수행하지 못했는데 다음에 시간이 나면 도전해 보아야겠다.
'Spring' 카테고리의 다른 글
[SpringBoot]MyBatis (2) | 2024.10.01 |
---|---|
[SpringBoot]Api Response (0) | 2024.09.06 |
[SpringBoot] ArgumentResolver 사용하여 jwt 정보 가져오기 (0) | 2024.09.04 |
[SpringBoot]Entity 연관관계 방향성 (0) | 2024.08.29 |
[SpringBoot] NaverOpen API 사용 (0) | 2024.08.29 |