[AWS] EC2 ๋ฐฐํฌํ๊ธฐ
๐ Spring Boot ์๋ฒ๋ฅผ AWS EC2์ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ
1๏ธโฃ AWS EC2 ์ธ์คํด์ค ์์ฑ
- AWS ๋ก๊ทธ์ธ ํ EC2 ์๋น์ค๋ก ์ด๋
- ์ธ์คํด์ค ์์ ๋ฒํผ ํด๋ฆญ
- ์๋ ์ค์ ์ผ๋ก ์ธ์คํด์ค ์์ฑ
- AMI: Ubuntu 22.04 LTS (Amazon Linux๋ ๊ฐ๋ฅ)
- ์ธ์คํด์ค ์ ํ: t2.micro (ํ๋ฆฌํฐ์ด ๊ฐ๋ฅ)
- ์คํ ๋ฆฌ์ง: ๊ธฐ๋ณธ 8GB SSD
- ๋ณด์ ๊ทธ๋ฃน ์ค์
- 8080 ํฌํธ ์ด๊ธฐ (Custom TCP Rule, 0.0.0.0/0)
- 22 ํฌํธ ์ด๊ธฐ (SSH ์ ์์ฉ)
- ํค ํ์ด (pem ํ์ผ) ๋ค์ด๋ก๋
- ๋์ค์ EC2์ ์ ์ํ ๋ ํ์ํ๋ ๋ณด๊ด
2๏ธโฃ EC2 ์๋ฒ์ SSH ์ ์
๋ค์ด๋ก๋ํ .pem ํ์ผ์ ์ฌ์ฉํ์ฌ EC2์ ์ ์
1
2
chmod 400 your-key.pem # ํค ํ์ผ ๊ถํ ์ค์
ssh -i your-key.pem ubuntu@your-ec2-public-ip
3๏ธโฃ Java & ํ์ํ ํจํค์ง ์ค์น
EC2์์ Java 17 ์ค์น (Spring Boot 3.x ๊ธฐ์ค)
1
2
3
sudo apt update && sudo apt upgrade -y
sudo apt install openjdk-17-jdk -y
java -version # ์ค์น ํ์ธ
4๏ธโฃ Spring Boot ํ๋ก์ ํธ ๋น๋
1) ### ๋ก์ปฌ์์ Jar ํ์ผ ์์ฑ EC2์์ ์คํํ .jar ํ์ผ์ ๋น๋ bash ./mvnw clean package -DskipTests # Maven ์ฌ์ฉ ์ # ๋๋ ./gradlew bootJar # Gradle ์ฌ์ฉ ์
๐ target/ ๋๋ build/libs/ ํด๋์ your-app.jar ํ์ผ์ด ์์ฑ๋จ.
2) ### EC2๋ก ์ ์ก ๋ก์ปฌ์์ EC2๋ก .jar ํ์ผ ์ ์ก bash scp -i your-key.pem target/your-app.jar ubuntu@your-ec2-public-ip:~
5๏ธโฃ Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์คํ
EC2์์ .jar ํ์ผ ์คํ
1
nohup java -jar your-app.jar > log.txt 2>&1 &
- โ nohup ์ฌ์ฉํ๋ฉด ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ๋จ
- โ ๋ก๊ทธ๋ log.txt์์ ํ์ธ ๊ฐ๋ฅ
์ฑ์ด ์คํ๋๋์ง ํ์ธ
1
ps aux | grep java # ์คํ ์ค์ธ Java ํ๋ก์ธ์ค ํ์ธ
6๏ธโฃ ๋ฐฉํ๋ฒฝ ์ค์ & API ํ ์คํธ
1) EC2 ๋ณด์ ๊ทธ๋ฃน์์ 8080 ํฌํธ ์ด์๋์ง ํ์ธ * AWS ์ฝ์ โ EC2 โ ๋ณด์ ๊ทธ๋ฃน โ ์ธ๋ฐ์ด๋ ๊ท์น โ 8080 ์ด๋ ค ์๋์ง ํ์ธ 2) Spring Boot ์๋ฒ ์ ์ ํ์ธ ๋ก์ปฌ์์ ์๋ ๋ช ๋ น ์คํ
1
curl http://your-ec2-public-ip:8080/api/videos/BTS
๐ ์ ์์ ์ผ๋ก JSON ๋ฐ์ดํฐ๊ฐ ๋ฐํ๋๋ฉด ์ฑ๊ณต!
7๏ธโฃ Spring Boot ์๋ฒ๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์๋ ์คํ
์ง๊ธ์ nohup์ผ๋ก ์คํํ์ง๋ง, EC2๊ฐ ์ฌ๋ถํ ๋๋ฉด ์๋ฒ๊ฐ ๊บผ์ ธ. ์๋ ์คํ์ ์ํด systemd ์๋น์ค ๋ฑ๋กํ๋ฉด ์ข๋ค
1) ์๋น์ค ํ์ผ ์์ฑ bash sudo nano /etc/systemd/system/daebak.service
๋ค์ ๋ด์ฉ ์ถ๊ฐ ```ini [Unit] Description=Spring Boot DaeBak Server After=network.target
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[Service]
User=ubuntu
WorkingDirectory=/home/ubuntu
ExecStart=/usr/bin/java -jar /home/ubuntu/your-app.jar
SuccessExitStatus=143
Restart=always
RestartSec=5
StandardOutput=append:/home/ubuntu/app.log
StandardError=append:/home/ubuntu/error.log
[Install]
WantedBy=multi-user.target
``` 2) ์๋น์ค ๋ฑ๋ก & ์คํ
```bash
sudo systemctl daemon-reload
sudo systemctl enable daebak
sudo systemctl start daebak
sudo systemctl status daebak # ์คํ ํ์ธ
``` ์ด์ EC2๋ฅผ ์ฌ๋ถํ
ํด๋ ์๋ฒ๊ฐ ์๋์ผ๋ก ์คํ๋จ! ๐
8๏ธโฃ ๊ณ ์ IP & ๋๋ฉ์ธ ์ฐ๊ฒฐ (์ ํ)
- ๊ณ ์ IP ์ค์ : Elastic IP ํ ๋น (AWS ์ฝ์์์ ๊ฐ๋ฅ)
- ๋๋ฉ์ธ ์ฐ๊ฒฐ: Route 53์์ ๋๋ฉ์ธ ๊ตฌ๋งค ํ Elastic IP ์ฐ๊ฒฐ
- ๋ฌด๋ฃ ๋๋ฉ์ธ: Cloudflare๋ฅผ ์ฌ์ฉํด ์๋ธ๋๋ฉ์ธ ์ ์ฉ ๊ฐ๋ฅ
EC2 ์์ฑ ์ - ๋ณด์๊ทธ๋ฃน
์ธ๋ฐ์ด๋ ๊ท์น
- ์ธ๋ถ โ EC2 ์ธ์คํด์ค๋ก ๋ค์ด์ค๋ ํธ๋ํฝ์ ํ์ฉํ๋ ๊ท์น.
- ์์
- SSH (22๋ฒ ํฌํธ): ๋ด PC์์ EC2์ ์ ์ํ๊ธฐ ์ํด ํ์ฉ (๋ด IP๋ง ํ์ฉํ๋ ๊ฒ ์์ ํจ)
- HTTP (80๋ฒ ํฌํธ): ์น์ฌ์ดํธ ์์ฒญ์ ๋ฐ๊ธฐ ์ํด ํ์ฉ
- HTTPS (443๋ฒ ํฌํธ): SSL/TLS๋ฅผ ํตํ ๋ณด์ ์์ฒญ์ ๋ฐ๊ธฐ ์ํด ํ์ฉ
- Spring Boot API (8080๋ฒ ํฌํธ): ํด๋ผ์ด์ธํธ(์: Swift ์ฑ)๊ฐ API๋ฅผ ํธ์ถํ๊ธฐ ์ํด ํ์
โ ์ฆ, โ์๋ฒ๋ก ๋ค์ด์ค๋ ์์ฒญ์ ํ์ฉํ๋ ํฌํธโ๋ฅผ ์ค์ ํ๋ ๊ฒ.
์์๋ฐ์ด๋ ๊ท์น
- EC2 ์ธ์คํด์ค โ ์ธ๋ถ๋ก ๋๊ฐ๋ ํธ๋ํฝ์ ํ์ฉํ๋ ๊ท์น.
- ๊ธฐ๋ณธ์ ์ผ๋ก AWS EC2๋ ์์๋ฐ์ด๋ ํธ๋ํฝ์ ๋ชจ๋ ํ์ฉํ์ง๋ง, ํน์ ํ๊ฒฝ์์๋ ํ์ํ ์๋ ์์.
- ์์
- ์ธํฐ๋ท ์ก์ธ์ค ํ์ฉ (80, 443): ์๋ฒ์์ ์ธ๋ถ API ํธ์ถ ๊ฐ๋ฅํ๋๋ก ํจ.
- DB ์ฐ๊ฒฐ (3306): RDS(MySQL)์ ์ฐ๊ฒฐํ ๋ ํ์.
- S3 ์ ๊ทผ (443): EC2์์ S3 ํ์ผ์ ์ ๋ก๋/๋ค์ด๋ก๋ํ ๋ ํ์.
โ ์ฆ, โ์๋ฒ์์ ์ธ๋ถ๋ก ๋๊ฐ๋ ์์ฒญ์ ํ์ฉํ๋ ํฌํธโ๋ฅผ ์ค์ ํ๋ ๊ฒ.
๐ฅ EC2์์ Spring Boot API ์ด์ํ ๋ ํ์ํ ๋ณด์ ๊ทธ๋ฃน ์ค์
โ ์ธ๋ฐ์ด๋ ๊ท์น
EC2์ ์์ฉ
: SSH - TCP - 22ํฌํธ - ๋ด IPSpring ์ ๊ทผ
: HTTP - TCP - 8080ํฌํธ - 0.0.0.0/0(๋ชจ๋ ํธ๋ํฝ)
โ ์์๋ฐ์ด๋ ๊ท์น (๊ธฐ๋ณธ ์ค์ )
- ๋ชจ๋ ํธ๋ํฝ ํ์ฉ (0.0.0.0/0)
โ ๏ธ ์ฃผ์
- SSH(22)๋ ๋ฐ๋์ โ๋ด IPโ๋ง ํ์ฉํด์ผ ๋ณด์์ด ๊ฐํด์ง. (0.0.0.0/0์ ์ ๋ ๊ธ์ง โ)
- 8080 ๋์ 80 ํฌํธ์์ API๋ฅผ ์ ๊ณตํ๊ณ ์ถ์ผ๋ฉด, Nginx ๊ฐ์ ๋ฆฌ๋ฒ์ค ํ๋ก์๋ฅผ ์ค์ ํด์ผ ํจ.