Post

[AWS] EC2 ๋ฐฐํฌํ•˜๊ธฐ

[AWS] EC2 ๋ฐฐํฌํ•˜๊ธฐ

๐Ÿš€ Spring Boot ์„œ๋ฒ„๋ฅผ AWS EC2์— ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•

1๏ธโƒฃ AWS EC2 ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

  1. AWS ๋กœ๊ทธ์ธ ํ›„ EC2 ์„œ๋น„์Šค๋กœ ์ด๋™
  2. ์ธ์Šคํ„ด์Šค ์‹œ์ž‘ ๋ฒ„ํŠผ ํด๋ฆญ
  3. ์•„๋ž˜ ์„ค์ •์œผ๋กœ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
    • AMI: Ubuntu 22.04 LTS (Amazon Linux๋„ ๊ฐ€๋Šฅ)
    • ์ธ์Šคํ„ด์Šค ์œ ํ˜•: t2.micro (ํ”„๋ฆฌํ‹ฐ์–ด ๊ฐ€๋Šฅ)
    • ์Šคํ† ๋ฆฌ์ง€: ๊ธฐ๋ณธ 8GB SSD
    • ๋ณด์•ˆ ๊ทธ๋ฃน ์„ค์ •
      • 8080 ํฌํŠธ ์—ด๊ธฐ (Custom TCP Rule, 0.0.0.0/0)
      • 22 ํฌํŠธ ์—ด๊ธฐ (SSH ์ ‘์†์šฉ)
  4. ํ‚ค ํŽ˜์–ด (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ํฌํŠธ - ๋‚ด IP
  • Spring ์ ‘๊ทผ : 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 ๊ฐ™์€ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•จ.
This post is licensed under CC BY 4.0 by the author.