1. 확장성 및 고가용성
1) 기본 개념
(1) 확장성
- 시스템의 용량을 필요에 따라 확장 ( Scale Up, Scale Out )
- Scale Up : 데이터베이스 등 분산이 불가능한 시스템 적용 ( RDS, Elastic Cache )
- Scale Out : 분산 시스템 구성이 유리 ( 로드밸런서 필요 )
(2) 고가용성
- 시스템이 작동 가능한 상태를 유지 (수평확장과 함께 사용)
- 클라우드에서는 인스턴스를 다양한 AZ에 분산하여 서비스가 중단되지 않도록 함
(3) 부하분산 ( Load Balancing )
- 작업 부하를 고르게 배분 ( 과부하 방지)
2) ELB ( Elastic LoadBalancer )
- 트래픽 분배 ( ASG와 결합, 트래픽에 대응 )
- HTTP, HTTPS, TC, SSL의 다양한 프로토콜 지원, 세션 지원
- 모니터 ( 로그 및 매트릭 )
(1) 구성 요소
① LoadBalancer - 요청을 분배, 서버의 응답을 클라이언트에 반환
② 타켓 그룹 - 트래픽 전달 대상의 그룹, EC2/Lambda함수등을 그루핑한 개념
( Health Check로 모니터 후 정상 상태의 리소스로 트래픽 전달 )
③ 리스너 - 클라이언트 요청을 수신, Target Group으로 라우팅
(80, 443에 대한 리스너 정의해서 로드밸런스가 처리하도록 설정)
(2) 처리 절차
클라이언트가 ELB로 요청(DNS 이름을 사용) - 리스너가 수신( 라우팅 규칙에 따라 타켓그룹에 라우팅, 상태가 정상인 target) - 타겟이 요청처리 - 응답을 반환
** Cross Zone 로드 밸런서
로드 밸런서가 로드 밸런서에게 부하 분산가능 ( 전 영역에 걸쳐 인스턴스에 고르게 Load 분산 )

인스턴스에 고르게 부하 분산
(3) LoadBalancer ( AWS ) 종류
- ALB(Application LB), NLB(Network LB, 속도가 빠른편 ), GWLB( 방화벽,어플라이언스등 대상)
** ALB - path 기반으로 라우팅 혹은 query string기반으로 라우팅 가능

3) ASG ( Auto Scaling Group )
- 자동 확장/축소, 고가용성 유지, 인스턴스의 최소/최대 지정가능, Health Check
(1) 구성 설정
① LaunchTemplate - 인스턴스를 생성하는데 필요한 기본설정(인스턴스 유형, AMI, 키페어, 보안그룹, EBS등)
② Scaling 설정 - 기본 갯수 설정 (최소/최대), 스케일링 조건 ( CPU사용량, 네트웤 트래픽 기준설정 등 )
( 동적인 스케일링 - 부하에 따라 자동 수행, 예정된 스케일링 - 특정 시간대에 조정 등)
③ 가용영역 분산 - 여러 가용 영역에 배치하여 고가용성
④ 상태 검사 - 주기적인 상태확인 후 자동교체 결정 ( EC2, ELB상태검사 )
⑤ 알림/모니터링 - CloudWatch ( 확장/축소 알람, CPU, 네트워크 트래픽 지표 )
⑥ 종료 정책 - 축소시 종료할 인스턴스를 결정하는 정책
4 ) 실습
(1) 리소스 생성
- 특정 VPC내에 웹서버 2개 (EC2, LoadBalancer에 연결 예정)

(2) 보안그룹 생성 (VPC내)
(3) Target Group 및 ALB 생성 ( 80포트 )
- Target Gproup에 Instance연결
- ALB 생성(Listen) 및 연결

(4) 경로에 따른 연결 변경
① Target Gproup에 추가 및 인스턴스 연결 (api-server-tg)
② ALB의 경로 ('/api')의 규칙 추가 및 대상그룹 연동
- 우선 순위가 낮은 순서대로 평가

- Resource Map

(5) AutoScaling Group
① 시작 template 구성
- AGS의 경우 scaling을 위한 기본 template 필요
- 이미지 생성 및 시작 template 반영 ( 네트워크/vpc쪽은 미설정 - asg생성시에 설정 )
② asg생성
- 용량, 최소/최대, 상태확인 기능 추가 등 ( 상태확인 유예기간 통상 2분 )

