애플리케이션의 안정성과 확장성을 확보하기 위해 클라우드 서비스를 활용하고 있습니다. AWS`Amazon Web Services`는 그중에서도 가장 널리 사용되는 클라우드 플랫폼으로, 강력하고 유연한 인프라를 제공합니다. 이번 포스팅에서는 AWS의 대표적인 서비스인 `EC2`, `RDS(MySQL)`, `ElastiCache(Redis)`를 활용하여 애플리케이션을 배포하는 과정에 대해 알아보도록 하겠습니다.
인스턴스 생성 전 공통 적용 사항입니다.
모든 인스턴스 생성은 `프리티어`로 진행합니다.
AWS 사이트에 접속 후 로그인 한 뒤 `우측 상단`에 위치한 리전을 서울로 설정합니다.
1. EC2
EC2는 AWS에서 제공하는 클라우드 컴퓨팅 서비스입니다.
이 서비스를 통해 아마존이 각 세계에 구축한 데이터 센터의 서버용 컴퓨터들의 자원을 원격으로 사용할 수 있습니다.
한마디로 아마존으로부터 가상의 컴퓨터를 한 대 빌리는 것과 같습니다.
1-1. 인스턴스 생성
제일 먼저 `좌측 상단 검색`을 통해 `EC2`를 검색해 EC2 서비스로 이동합니다.
EC2 검색 후 나오는 대시보드에서 `인스턴스 시작`을 클릭해 인스턴스 생성을 시작합니다.
생성할 EC2 인스턴스명을 입력합니다. `ex) todo-server`
1-2. AMI 선택
사용할 AMI와 인스턴스 유형을 선택해 줍니다.
사용하고자 하는 OS를 선택합니다. 필자의 경우 `Ubuntu`를 사용하였습니다.
`프리 티어` 사용 가능 문구를 확인 후 해당되는 AMI를 선택합니다.
AMI(Amazon Machine Image)란?
AMI는 EC2 인스턴스의 템플릿입니다.
즉, 애플리케이션이 실행될 운영체제(OS), 소프트웨어, 애플리케이션 서버 등을 미리 설정해 둔 이미지입니다.
- Ubuntu Server 24.04 LTS(Long Term Support)
- 최신 LTS 운영 체제로 안정적이고 장기적으로 지원받는 서버 환경입니다.
- 장기 지원 버전으로, 보안 업데이트와 유지 관리가 5년 동안 제공됩니다.
- HVM(Hardware Virtual Machine)
- HVM은 가상화 방식 중 하나입니다.
- 하드웨어 가속을 활용하여 물리적 서버와 유사한 성능을 제공합니다.
- EC2 인스턴스는 물리적인 서버가 아니라 가상화된 서버로 동작하며, 가상화 방식에 따라 성능과 기능이 달라질 수 있습니다.
- SSD Volume Type
- Volume Type은 EC2 인스턴스의 데이터 저장 장치(스토리지)로 사용되는 EBS(Elastic Block Store)의 유형을 의미합니다.
- SSD는 흔히 알고 있는 저장장치로, SSD(솔리드 스테이트 드라이브), HDD(하드 디스크 드라이브)가 존재합니다.
인스턴스 유형을 선택합니다. `t2.micro`
`프리티어` : t2.micro는 AWS 프리티어로 제공되는 기본 인스턴스 유형으로, 월 750시간 무료 사용이 가능합니다.
`사양` : 1 vCPU, 1GB RAM
1-3. 키 페어 생성
키 페어 이름, 키페어 유형, 프라이빗 키 파일 형식을 선택하여 키 페어를 생성합니다.
이때 생성한 키 페어는 EC2 인스턴스에 원격으로 접속하는 데에 사용됩니다. `ex) ssh -i myKey.pem yourOS@your-ec2-public-ip`
키 페어는 한번 생성하면 다시 다운로드할 수 없으니 잘 보관해두어야 합니다.
키 페어 유형 차이
특성 | RSA | ED25519 |
암호화 방식 | 공개키 암호화 (기본 방식) | 타원 곡선 암호화 (ECDSA) |
키 길이 | 2048/3072/4096 비트 | 256비트 (고정) |
보안성 | 안정적 (긴 키 필요) | 동일한 보안성을 더 짧은 키로 제공 |
속도 | 상대적으로 느림 | 더 빠름 |
호환성 | 모든 시스템에서 지원 | 최신 시스템에서 지원 |
호환성의 이유로 `RSA` 유형을 선택하였습니다.
프라이빗 키 파일 형식 차이
특성 | .pem | .ppk |
사용 환경 | Linux, macOS, AWS EC2, OpenSSH | Windows, PuTTY, WinSCP |
기본 파일 형식 | OpenSSH 형식 | PuTTY 전용 형식 |
변환 | 필요 없음 (AWS EC2에서 기본 제공) | PuTTY에서 사용 시 .pem → .ppk 변환 필요 |
필자의 경우 macOS 사용자 이므로 `.pem`을 선택하였습니다.
Windows 사용자의 경우 .ppk를 선택하여 PuTTY를 통해 SSH 접속이 가능합니다.
생성한 키 페어를 선택해 설정합니다.
기존에 생성한 키 페어가 존재한다면 해당 키 페어를 선택해도 무방합니다.
1-4. 네트워크 설정
다음으로 네트워크 설정을 합니다.
- `다음에서 SSH 트래픽 허용`
- `22번 포트`로 SSH 접속할 때 허용 할 IP를 지정합니다.
- 보안상 내 IP로 지정해 두는 것을 추천합니다. 다만, 네트워크 환경이 달라질 때마다 보안 그룹에서 IP를 재설정해야 합니다.
- `인터넷에서 HTTPS 트래픽 허용`
- `443번 포트`로 HTTPS를 통해 EC2 서버로 요청을 허용합니다.
- `인터넷에서 HTTP 트래픽 허용`
- `80번 포트`로 HTTP를 통해 EC2 서버로 요청을 허용합니다.
`EC2`, `RDS`, `ElastiCache`를 생성 후 보안 그룹을 연결하며 전체적인 설정을 할 예정이니 전체적으로 기본값으로 두고 생성합니다.
기존 보안 그룹을 생성하였을 경우 기존 보안 그룹을 선택해도 무방합니다.
보안 그룹 생성으로 인스턴스 생성 시 위 이미지에 밑줄 친 이름으로 보안 그룹이 생성되니 추후 헷갈리지 않도록 인지해둡니다.
보안 그룹에 대한 이름을 직접 생성할 경우 보안 그룹 생성 후 기존 보안 그룹 선택으로 추가하시면 됩니다. (이후 설정 변경 가능하니 어느 방식으로 해도 무관함)
1-5. 스토리지 설정
다른 설정은 기본으로 설정하고 프리티어가 사용할 수 있는 최대인 `30GiB`로만 변경합니다.
아래 보이는 고급 세부 정보는 따로 건드리지 않고 기본으로 생성합니다.
전체적으로 설정 한 요약을 확인 후 `인스턴스 시작`을 클릭합니다.
이후 EC2 → 인스턴스로 이동해 생성된 EC2 인스턴스를 확인할 수 있습니다.
이어서 바로 RDS`MySQL`를 생성하도록 하겠습니다.
2. RDS (MySQL)
RDS`Relational Database Service`는 관계형 데이터베이스를 제공하는 AWS의 서비스입니다.
사용자가 사용하지 쉽도록 인프라를 자동화시켜주고 사용자들은 앤드포인트로 접속할 수 있는 데이터베이스를 제공받습니다.
2-1. 데이터베이스 생성
`좌측 상단 검색`을 통해 `RDS`를 검색해 RDS 서비스로 이동합니다.
RDS 검색 후 나오는 대시보드에서 `데이터베이스 생성`을 클릭해 데이터베이스 생성을 시작합니다.
기본으로 `표준 생성`으로 선택되어 있는데 이대로 진행합니다.
2-2. 엔진 옵션 선택
다음으로 엔진 옵션을 선택합니다.
필자의 경우 MySQL로 선택하였고 버전의 경우 기본값으로 두었습니다.
프리티어를 선택합니다.
프리티어 선택 시 아래 `가용성 및 내구성`은 비활성화 됩니다.
2-3. 데이터베이스 설정
`DB 인스턴스 식별자` : RDS생성 시 이를 식별할 이름입니다. 본인이 잘 식별할 수 있도록 작성합니다.
`마스터 사용자 이름` : 배포된 애플리케이션에서 접근하기 위해 사용되는 마스터 계정 이름입니다. `default : admin`
`자체관리`를 선택하여 암호를 직접 입력합니다.
`마스터 암호` : 마스터 사용자에 대한 암호입니다. 이 또한 배포된 애플리케이션에서 접근하기 위해 사용됩니다.
# 애플리케이션 username, password에 입력하게 됩니다.
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: ${MYSQL_URL}
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
2-4. 인스턴스 구성 설정
`프리티어`의 경우 `db.t3.micro`, `db.t4g.micro` 두 가지 선택지가 존재합니다.
`db.t3.micro` : CPU아키텍처 x86
`db.t4g.micro` : CPU아키텍처 Arm
앞서 생성한 `EC2`인스턴스를 64비트 x86 아키텍처로 생성하였으니 `db.t3.micro`로 설정합니다.
2-5. 스토리지 설정
스토리지 유형은 기본설정된 것을 사용합니다.
할당된 스토리지의 경우 `프리티어`는 최대한도 `20GiB`입니다. 다른 값으로 설정되어 있다면 20GiB로 설정합니다.
그리고 접혀있는 `스토리지 자동 조정`을 펼쳐 `스토리지 자동 조정 활성화를 체크 해제`합니다. 체크 후 생성 시 이는 `과금요소`로 이어질 수 있습니다.
2-6. 연결 설정
이후 보안 그룹을 통해 직접 연결할 예정이니 `EC2 컴퓨팅 리소스에 연결 안 함`을 선택합니다.
`퍼블릭 액세스`의 경우 `예`를 선택하면 따로 DataGrip 같은 DB IDE를 통해 접속이 가능해집니다. `과금 요소`
기존 보안 그룹 생성한 게 있다면 `기존 항목`을 선택하고 없다면 새로 생성하여 보안 그룹 이름을 입력합니다.
나머지는 기본설정 그대로 두고 넘어가겠습니다.
포트번호를 변경하고자 하면 추가 구성에서 변경할 수 있습니다.
다음 아래 사항은 기본설정으로 두고 넘어갑니다.
`데이터베이스 인증`의 경우 말 그대로 해당 RDS에 접속, 요청 시 인증 방식을 선택하는 부분입니다.
2-7. 추가 구성
추가 구성에서 `초기 데이터베이스 이름`은 RDS 생성 시 초기에 생성되는 `스키마` 이름을 적습니다.
예를 들어, 애플리케이션에 다음과 같이 설정하여 접속합니다.
# ex
jdbc:mysql://localhost:23306/todo
`백업`의 경우 반드시 체크 해제합니다. `과금 요소`
필자의 경우 이후 과금 요소로 의심되는 것은 모두 체크해제 하였습니다.
모든 설정을 마친 후 `데이터베이스 생성` 버튼을 클릭하여 데이터베이스를 생성합니다.
RDS 생성 시 `과금 요소`가 존재하니 다시 한번 설정을 검토 후 생성하시는 것을 추천드립니다.
(체크박스가 아닌 해당 라인만 클릭해도 선택됨)
RDS → 데이터베이스 이동 후 데이터베이스가 잘 생성 됐는지 확인합니다.
이어서 바로 ElastiCache(Redis)를 생성하도록 하겠습니다.
3. ElastiCache (Redis)
`ElastiCache`는 Fully managed 분산 인메모리`In-memory`캐싱 서비스입니다.
ElastiCache는 주로 성능을 중시하는 애플리케이션에서 사용됩니다.
데이터베이스나 다른 백엔드 스토리지에서 가져오는 데이터를 캐싱(Cache)하여 액세스 속도를 향상하는 데 사용됩니다.
즉, ElastiCache는 데이터를 더욱 빠르게 가져오기 위한 메모리 기반의 저장소 서비스입니다.
3-1. Redis OSS 캐시 생성
`좌측 상단 검색`을 통해 `ElastiCache`를 검색해 ElastiCache 서비스로 이동합니다.
그 후 바로보이는 메인화면에서 `지금 시작`을 클릭해 나오는 목록에서 `Redis OSS`를 선택합니다.
3-2. 구성 및 클러스터 모드 설정
첫 화면에서 서버리스-신규로 체크되어 있는데 `프리티어`로 생성하기 위해 `자체 캐시 설계`로 선택합니다.
`프리티어`에서는 단일 노드만 지원하므로 `클러스터 캐시` 선택 → `비활성화됨` 선택
클러스터 캐시?
클러스터 캐시는 Redis에서 데이터를 샤딩`Sharding`하여 여러 노드에 분산 저장하고 관리하는 기능입니다.
큰 데이터셋을 여러 노드에 나누어 저장하여 각 노드의 부담을 줄이고, 처리 속도를 향상합니다.
`샤딩` : 데이터를 여러 노드에 나눠서 저장
`확장성` : 노드를 추가하거나 제거하며 Redis 클러스터의 데이터 용량과 처리 능력을 동적으로 확장
`고가용성` : 각 노드에는 보조 복제본(Replica)이 있어, 주 노드가 장애가 발생하더라도 복제본이 활성화되어 데이터를 계속해서 사용
`자동화된 데이터 관리` : Redis 클러스터는 키를 기준으로 노드 간 데이터를 자동으로 분산 처리
3-3. 클러스터 정보 및 위치 설정
먼저 클러스터 이름을 작성합니다. 설명의 경우 선택사항이니 작성하실분은 작성하시면 됩니다.
`프리티어`에서 제공하는 `AWS 클라우드`를 선택합니다.
`다중 AZ`의 경우 기본 체크 되어있는데 이는 `과금요소`이므로 체크해제 해줍니다.
`AWS 클라우드` : Amazon Web Services가 제공하는 인터넷 기반의 클라우드 컴퓨팅 플랫폼으로 물리적 서버를 소유하지 않고, AWS의 데이터센터에 있는 자원을 빌려 사용하는 방식입니다.
`온프레미스` : 기업이 자체적으로 물리적 서버, 네트워크 장비 등을 구축하여 데이터와 애플리케이션이 회사의 물리적 위치에 있는 서버에서 실행됩니다.
`다중 AZ` : 캐시 클러스터를 여러 가용 영억에 걸쳐 배포하여 장애 복구 속도를 향상합니다. 장애 발생 시 다른 AZ에 있는 복제본으로 자동 전환 됩니다.
`다중 장애 조치` : 다중 AZ를 사용할 때 활성화할 수 있는 옵션으로, 장애 발생 시 데이터를 잃지 않고 안정적으로 서비스가 지속됩니다.
3-4. 클러스터 설정
필자의 경우 엔진 버전을 `7.0`으로 설정하였습니다. (사용하는 Redis의 버전에 맞춰서 사용하시면 됩니다.)
포트, 파라미터 그룹은 기본설정으로 선택하였습니다.
현재 프리티어로 사용할 수 있는 노드 유형은
`cache.t2.micro` : CPU 아키텍처 x86
`cache.t3.micro` : CPU 아키텍처 x86 (t2보다 최신)
`cache.t4g.micro` : CPU 아키텍처 Arm
앞서 `EC2` 인스턴스 생성 시 CPU 아키텍처 x86로 생성하여 `t2` 또는 `t3`를 선택합니다.
필자의 경우 RDS 생성할 때와 마찬가지로 `cache.t3.micro`를 선택하였습니다.
`프리티어`이므로 복제본 개수는 0으로 생성합니다. `과금요소`
3-5. 서브넷 그룹 설정
연결, 가용 영역 배치는 기본 설정으로 적용합니다.
VPC (서브넷 그룹)의 경우 앞서 생성한 EC2, RDS와 동일한 그룹으로 설정하는데 앞서 생성 시 기본값으로 설정하였습니다.
서브넷 그룹을 달리 설정 할 경우 서로 간의 통신 시 문제가 발생할 수 있으니 다른 그룹을 설정하였다면 같은 그룹으로 생성해 줍니다.
3-6. 고급 설정
고급 설정 → 보안의 경우 이후 보안 그룹 생성에 대한 글을 정리하며 EC2, RDS, ElastiCache 각각 다 같이 생성할 예정이니 넘어가줍니다.
다음 백업 항목에 `자동 백업 사용`을 체크 해제 해줍니다. `과금요소`
이후 나머지 설정은 기본 설정으로 두고 다음 버튼을 선택하면 지금까지 설정한 내용을 검토하는 페이지로 넘어가게 됩니다.
설정 한 내용을 검토 후 `생성`버튼을 선택합니다.
ElastiCache의 경우 `Creating`에서 `Available`까지 약간의 대기시간이 있습니다.
기다리는 동안 바로 `보안 그룹`을 형성하도록 하겠습니다.
4. 보안 그룹
보안 그룹 형성 전 이미지와 간단한 설명을 통해 알아보도록 하겠습니다.
- `사용자`는 SSH`prot:22`를 통해 EC2 서버로 접근합니다.
- `EC2`서버는 보안 그룹 ID `ex) sg-12345`를 가지고 있습니다.
- `RDS`와 `ElastiCache` 보안 그룹에서 각각의 포트와 함께 EC2의 보안 그룹 ID를 소스로 설정합니다.
이렇게 형성함으로써 `EC2`에서 `RDS`와 `ElastiCache`에 통신하여 접근할 수 있게 됩니다.
4-1. EC2 보안 그룹 설정
`좌측 상단 검색`을 통해 EC2의 `보안 그룹`으로 이동합니다.
EC2 좌측 메뉴에서 `네트워크 및 보안` → `보안 그룹`을 통해서도 이동이 가능합니다.
앞서 EC2에서 기본 생성된 보안 그룹 이름입니다.
이름 왼쪽 `보안 그룹 ID`를 선택합니다.
`인바운드 규칙` → `인바운드 규칙 편집`을 선택합니다.
`인바운드` : `외부`에서 `내부`로 들어오는 네트워크 트래픽
`아웃바운드` : `내부`에서 `외부로` 나가는 네트워크 트래픽
기본적으로 `SSH`가 추가되어 있습니다. 이후 `터미널을 통해 SSH를 통해 접근` 시 사용됩니다.
필자의 경우 테스트용 SpringBoot 애플리케이션의 포트를 8081로 설정하여 `규칙 추가`를 통해 `사용자 지정 TCP` 유형도 추가하였습니다. (postman을 통해 요청 테스트 할 때 사용)
기본 80 포트를 사용하면 유형에 `HTTP`를 추가하시면 됩니다.
보안상 소스는 `내 IP`로 설정하였습니다. (네트워크 변동 시 인바운드 규칙 편집에서 `내 IP 재선택`하여 재설정해야 함)
`Anywhere-Ipv4`선택 시 모든 IP에서 허용됩니다. (인터넷 프로토콜 버전에 따라 `Anywhere-Ipv6`선택, 대부분 `Ipv4`에 해당)
4-2. RDS 보안 그룹 설정
`EC2` 설정할 때와 마찬가지로 앞서 생성한 `보안 그룹 이름 왼쪽 보안 그룹 ID` 선택 → `인바운드 규칙 편집`을 선택합니다.
유형 `MYSQL/Aurora` 선택 → 소스 `사용자 지정` 선택 → 돋보기 선택해 보안그룹의 기존의 `EC2 보안그룹` 선택
만약 추가할 수 없다는 문구가 나온다면 해당 규칙 삭제 후 규칙 추가를 통해 다시 생성하면 추가됩니다.
이 설정을 통해 `EC2 서버`에서 RDS`MySQL`에 통신할 수 있게 됩니다.
4-3. ElastiCache 보안 그룹 설정
`ElastiCache`의 경우 보안 그룹을 생성하지 않았으니 보안 그룹을 새로 생성합니다.
기존 `보안 그룹` 탭에서 `보안 그룹 생성`을 선택합니다.
`보안 그룹 이름`과 `설명`을 입력합니다. (보안 그룹 생성은 설명 입력 필수)
유형으로 `사용자 지정 TCP` 선택 → 포트 범위 기존 설정 한 포트 입력`6379` → 소스 `사용자 지정` 선택 후 RDS와 마찬가지로 보안 그룹 → EC2 보안 그룹 선택
따로 표시해두지 않은 것은 기본 설정으로 둔 뒤 보안 그룹 생성 버튼을 클릭합니다.
ElastiCache에 대한 보안그룹 생성한 뒤 적용을 위해 `ElastiCache` → `Redis OSS 캐시`에서 생성한 ElastiCache를 선택하여 `작업` → `수정`을 클릭합니다.
다음으로 `보안`탭에서 관리를 선택해 생성한 보안그룹을 추가해 주고 저장합니다.
이렇게 보안 그룹을 설정하여 `EC2`, `RDS`, `ElastiCache`를 연결하였습니다.
이제 터미널로 SSH를 통해 EC2 서버에 접속하여 배포하는 과정을 알아보도록 하겠습니다.
5. 배포
터미널로 SSH를 통해 EC2 서버에 접속하여 직접 git clone을 통해 배포하는 과정에 대해 알아보도록 하겠습니다.
EC2 → 인스턴스 경로로 이동하여 생성한 EC2 인스턴스를 클릭하고 `연결` 버튼을 선택합니다.
다음으로 `SSH 클라이언트`를 선택합니다.
우선 터미널에서 EC2 생성 시 생성한 키 페어 `.pem`파일의 위치로 이동합니다.
$ chmod 400 "본인의파일명.pem"
그 후 이미지에 표시된 해당 명령어를 입력합니다.
이 명령어는 `.pem`파일에 대한 `쓰기 권한`과 `실행 권한`을 제거하고 `읽기 권한`을 설정합니다.
그리고 소유자만 읽기 권한을 가지게 됩니다. 즉, 다른 사용자는 해당 파일에 접근할 수 없으며, 소유자도 읽기만 가능하고 수정이나 실행은 불가능합니다.
이후 `EC2 인스턴스 연결 설명 이미지`에 예: 부분 표시한 내용을 입력하여 EC2 서버에 접속합니다.
$ ssh -i "myKey.pem" yourOS@your-ec2-public-ip
위와 같은 내용이 나왔다면 EC2 서버 접속에 성공입니다.
5-1. Git 설치 확인
먼저 `Git`의 버전을 확인합니다.
$ git --version
필자의 경우 설치되어 있었는데 설치되어 있지 않다면 다음 명령어를 통해 설치합니다.
$ sudo apt-get install git
ubuntu에서는 apt 또는 apt-get을 통해 설치합니다. (yum = Linux 명령어)
5-2. GitHub SSH KEY 생성
다음 명령어를 통해 GitHub에 추가할 SSH KEY를 생성합니다. 본인의 GitHub계정(이메일)을 입력합니다.
입력 후 나오는 항목은 Enter로 넘어가줍니다.
$ cd ~/.ssh
$ ssh-keygen -t rsa -C exemple@exemple.com
이후 아래 명령어를 통해 SSH KEY를 출력합니다.
출력되는 문자는 전체 복사합니다.
$ cat id_rsa.pub
5-3. GitHub SSH KEY 추가
GitHub 접속 후 `우측 상단 프로필`을 클릭 → `Settings` 클릭 → 좌측 메뉴 `SSH and GPG keys` 클릭
이후 `New SSH key`를 클릭해 SSH KEY를 추가해 줍니다.
5-4. Git Clone
본인 GitHub 계정에 SSH KEY 추가가 완료된 후 배포하고자 하는 프로젝트의 `Code` → `SSH`를 선택해 주소를 복사합니다.
복사한 주소를 EC2 서버에서 `git clone`을 통해 프로젝트를 clone 합니다.
$ git clone 복사한 주소
yse 입력하고 완료 후 목록 확인 시 프로젝트가 clone 된 것을 확인할 수 있습니다.
프로젝트 build (jar 파일 생성) 전 직접 실행하여 테스트해보고자 한다면
$ cd 프로젝트 경로
$ ./gradlew bootRun
해당 명령어를 통해 실행할 수 있습니다.
application.yml 설정에 RDS, ElastiCache 설정을 입력해야 합니다.
5-5. RDS, ElastiCache 정보 application.yml 환경변수로 주입
필자의 경우 `profile`로 환경별 설정을 적용하여 `prod`환경에서 build 하고자 합니다.
build 하기 전 환경변수로 입력된 값에 `RDS`, `ElastiCache` 정보를 주입하도록 하겠습니다.
환경변수를 사용하지 않았다면 아래 명령어를 통해 직접 yml 파일을 수정할 수 있습니다.
# yml 경로로 이동
$ vi application.yml
# insert 작업
i
# 작성 후 저장하고 나오기 esc 후
:wq
prod환경은 다음과 같습니다.
spring:
config:
activate:
on-profile: prod
data:
redis:
host: ${REDIS_HOST}
port: ${REDIS_PORT}
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: ${MYSQL_URL}
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
jpa:
hibernate:
ddl-auto: validate
properties:
hibernate:
show_sql: false
format_sql: false
dialect: org.hibernate.dialect.MySQL8Dialect
logging:
level:
org:
hibernate:
sql: warn
type:
descriptor:
sql:
BasicBinder: warn
root: info
server:
port: 8081
테스트를 위해 `ddl-auto`는 `update`로 변경하였습니다
$ cd /home/ubuntu
$ ls -la
$ vi .profile
`cd /home/ubuntu` : 경로로 이동합니다.
`ls -la` : 해당 디렉토리 파일리스트를 조회합니다. (숨김파일 포함)
`vi .profile` : 해당파일 편집
`i`를 입력하여 INSERT모드로 변경 후 맨 아래에 다음과 같이 입력합니다.
export MYSQL_URL=jdbc:mysql://RDS엔드포인트:port/생성한스키마
export DB_USERNAME=생성한 유저네임
export DB_PASSWORD='생성한비밀번호'
export REDIS_HOST=ElastiCache기본엔드포인트
export REDIS_PORT=port
입력이 완료되면 `esc`를 누르고 `:wq`를 입력하여 저장합니다.
$ source ~/.profile
그리고 해당 명령어를 통해 설정한 환경변수를 적용합니다.
추가로 `echo $환경변수명`을 통해 저장된 값을 확인할 수 있습니다.
RDS
`RDS` → `데이터베이스` → `생성한 데이터베이스` 클릭 후 `연결 및 보안`탭에 있는 엔드포인트를 복사하여 붙여 넣습니다.
ElastiCache
`ElastiCache` → `Redis OSS 캐시` → `생성한 Redis` 클릭 후 `클러스터 세부 정보`의 기본 엔드포인트를 복사하여 붙여 넣습니다.
5-6. JAR 파일 생성 (Build)
먼저 EC2 서버에 Java 언어를 설치합니다.
필자의 경우 openJDK 21을 사용하고 있어 21 버전을 설치하도록 하겠습니다.
$ sudo apt install openjdk-21-jdk
$ java --version
설치 후 버전확인을 통해 설치를 확인합니다.
다음으로 프로젝트 폴더로 이동 후 아래 명령어로 프로젝트를 `build`해줍니다.
$ ./gradlew clean build -Dspring.profiles.active=prod -Duser.language=ko -Duser.country=KR
`-Dspring.profiles.active=prod` : prod환경으로 build
트러블 슈팅 1. 언어 설정
build 시 테스트코드에 에러가 생겨 확인해 보니 Validation처리를 default메세지로 처리하였었는데, default메세지는 각 서버의 설정마다 다른 언어로 출력될 수 있음을 확인하였습니다.
이를 `-Duser.language=ko`, `Duser.country=KR` : JVM에서 기본 언어와 국가를 설정하여 해결하였습니다.
저와 같은 상황이 아니라면 해당 명령어는 제외하고 build해도 무관합니다.
트러블 슈팅 2. 멈춤 현상
`프리티어`사용 시 메모리 부족으로 저와 같이 멈춤 현상이 있을 수 있습니다.
서버가 터졌으니 종료 후 잠시 기다려줍니다... (종료 후 재접속해도 접속 안됩니다🥲)
이는 스왑메모리 설정을 통해 해결할 수 있습니다.
스왑 메모리란 실제 메모리가 가득 찼지만 더 많은 메모리를 사용해야 할 경우 디스크 공간을 빌려 메모리를 사용할 수 있는 가상 메모리를 의미합니다.
먼저 EC2 서버에 접속 후 아래 명령어를 차례대로 입력합니다.
$ sudo dd if=/dev/zero of=/swapfile bs=128M count=16 # Swap 파일 생성 및 가상 메모리 크기를 설정
$ sudo chmod 600 /swapfile # Swap 파일 권한 변경
$ sudo mkswap /swapfile # Swap 공간 생성
$ sudo swapon /swapfile # swapfile 스왑 메모리 추가
EC2 인스턴스가 재부팅될 때 스왑 파일을 사용할 수 있도록 설정합니다.
$ sudo vi /etc/fstab
# 아래 내용 INSERT
/swapfile swap swap defaults 0 0
# 입력 후 esc누르고 :wq 입력해 저장 후 종료
스왑메모리 설정을 마친 후 build를 재시도합니다.
빌드 완료 후 build 디렉토리 안에 libs 디렉토리가 생성되고 그 안에 `jar`파일이 생성됩니다.
$ cd ./build/libs
해당 디렉토리로 이동합니다.
5-7. 빌드된 JAR 파일 실행
$ java -jar todo-list-0.0.1-SNAPSHOT.jar
# 백그라운드 실행 시
$ nohup java -jar manymanyUsers-0.0.1-SNAPSHOT.jar &
해당 명령어를 입력하여 생성된 jar파일을 실행합니다.
5-8. API 응답 테스트
`EC2` → `인스턴스` → 생성한 EC2 인스턴스를 선택해 `인스턴스 요약`에서 `퍼블릭 IPv4 DNS` 값을 복사합니다.
이는 API 요청 시 주소 값으로 쓰이게 됩니다.
브라우저를 통해 http를 통한 요청 시 미리 설정해 둔 예외처리 값이 응답되는 모습을 볼 수 있습니다.
보통 `404`에러 페이지가 응답됩니다.
다음으로 postman을 통해 간단한 생성 요청을 해보도록 하겠습니다.
정상적인 응답이 이루어지며 배포과정이 마무리되었습니다.
데이터베이스 내에 잘 저장되었는지 확인해 보도록 하겠습니다.
RDS (MySQL)
$ sudo apt install mysql-server
EC2 내부에서 데이터를 확인하기 위해 MySQL 서버를 설치합니다.
$ sudo mysql -h RDS 엔드포인트 -u 사용자명 -p
명령어 입력 후 비밀번호를 입력해 RDS의 MySQL에 접속합니다.
$ show databases; # 데이터베이스 조회
$ use 데이터베이스이름;
$ show tables; # 테이블 조회
$ select * from 테이블이름;
위 명령어를 차례대로 입력하며 데이터를 조회합니다.
생성한 값이 잘 저장된 모습을 볼 수 있습니다.
ElastiCache (Redis)
$ sudo apt install redis-server
redis server를 설치해 줍니다.
$ redis-cli -h ElastiCache기본엔드포인트 -p 포트번호
$ ping # redis가 작동중이라면 "PONG" 응답
$ keys * # 저장된 key 전체 확인
필자의 경우 세션 스토리지를 Redis로 사용하여 로그인 시 Redis에 세션 Key가 저장되는데 조회 시 잘 저장되는 모습을 볼 수 있습니다.
6. 마무리
AWS의 EC2, RDS, ElastiCache 전체 생성부터 배포까지 A부터 Z까지 알아보았습니다.
이번 포스팅에서는 자동화 배포가 아닌 직접 cli를 통해 배포까지 해보았습니다.
보안그룹에 대한 이해가 충분하다면 AWS에서 서로 간의 통신에 대해서는 크게 어렵지 않을 것이라고 생각됩니다.
한 번의 경험이 앞으로의 개발 시 큰 도움이 되기 때문에 모든 과정을 이 글 안에 모두 담았습니다.
`RDS`나 `ElastiCache`를 사용하지 않는다면 건너뛰고 다음 과정으로 진행할 수 있습니다.
추가로 docker-compose를 사용하여 로컬 테스트환경 구축 시 EC2 내에서 docker-compose작업이 이루어져야 정상적인 배포가 이루어집니다.
'Server' 카테고리의 다른 글
GitHub Actions(CI/CD), AWS S3, CodeDeploy 지속적 통합, 배포 자동화 (2) | 2024.12.02 |
---|---|
인증, 인가 세션(Session)과 토큰(Token)의 장단점과 차이점 (2) | 2024.11.04 |
CSR과 SSR의 개념과 차이점 (feat. SPA, MPA) (4) | 2024.09.11 |
REST API, RESTful API란? (2) | 2024.08.30 |