이 글에서 얻는 것

  • 클라우드 기초: VPC, Subnet, Security Group이 왜 필요한지 이해합니다. (집 주소와 대문 열쇠 비유)
  • 서버 구축: EC2(컴퓨터)를 빌리고, RDS(DB)를 설정하여 연결하는 전체 흐름을 봅니다.
  • 배포 운영: nohupsystemd의 차이를 알고, “서버 끄면 앱도 꺼지는” 초보 티를 벗습니다.

1. AWS 네트워크 기본 (VPC)

아마존 클라우드는 거대한 땅입니다. 여기에 “내 땅(VPC)” 부터 울타리를 쳐야 합니다.

graph TD
    subgraph VPC [VPC (10.0.0.0/16)]
        subgraph PublicSubnet [Public Subnet]
            EC2[Web Server (EC2)]
        end
        
        subgraph PrivateSubnet [Private Subnet]
            RDS[(RDS Database)]
        end
    end
    
    Internet((Internet)) <--> IGW[Internet Gateway] <--> EC2
    EC2 <--> RDS
    Internet --x RDS
    
    style PublicSubnet fill:#e3f2fd,stroke:#2196f3
    style PrivateSubnet fill:#ffebee,stroke:#f44336
  • Public Subnet: 인터넷과 통신 가능 (웹 서버용)
  • Private Subnet: 인터넷 직접 통신 불가 (DB용, 보안 강화)

2. EC2와 Security Group (방화벽)

EC2를 만들 때 가장 중요한 건 “누구에게 문을 열어줄 것인가” 입니다.

  • Port 22 (SSH): 내 IP에서만 열어야 함. (전세계 해커들의 먹잇감 1순위)
  • Port 80/443 (HTTP): 0.0.0.0/0 (누구나 접속 가능)
  • Port 8080 (Spring): 보통 0.0.0.0/0 또는 로드밸런서 IP만 허용.

3. Java 앱 배포하기

1) JDK 설치

sudo yum install java-17-amazon-corretto -y
java -version

2) 실행 (초보 ver)

java -jar myapp.jar
# 터미널 끄면 앱도 꺼짐 (망함)

3) 실행 (중수 ver - nohup)

nohup java -jar myapp.jar &
# 백그라운드 실행되지만, 재부팅하면 안 켜짐

4) 실행 (고수 ver - systemd)

/etc/systemd/system/myapp.service 파일을 만듭니다.

[Unit]
Description=My Spring Boot App
After=network.target

[Service]
User=ec2-user
ExecStart=/usr/bin/java -jar /home/ec2-user/myapp.jar
SuccessExitStatus=143
Restart=always

[Install]
WantedBy=multi-user.target

이제 sudo systemctl start myapp 하면 서버가 재부팅되어도 알아서 살아납니다.

4. RDS 연결 꿀팁

  • 절대 Public Access 켜지 마세요: DB 해킹당합니다.
  • Security Group chaining:
    1. SG-Web: EC2에 적용.
    2. SG-DB: RDS에 적용. 인바운드 규칙 소스를 SG-Web으로 설정.
    • 👉 “웹 서버 그룹 딱지를 단 녀석들만 DB에 들어올 수 있다"는 뜻. IP가 바뀌어도 안전합니다.

요약

  1. VPC: 내 땅을 먼저 확보해라.
  2. 보안 그룹: 포트는 필요한 만큼만 열어라. (특히 22번 주의)
  3. RDS: Private Subnet에 숨기고, EC2를 통해서만 접근하게 해라.