③ ASG설정에 따라 인스턴스 생성

실행중인 인스턴스 접속

로드밸런서로 접속

④ ASG설정에서 인스턴스 용량등 옵션 변경

- 4개로 용량 변경시 autoscale

(6) 동적 scaling ( Traffic등 여러가지 구동조건에 맞게 AutoScale )
- automatic scaling 탭

- 정책 구성 (CPU 10% 이면 Auto Scale ) 후 스트레스 상황 발생
( sudo apt install -y stress 설치 후 부하 주는 명령어 구동 )

2. Backend와 DB구성 배포 실습
1) Infra 기본 구성
- VPC 구성 후 private subnet과 public subnet을 설정
- backend-server는 public영역 (public IP활성화)
- db-server는 private영역 ( EICE와 NAT로 입출력 )

(1) Backend server
- Inbound Traffic : 22(SSH) , 8080(TCP, 프론트에서 Spring접근 ) 허용
- Outbound Traffic : DB서버의 보안 그룹 허용 ( VPC 내부 접속 )

(2) DB server
① Instance 조작을 위해 EICE 활용
- Endpoint 생성, Private subnet의 보안그룹 및 DB 보안그룹 적용
- Inbound Traffic : 22번(SSH), 8080(TCP, Backend-server접근) 허용

② 외부 프로그램 적용 ( Routing Table에 NAT Gateway 연결하여 접속 )
- NAT Gateway생성 ( Public Subnet에 생성 )
- Private Subnet의 Routing Table 편집 ( NAT 추가하여 외부 접속 설정 )

- Outbound Traffic : NAT를 경유한 접속 전체허용 ( DB 프로그램 다운로드를 위해 필요함 )

2) DB서버 구성 및 배포
(1) SQL설치
sudo apt update
sudo apt install mysql-server -y # mySQL 설치
sudo systemctl status mysql # mySQL
mysql.service - MySQL Community Server
Loaded: loaded (/usr/lib/systemd/system/mysql.service; enabled; preset: enabled)
Active: active (running) since Fri 2025-08-22 07:31:05 UTC; 4min 4s ago
Process: 2871 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID: 2887 (mysqld)
Status: "Server is operational"
Tasks: 37 (limit: 4515)
Memory: 363.7M (peak: 377.9M)
CPU: 2.607s
CGroup: /system.slice/mysql.service
└─2887 /usr/sbin/mysqld
....
(2) DB기본 설정
# local에서만 접속할수 있는 설정변경, 파일내 구문수정 (127.0.0.1 ---> 0.0.0.0 )후 restart
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
sudo systemctl restart mysql.service
#sudo로 접속
sudo mysql -u root -p
mysql> CREATE USER 'todo_user'@'%' IDENTIFIED BY 'todo_password'; #사용자, 패스워드 생성
mysql> GRANT ALL PRIVILEGES ON `todolist`.* TO 'todo_user'@'%'; #todolist의 모든 권한 부여
mysql> create database todolist; #관련 database설정
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| todolist |
+--------------------+
3) Backend서버 구성 및 배포
(1) application.yaml의 DB 접속정보 반영 ( host, user, password )
spring:
datasource:
url: jdbc:mysql://${DB_HOST:[internal_ip]}:3306/${MYSQL_DATABASE:todolist}
username: ${MYSQL_USER:todo_user}
password: ${MYSQL_PASSWORD:todo_password}
(2) DB연결 확인
# 깃 설치 및 소스코드 다운로드
sudo apt update
sudo apt install git -y
git --version
git clone "https://...."
# DB 확인을 위해 client생성
sudo apt install mysql-client
#DB접속 및 테이블 확인(client가 비밀번호 확인요청)
mysql -h [DB서버 IP] -u todo_user -p
(3) 벡엔드 소스코드 빌드 및 실행
sudo apt update
sudo apt install git -y
git --version
# DB 확인 및 사용자 생성
sudo apt install mysql-client
gradle wrapper --gradle-version 8.10.1 #fail됨
backend$ gradle --version #gradle version재확인 (Gradle 4.4.1로 확인)
./gradlew clean build #파일이 없음
curl -s "https://get.sdkman.io" | bash #SKMAN 설치, 자바버전 교체 (실패, zip 필요)
sudo apt install zip
curl -s "https://get.sdkman.io" | bash #SKMAN 설치 재시도
source "$HOME/.sdkman/bin/sdkman-init.sh" #SKMAN활성화,현재의쉘 환경에서 지정스트립트 수행(source)
# Gradle Wrapper : Gradle 미설치시 프로젝트 내 스크립트(gradlew, gradlew.bat)와 설정 파일로 Gradle을 실행
gradle wrapper --gradle-version 8.10.1 # gradlew, gradle/wrapper/gradle-wrapper.jar생성
# Wrapper생성 후 gradle실행
ls #gradle 폴더확인
HELP.md build.gradle gradle gradlew gradlew.bat helm settings.gradle src
# 빌드 수행 및 gradlew 확인
./gradlew clean bootjar
ls # build 폴더 확인
HELP.md build build.gradle gradle gradlew gradlew.bat helm settings.gradle src
cd build/libs
ls # jar확인
todo-v1-0.0.1-SNAPSHOT.jar
# JAR파일 실행
java -jar todo-v1-0.0.1-SNAPSHOT.jar
** 확인

