Infra

AWS_CLOUD_2nd

elenalee 2025. 8. 23. 11:10

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

build폴더 생성 후 파일만 s3 업로드

 

② S3 버킷 생성 및 웹호스팅 설정

- 권한 설정, 웹호스팅 활성화  

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "TodoListWebHost",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::sesac-lje-s3-todolist-webhost/*"
        }
    ]
}

정적 웹호스팅 설정 후 URL 접속

 

'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