4. 스토리지
-EBS / EFS/ S3

1) EBS (Elastic Block Store)
- EC2 생성 시 연결되는 블록 스토리지 ( Root Volume )
- 운영체제, 어플리케이션을 위한 블록 스토리지
- EC2 종료 시 자동 삭제 ( 영구적인 데이터 저장은 설정필요 )
- 네트워드 드라이브 Mount 방식
- 고정 용량, 가용영역에 종속( 동일 region내 다른 AZ연결 불가 )
- EBS 볼륨은 하나의 인스턴스에만 연결 ( dettach가능, 연결 종료 후 다른 EC2 연결 가능 )
- 스냅샷 (EBS볼륨을 백업하여 S3에 저장, 증분 백업)으로 데이터 이동가능
- 종류
- gp3(범용 SSD,일정 성능.저렴한 비용)
- io2(프로비져닝된 IOPS SSD, 고성능/IO작업) IOPS(Input Output per second),
- st1 (throughput최적화된 HDD) 대량의 읽기/쓰기, 저렴한 비용/대량의 데이터 저장
- sc1 (저가용 HDD) 대용량 데이터 저장, 자주 access하지 않는 데이터 (백업, 아카이브)
2) EFS ( Elastic File System)
- 여러 EC2 에서 동시에 접근가능한 공유 파일 스토리지
- 웹서버 클러스터, 컨테이너 환경, 파일 공유(저장소), 로그관리, 백업 등
- 네트워드 드라이브 Mount 방식 ( 여러 인스턴스에 마운트 가능 )
- 완전 관리형, 자동 확장, 고성능, 다중 AZ에 걸친 고가용성
예) 웹서비스 ( config-server의 repository, log정보, 이미지 파일 등 )
3) S3
- 객체 스토리지 서비스 ( 버킷, 객체 단위 서비스 - 비정형데이터 저장/관리 )
- 내구성 가용성 높음, HTTP 입출력 ( REST API로 명령 전달 )
- 정적인 서비스 ( 콘텐츠를 올리면 웹서버 도움없이 웹 서비스 가능 )
버킷
- 고유한 이름 (데이터를 저장하는 컨테이너, 객체를 저장 - 파일 )
- 키 (경로), standard/s3 intelligent-Tiering/s3 standard-IA, s3-glaicer)
- 백업 및 아카이브, 정적 웹사이트 호스팅( CloudFront등의 CDN과 사용시 응답 속도 빠름), 로그 저장 및 데이터 분석(빅데이터 플랫홈과 연동한 데이터처리), 미디어 파일 저장 (이미지/동영상등 스트리밍에 적합)
버저닝
- 파일들을 버전으로 구분 가능 , 버킷 레벨에서 설정
- 복제 ( 다른 region으로 가능 , 비동기 )
- 람다 등과 연동하여 비동기 서비스 수행 (s3 서비스의 접근/수행 권한 설정 필요)
예) 이벤트 알림, 섬네일 생성, 이미지 크기변경등의 작업 등
4) EC2와 EBS 연동 실습
(1) EBS생성 및 연결
- 가용영역에 주의하여 생성


- EC2와 EBS 볼륨 연결



(2) Volume Mount ( EC2 마운트 )
① 기본 마운트 : 파일 시스템 구성 ⇨⇨ mount ⇨⇨ 파일 생성 (권한설정 필요)
재부팅시 unmount됨 ( 다시 mount하여 복구 필요 )
sudo lsblk # 파티션, root volume, 추가 volume
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 27.6M 1 loop /snap/amazon-ssm-agent/11797
loop1 7:1 0 73.9M 1 loop /snap/core22/2045
loop2 7:2 0 49.3M 1 loop /snap/snapd/24792
nvme0n1 259:0 0 8G 0 disk
├─nvme0n1p1 259:1 0 7G 0 part /
├─nvme0n1p14 259:2 0 4M 0 part
├─nvme0n1p15 259:3 0 106M 0 part /boot/efi
└─nvme0n1p16 259:4 0 913M 0 part /boot
nvme1n1 259:5 0 10G 0 disk # 추가 연결된 Volume (이름이 변경될수 있음)
# ext4로 파일 시스템 생성
sudo mkfs.ext4 /dev/nvme1n1
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 2621440 4k blocks and 655360 inodes
Filesystem UUID: 1bb37182-51af-442a-8eb5-be313b1a21f7
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 6.8G 1.8G 5.0G 27% /
tmpfs 458M 0 458M 0% /dev/shm
tmpfs 183M 888K 182M 1% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
efivarfs 128K 3.6K 120K 3% /sys/firmware/efi/efivars
/dev/nvme0n1p16 881M 87M 733M 11% /boot
/dev/nvme0n1p15 105M 6.2M 99M 6% /boot/efi
tmpfs 92M 12K 92M 1% /run/user/1000
#수동으로 경로생성 (마운트 포인트)
sudo mkdir /data
sudo mount /dev/nvme1n1 /data
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 27.6M 1 loop /snap/amazon-ssm-agent/11797
loop1 7:1 0 73.9M 1 loop /snap/core22/2045
loop2 7:2 0 49.3M 1 loop /snap/snapd/24792
nvme0n1 259:0 0 8G 0 disk
├─nvme0n1p1 259:1 0 7G 0 part /
├─nvme0n1p14 259:2 0 4M 0 part
├─nvme0n1p15 259:3 0 106M 0 part /boot/efi
└─nvme0n1p16 259:4 0 913M 0 part /boot
nvme1n1 259:5 0 10G 0 disk /data
cd data
data$ echo "Hello World!" > test.txt #출력권한 문제
-bash: test.txt: Permission denied
ls -al #권한 확인
total 88
....
drwxr-xr-x 3 root root 4096 Aug 25 02:47 data #소유자만 쓰기가능
#폴더의 소유자/그룹을 ubuntu(현재사용자)로 변경
ubuntu@ip-10-0-1-111:/$ sudo chown ubuntu:ubuntu /data
ubuntu@ip-10-0-1-111:/$ cd data
ubuntu@ip-10-0-1-111:/data$ echo "Hello World!" > test.txt
ubuntu@ip-10-0-1-111:/data$ cat test.txt
Hello World!
② 자동 마운트
- 볼륨 ID확인 ⇨⇨ etc/fstab(파일 시스템 설정)접근 ⇨⇨ fileSystemId등록 (사전 백업, 안전성확보)
#ID확인 (전체 blockId)
sudo blkid
/dev/nvme0n1p16: LABEL="BOOT" UUID="fc01183f-27c0-4f69-b1c0-fb1c01e8fe57" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="3482d197-2f8f-4c71-9e76-3cb32dd1a21a"
/dev/nvme0n1p1: LABEL="cloudimg-rootfs" UUID="41a438f9-9b73-40e9-9093-3c0a3ce03d5c" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="d8b02072-b013-48de-b7a8-331276413234"
/dev/nvme0n1p15: LABEL_FATBOOT="UEFI" LABEL="UEFI" UUID="0007-49CF" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="0b4e2140-a207-48da-adb9-1c025ada09fe"
/dev/nvme1n1: UUID="1bb37182-51af-442a-8eb5-be313b1a21f7" BLOCK_SIZE="4096" TYPE="ext4"
/dev/loop1: BLOCK_SIZE="131072" TYPE="squashfs"
/dev/nvme0n1p14: PARTUUID="240c700b-ec27-4f72-8c51-c680b2fcf9bd"
/dev/loop2: BLOCK_SIZE="131072" TYPE="squashfs"
/dev/loop0: BLOCK_SIZE="131072" TYPE="squashfs"
sudo blkid /dev/nvme1n1 (특정 EBS의 ID확인)
/dev/nvme1n1: UUID="1bb37182-51af-442a-8eb5-be313b1a21f7" BLOCK_SIZE="4096" TYPE="ext4"
#리눅스 부팅시 읽어들이는 모든 파일 ( /etc/fstab )
cat /etc/fstab
LABEL=cloudimg-rootfs / ext4 discard,commit=30,errors=remount-ro 0 1
LABEL=BOOT /boot ext4 defaults 0 2
LABEL=UEFI /boot/efi vfat umask=0077 0 1
#백업 (update전에 안전성 확보)
sudo cp /etc/fstab /etc/fstab.backup
ubuntu@ip-10-0-1-111:/data$ ls -la /etc/fstab
-rw-r--r-- 1 root root 146 Aug 21 10:15 /etc/fstab
ubuntu@ip-10-0-1-111:/data$ sudo nano /etc/fstab
#fstab 수정 ( 파일 시스템 테이블에 EBS 자동 마운트 설정 추가 )
LABEL=cloudimg-rootfs / ext4 discard,commit=30,errors=remount-ro 0 1
LABEL=BOOT /boot ext4 defaults 0 2
LABEL=UEFI /boot/efi vfat umask=0077 0 1
UUID="1bb37182-51af-442a-8eb5-be313b1a21f7" /data ext4 defaults,nofail 0 2
#재부팅 후 확인
#unmount
sudo umount /data
#볼륨 분리한후 다른 인스턴스에 연결 (이미 파일 시스템으로 구성되어져 있어 바로 마운트)
cd/
sudo mount /dev/nvme1n1 /data
mount: /data: /dev/nvme1n1 already mounted on /data.
dmesg(1) may have more information after failed mount system call.
ubuntu@ip-10-0-1-10:/$ ls
bin boot dev home lib.usr-is-merged lost+found mnt proc run sbin.usr-is-merged srv tmp var
bin.usr-is-merged data etc lib lib64 media opt root sbin snap sys usr
ubuntu@ip-10-0-1-10:/$ cd data
ubuntu@ip-10-0-1-10:/data$ ls
lost+found test.txt
③ 스냅샷 생성 ( 이후 EBS의 가용 영역 재설정가능 )

5) S3 실습
(1) private으로 사용할 버킷
** 비 공개시 pre-signed-url로 공유가능
(특정 사용자에게 정해진 시간동안 접속가능한 임시 URL)


(2) public으로 공개하는 버킷 만들기
① 객체 소유권
- ACL비활성화 ( 객체소유권 버킷 주인)
- ACL활성화 (파일 업로드 한 사람에게도 권한)
② 퍼블릭 엑세스 설정 ( 해제하면 외부 공개)
③ 버킷버전관리 (버전관리 시 깃처럼 관리, 로그나 이전 버전 처리가능, 활성화 일반적)
- 기타 기본 암호화 외 사항은 default로 설정하는 경우가 많음
(3) 정적 웹호스팅
- HTML 업로드
- 정책편집 : s3의 버킷의 파일에 접근하는 권한 설정 ("*")
- 버킷 정책 편집 : 퍼블릭 엑세스 차단설정 해제
- 권한 하단에서 정적 웹호스팅 설정
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::[my_bucket_name]/s3upload.html"
}
]
}

3. EBS, S3 관련 실습
- React Frontend S3배포
- SpringBoot Backend EC2배포
- MySQL EC2 배포 ( 새로운 EBS Volume으로 데이터 저장/유지 )
1) Backend 및 DB
(1) DB (EBS Volume, 영구 Mount )
① 볼륨 생성 및 EC2생성 연결
② mySQL설치 및 Database/사용자 생성
③ /var/lib/mysql에 볼륨 마운트
④ /etc/fstab에 마운트 등록 ( FileSystem에 Id등록 )
# MySQL설치
sudo apt update
sudo apt install mysql-server -y # mySQL 설치
sudo systemctl status mysql # mySQL
# 외부 접속허용 (bind에 내부주소나 전부 허용설정 0.0.0.0) 및 재시작
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
sudo systemctl restart mysql.service
# 볼륨 마운트 및 mySQL의 데이터를 권한과 함께 복사
sudo mkdir -p /mnt/ebs_data
sudo mount /dev/nvme1n1 /mnt/ebs_data
sudo rsync -av /var/lib/mysql/ /mnt/ebs_data/ (-archive-verbose)
sudo mv /var/lib/mysql /var/lib/mysql_old # 데이터가 든 폴더를 이름을 바꾸어 저장(백업)
sudo mkdir /var/lib/mysql
sudo mount /dev/nvme1n1 /var/lib/mysql
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
sudo systemctl restart mysql
sudo nano /etc/fstab #UUID와 마운트주소, defaults,fail등 추가
#User, Table생성
sudo mysql -u root -p
mysql> CREATE USER 'todo_user'@'%' IDENTIFIED BY 'todo_password'; #사용자, 패스워드 생성
mysql> GRANT ALL PRIVILEGES ON `todolist`.* TO 'todo_user'@'%'; #todolist의 모든 권한 부여
mysql> create database todolist; #관련 database설정
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| todolist |
+--------------------+
(2) Backend
- git, jdk, gradle 설치
① 프로젝트 폴더에 git레포지토리 복사
② DB접속 정보변경 ( application.yml에 Database/사용자 반영 ) 및 연결확인
③ 프론트엔드 CORS허용 정보 변경 (S3의 url)
④ 빌드(SKMAN이용)와 실행
- gradle설치 후 wrapper를 만들고 ./gradlew bootRun
- 서비스로 등록 ( sudo nano /etc/systemd/system에 등록 후 demon-reload )
sudo apt update
sudo mkdir -p /opt/todolist #app실행용 폴더
sudo chown ubuntu:ubuntu /opt/todolist #폴더권한 (ubuntu)
cd /opt/todolist
git clone "프로젝트 레포지토리"
nano application.yml #resource로 이동하여 관련 db ip, 테이블명, 접속패스워드와 id수정
#빌드
chmod +x ./gradlew #권한부여
sudo apt install openjdk-17-jdk //OpenJDK 17 JDK 설치
./gradlew clean build #파일 오류
Error: Could not find or load main class org.gradle.wrapper.GradleWrapperMain
Caused by: java.lang.ClassNotFoundException: org.gradle.wrapper.GradleWrapperMain
#DB연결 확인
# DB 확인을 위해 client생성
sudo apt install mysql-client
#DB접속 및 테이블 확인(client가 비밀번호 확인요청)
mysql -h [DB서버 IP] -u todo_user -p
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
| todolist |
+--------------------+
3 rows in set (0.01 sec)
#front cors허용 , application.yml에 s3주소 반영
#SKMAN설치 (gradle설치 시 오류가 나서 skman으로 설치)
sudo apt install zip
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk install gradle
Installing: gradle 9.0.0
Done installing!
ls #gradle확인
Dockerfile HELP.md build.gradle gradle gradlew gradlew.bat settings.gradle src
gradle wrapper #복구
#빌드
./gradlew build
#실행 (빌드파일 실행)
todo-list/backend/build/libs$ java -jar todo-v1-0.0.1-SNAPSHOT.jar
java -jar your-app.jar

** 통신 문제 시, 보안 규칙 이외에도 NACL (Network Access Control List) 주의
- AWS VPC(가상 네트워크)의 서브넷(Subnet)을 위한 방화벽 상태 저장
- 인바운드 규칙을 허용했더라도 아웃바운드 별도 적용 (Stateless)
(3) frontend
① 빌드
- 백엔드 엔드포인트 반영하여 빌드
VITE_API_URL=http://[backend_url]:8080 npm run build

② S3 버킷 생성 및 웹호스팅 설정
- 권한 설정, 웹호스팅 활성화
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "TodoListWebHost",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::sesac-lje-s3-todolist-webhost/*"
}
]
}


'Infra' 카테고리의 다른 글
| AWS_Cloud_6th (0) | 2025.09.08 |
|---|---|
| AWS_Cloud_5th (0) | 2025.09.04 |
| AWS_CLOUD_1st (4) | 2025.08.22 |
| Spring Cloud MSA_1 (0) | 2025.08.07 |