๐Ÿš€ AWS๋ฅผ ํ™œ์šฉํ•œ ๊ฐ„๋‹จํ•œ ์„œ๋น„์Šค ๋ฐฐํฌ

ํ˜„์šฐ.ยท4์ผ ์ „
1

cloud

๋ชฉ๋ก ๋ณด๊ธฐ
2/2
post-thumbnail

๐Ÿ“Œ ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

์ด๋ฏธ์ง€ ๊ฐค๋Ÿฌ๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ AWS์— ๋ฐฐํฌํ•˜๋Š” ์ „์ฒด ๊ณผ์ •์„ ๋‹ด์•˜์Šต๋‹ˆ๋‹ค.
์‹ค์ œ ์„œ๋น„์Šค์ฒ˜๋Ÿผ ๋ฐฑ์—”๋“œ API ์„œ๋ฒ„์™€ ํ”„๋ก ํŠธ์—”๋“œ ์›น์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ  ์Šคํƒ

  • Backend: Express.js + TypeScript + TypeORM
  • Frontend: React + TypeScript + Vite
  • Database: MySQL (AWS RDS)
  • Storage: AWS S3
  • Deployment: EC2, ELB, CloudFront, Route 53

์ „์ฒด ์•„ํ‚คํ…์ฒ˜

์‚ฌ์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ์— ์ ‘์†ํ•˜๋Š” ํ๋ฆ„:

[์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €] โ†’ [Route 53 DNS]
                      โ†“
        web.theo-test.com ์ž…๋ ฅ ์‹œ
                      โ†“
            [CloudFront CDN]
                      โ†“
            [S3 ์ •์  ์›น ํ˜ธ์ŠคํŒ…]
                (React ์•ฑ)
                      โ†“
        API ํ˜ธ์ถœ (api.theo-test.com)
                      โ†“
               [ELB + HTTPS]
                      โ†“
               [EC2 ์„œ๋ฒ„]
                  โ”œโ†’ [RDS MySQL] (๋ฐ์ดํ„ฐ ์ €์žฅ)
                  โ””โ†’ [S3 ๋ฒ„ํ‚ท] (์ด๋ฏธ์ง€ ์ €์žฅ)

๐Ÿ”ง Part 1: ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ๋ฐฐํฌ

๋ฐฑ์—”๋“œ๋Š” API ์„œ๋ฒ„๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํŒŒ์ผ ์ €์žฅ์†Œ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1. RDS MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์ถ•

๐Ÿ’ก RDS๋ž€? AWS๊ฐ€ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
์ง์ ‘ DB๋ฅผ ์„ค์น˜/๊ด€๋ฆฌํ•  ํ•„์š” ์—†์ด ํด๋ฆญ ๋ช‡ ๋ฒˆ์œผ๋กœ ์ƒ์„ฑ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

1-1. RDS ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

# AWS ์ฝ˜์†”์—์„œ RDS ์„œ๋น„์Šค ์ ‘์†
1. "๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ" ํด๋ฆญ
2. ์—”์ง„ ์˜ต์…˜: MySQL 8.0.35
3. ํ…œํ”Œ๋ฆฟ: ํ”„๋ฆฌ ํ‹ฐ์–ด (๋ฌด๋ฃŒ)
4. ์„ค์ •:
   - DB ์ธ์Šคํ„ด์Šค ์‹๋ณ„์ž: theo-db (DB ์„œ๋ฒ„ ์ด๋ฆ„)
   - ๋งˆ์Šคํ„ฐ ์‚ฌ์šฉ์ž ์ด๋ฆ„: admin
   - ๋งˆ์Šคํ„ฐ ์•”ํ˜ธ: ๋ณต์žกํ•˜๊ฒŒ ์„ค์ • ํ›„ ๋ฉ”๋ชจ!
5. ์ธ์Šคํ„ด์Šค ๊ตฌ์„ฑ: db.t3.micro (ํ”„๋ฆฌํ‹ฐ์–ด)
6. ์Šคํ† ๋ฆฌ์ง€: 20GB
7. ์—ฐ๊ฒฐ:
   - VPC: ๊ธฐ๋ณธ๊ฐ’
   - ํผ๋ธ”๋ฆญ ์•ก์„ธ์Šค: ์˜ˆ (EC2์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก)
8. ์ถ”๊ฐ€ ๊ตฌ์„ฑ:
   - ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„: theo_db
   - DB ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน: ์•„๋ž˜์—์„œ ์ƒ์„ฑ

1-2. RDS ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน ์„ค์ • (ํ•œ๊ธ€/์ด๋ชจ์ง€ ์ง€์›)

# ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน = DB ์„ค์ • ํŒŒ์ผ

1. RDS โ†’ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน โ†’ "ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน ์ƒ์„ฑ"
2. ํŒจ๋ฐ€๋ฆฌ: mysql8.0 ์„ ํƒ
3. ๊ทธ๋ฃน ์ด๋ฆ„: mysql-utf8mb4

# ํ•œ๊ธ€๊ณผ ์ด๋ชจ์ง€๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ •
4. ์ƒ์„ฑ ํ›„ ํŽธ์ง‘ โ†’ ๋‹ค์Œ ๊ฐ’๋“ค ๊ฒ€์ƒ‰ํ•ด์„œ ๋ณ€๊ฒฝ:
   - character_set ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ โ†’ utf8mb4
   - collation ์‹œ์ž‘ํ•˜๋Š” ํ•ญ๋ชฉ โ†’ utf8mb4_unicode_ci
   - time_zone โ†’ Asia/Seoul

5. RDS ์ธ์Šคํ„ด์Šค์— ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน ์ ์šฉ

1-3. RDS ๋ณด์•ˆ ๊ทธ๋ฃน ์„ค์ •

# ๋ณด์•ˆ ๊ทธ๋ฃน = ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™

์ธ๋ฐ”์šด๋“œ ๊ทœ์น™ (๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ):
- Type: MySQL/Aurora
- Port: 3306
- Source: EC2 ๋ณด์•ˆ ๊ทธ๋ฃน ID (๋‚˜์ค‘์— EC2 ์ƒ์„ฑ ํ›„ ์ถ”๊ฐ€)
  โ†’ "EC2 ์„œ๋ฒ„๋งŒ DB์— ์ ‘์† ๊ฐ€๋Šฅ"ํ•˜๋„๋ก ์„ค์ •

1-4. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ฝ”๋“œ

// Express ์„œ๋ฒ„์—์„œ RDS ์—ฐ๊ฒฐํ•˜๋Š” ์ฝ”๋“œ
export const AppDataSource = new DataSource({
  type: "mysql",
  host: process.env.DATABASE_HOST, // RDS ์—”๋“œํฌ์ธํŠธ ์ฃผ์†Œ
  port: 3306,
  username: process.env.DATABASE_USERNAME,
  password: process.env.DATABASE_PASSWORD,
  database: process.env.DATABASE_NAME,
  synchronize: true, // ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์šฉ (์ž๋™ ํ…Œ์ด๋ธ” ์ƒ์„ฑ)
});

2. EC2 ์ธ์Šคํ„ด์Šค ๊ตฌ์ถ•

๐Ÿ’ก EC2๋ž€? AWS์˜ ๊ฐ€์ƒ ์ปดํ“จํ„ฐ์ž…๋‹ˆ๋‹ค.
์šฐ๋ฆฌ์˜ Express ์„œ๋ฒ„ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๋ฆฌ๋ˆ…์Šค ์ปดํ“จํ„ฐ๋ฅผ ๋นŒ๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2-1. EC2 ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

1. EC2 ์„œ๋น„์Šค โ†’ "์ธ์Šคํ„ด์Šค ์‹œ์ž‘"
2. ์„ค์ •:
   - ์ด๋ฆ„: theo-server
   - OS ์„ ํƒ: Ubuntu 22.04 LTS
   - ์ธ์Šคํ„ด์Šค ์œ ํ˜•: t2.micro (ํ”„๋ฆฌํ‹ฐ์–ด)

3. ํ‚ค ํŽ˜์–ด ์ƒ์„ฑ:
   - ์ด๋ฆ„: theo-key
   - .pem ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ (SSH ์ ‘์†์šฉ, ์žƒ์–ด๋ฒ„๋ฆฌ๋ฉด ์žฌ๋ฐœ๊ธ‰ ๋ถˆ๊ฐ€!)

4. ๋„คํŠธ์›Œํฌ ์„ค์ •:
   - ํผ๋ธ”๋ฆญ IP ์ž๋™ ํ• ๋‹น: ํ™œ์„ฑํ™”

5. ๋ณด์•ˆ ๊ทธ๋ฃน (๋ฐฉํ™”๋ฒฝ):
   - SSH (22๋ฒˆ ํฌํŠธ): ๋‚ด IP๋งŒ ํ—ˆ์šฉ
   - HTTP (80๋ฒˆ ํฌํŠธ): ๋ชจ๋“  IP ํ—ˆ์šฉ (์›น ์„œ๋น„์Šค์šฉ)

2-2. EC2 ์„œ๋ฒ„ ์ ‘์† ๋ฐ ํ™˜๊ฒฝ ์„ค์ •

# 1. SSH๋กœ EC2 ์ ‘์† (ํ„ฐ๋ฏธ๋„์—์„œ)
chmod 400 theo-key.pem  # ํ‚ค ํŒŒ์ผ ๊ถŒํ•œ ์„ค์ •
ssh -i theo-key.pem ubuntu@[EC2 ํผ๋ธ”๋ฆญ IP]

# 2. Node.js 20 ๋ฒ„์ „ ์„ค์น˜ (Ubuntu ์ „์šฉ ๋ช…๋ น์–ด)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs

# 3. PM2 ์„ค์น˜ (Node.js ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ ๋„๊ตฌ)
sudo npm install -g pm2

# 4. Git ์„ค์น˜ ๋ฐ ํ”„๋กœ์ ํŠธ ํด๋ก 
sudo apt install git
git clone [์—ฌ๋Ÿฌ๋ถ„์˜ GitHub ์ €์žฅ์†Œ URL]
cd [ํ”„๋กœ์ ํŠธ ํด๋”]/api-server

# 5. ํŒจํ‚ค์ง€ ์„ค์น˜ ๋ฐ ๋นŒ๋“œ
npm install
npm run build

2-3. ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • (.env ํŒŒ์ผ)

# vi ์—๋””ํ„ฐ๋กœ .env ํŒŒ์ผ ์ƒ์„ฑ
vi .env

# ์•„๋ž˜ ๋‚ด์šฉ ์ž…๋ ฅ (i ํ‚ค ๋ˆ„๋ฅด๊ณ  ์ž…๋ ฅ, :wq๋กœ ์ €์žฅ)
AWS_ACCESS_KEY=AKIA๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ‚ค
AWS_SECRET_ACCESS_KEY=๋ฐœ๊ธ‰๋ฐ›์€ ์‹œํฌ๋ฆฟ ํ‚ค
AWS_S3_BUCKET=theo-image-storage
DATABASE_HOST=RDS ์—”๋“œํฌ์ธํŠธ ์ฃผ์†Œ.rds.amazonaws.com
DATABASE_NAME=theo_db
DATABASE_USERNAME=admin
DATABASE_PASSWORD=RDS ์ƒ์„ฑ์‹œ ์„ค์ •ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ

2-4. PM2๋กœ ์„œ๋ฒ„ ์‹คํ–‰

# ์„œ๋ฒ„ ์‹œ์ž‘ (๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰)
sudo pm2 start dist/app.js --name "api-server"

# ์„œ๋ฒ„ ์ƒํƒœ ํ™•์ธ
sudo pm2 status

# ๋กœ๊ทธ ๋ณด๊ธฐ
sudo pm2 logs api-server

# ์„œ๋ฒ„ ์žฌ์‹œ์ž‘ ์‹œ์—๋„ ์ž๋™ ์‹คํ–‰ ์„ค์ •
sudo pm2 startup
sudo pm2 save


3. S3 ์ ‘๊ทผ์„ ์œ„ํ•œ IAM ์„ค์ •

๐Ÿ’ก IAM์ด๋ž€? AWS ์„œ๋น„์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
EC2 ์„œ๋ฒ„๊ฐ€ S3์— ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๋ ค๋ฉด ๊ถŒํ•œ(์•ก์„ธ์Šค ํ‚ค)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

# IAM ์‚ฌ์šฉ์ž ์ƒ์„ฑ
1. IAM ์„œ๋น„์Šค โ†’ ์‚ฌ์šฉ์ž โ†’ "์‚ฌ์šฉ์ž ์ƒ์„ฑ"
2. ์‚ฌ์šฉ์ž ์ด๋ฆ„: s3-upload-user
3. ๊ถŒํ•œ: AmazonS3FullAccess ์ •์ฑ… ์„ ํƒ

# ์•ก์„ธ์Šค ํ‚ค ๋ฐœ๊ธ‰ (์ค‘์š”!)
1. ์ƒ์„ฑํ•œ ์‚ฌ์šฉ์ž ํด๋ฆญ โ†’ "๋ณด์•ˆ ์ž๊ฒฉ ์ฆ๋ช…" ํƒญ
2. "์•ก์„ธ์Šค ํ‚ค ๋งŒ๋“ค๊ธฐ" ํด๋ฆญ
3. ์šฉ๋„: "AWS ์™ธ๋ถ€์—์„œ ์‹คํ–‰๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜"
4. ์•ก์„ธ์Šค ํ‚ค์™€ ์‹œํฌ๋ฆฟ ํ‚ค ๋ณต์‚ฌ (ํ•œ ๋ฒˆ๋งŒ ๋ณด์—ฌ์ง!)
   โ†’ .env ํŒŒ์ผ์— ์ถ”๊ฐ€

4. S3 ๋ฒ„ํ‚ท ์ƒ์„ฑ (์ด๋ฏธ์ง€ ์ €์žฅ์šฉ)

๐Ÿ’ก S3๋ž€? AWS์˜ ํŒŒ์ผ ์ €์žฅ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
์—…๋กœ๋“œ๋œ ์ด๋ฏธ์ง€๋“ค์„ ์ €์žฅํ•˜๋Š” ์ฐฝ๊ณ  ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

1. S3 ์„œ๋น„์Šค โ†’ "๋ฒ„ํ‚ท ๋งŒ๋“ค๊ธฐ"
2. ๋ฒ„ํ‚ท ์ด๋ฆ„: theo-image-storage (์ „์„ธ๊ณ„ ์œ ์ผํ•ด์•ผ ํ•จ)
3. ๋ฆฌ์ „: ap-northeast-2 (์„œ์šธ)
4. ํผ๋ธ”๋ฆญ ์•ก์„ธ์Šค ์ฐจ๋‹จ ํ•ด์ œ (์ด๋ฏธ์ง€ ๊ณต๊ฐœ ์ ‘๊ทผ์šฉ)

# ๋ฒ„ํ‚ท ์ •์ฑ… ์ถ”๊ฐ€ (์ด๋ฏธ์ง€๋ฅผ ์›น์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก)
5. ๋ฒ„ํ‚ท ์„ ํƒ โ†’ ๊ถŒํ•œ ํƒญ โ†’ ๋ฒ„ํ‚ท ์ •์ฑ… ํŽธ์ง‘
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::theo-image-storage/*"
    }
  ]
}

5. ELB๋กœ HTTPS ์ ์šฉํ•˜๊ธฐ

๐Ÿ’ก ELB๋ž€? Elastic Load Balancer์˜ ์•ฝ์ž๋กœ, ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„์‚ฐ์‹œํ‚ค๊ณ 
HTTPS(๋ณด์•ˆ ์—ฐ๊ฒฐ)๋ฅผ ์ ์šฉํ•˜๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

5-1. SSL ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ (HTTPS์šฉ)

1. Certificate Manager ์„œ๋น„์Šค ์ ‘์†
2. "์ธ์ฆ์„œ ์š”์ฒญ" โ†’ ํผ๋ธ”๋ฆญ ์ธ์ฆ์„œ
3. ๋„๋ฉ”์ธ ์ด๋ฆ„: api.theo-test.com
4. ๊ฒ€์ฆ ๋ฐฉ๋ฒ•: DNS ๊ฒ€์ฆ
5. Route 53์—์„œ CNAME ๋ ˆ์ฝ”๋“œ ์ƒ์„ฑ (์ž๋™)
6. ๋ฐœ๊ธ‰ ์™„๋ฃŒ๊นŒ์ง€ ๋Œ€๊ธฐ (10-30๋ถ„)

5-2. Application Load Balancer ์ƒ์„ฑ

1. EC2 โ†’ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ โ†’ "๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ์ƒ์„ฑ"
2. Application Load Balancer ์„ ํƒ
3. ์„ค์ •:
   - ์ด๋ฆ„: theo-elb
   - ์ฒด๊ณ„: ์ธํ„ฐ๋„ท ๊ฒฝ๊ณ„ (์™ธ๋ถ€ ์ ‘๊ทผ์šฉ)
   - ๊ฐ€์šฉ ์˜์—ญ: 2๊ฐœ ์ด์ƒ ์„ ํƒ (ํ•„์ˆ˜)

4. ๋ณด์•ˆ ๊ทธ๋ฃน ์ƒ์„ฑ:
   - HTTP (80) - ๋ชจ๋“  IP
   - HTTPS (443) - ๋ชจ๋“  IP

5-3. ๋Œ€์ƒ ๊ทธ๋ฃน ์„ค์ • (ํƒ€๊ฒŸ ๊ทธ๋ฃน)

# ๋Œ€์ƒ ๊ทธ๋ฃน = ELB๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ผ EC2 ์ธ์Šคํ„ด์Šค ๋ชฉ๋ก

1. ๋Œ€์ƒ ์œ ํ˜•: ์ธ์Šคํ„ด์Šค
2. ๋Œ€์ƒ ๊ทธ๋ฃน ์ด๋ฆ„: theo-api-tg
3. ํ”„๋กœํ† ์ฝœ: HTTP, ํฌํŠธ: 80
4. ์ƒํƒœ ๊ฒ€์‚ฌ ๊ฒฝ๋กœ: / (์„œ๋ฒ„ ํ—ฌ์Šค์ฒดํฌ์šฉ)
5. EC2 ์ธ์Šคํ„ด์Šค ๋“ฑ๋ก

5-4. ๋ฆฌ์Šค๋„ˆ ๊ทœ์น™ ์„ค์ •

# HTTPS ๋ฆฌ์Šค๋„ˆ (443 ํฌํŠธ)
- ํ”„๋กœํ† ์ฝœ: HTTPS
- ์ธ์ฆ์„œ: ACM์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ ์ธ์ฆ์„œ ์„ ํƒ
- ๊ธฐ๋ณธ ๋™์ž‘: theo-api-tg๋กœ ์ „๋‹ฌ

# HTTP ๋ฆฌ์Šค๋„ˆ (80 ํฌํŠธ)
- HTTPS๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ (์ž๋™์œผ๋กœ HTTPS ์‚ฌ์šฉ)

6. Route 53์œผ๋กœ ๋„๋ฉ”์ธ ์—ฐ๊ฒฐ

๐Ÿ’ก Route 53์ด๋ž€? AWS์˜ DNS ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
api.theo-test.com ๊ฐ™์€ ๋„๋ฉ”์ธ์„ ELB์™€ ์—ฐ๊ฒฐํ•ด์ค๋‹ˆ๋‹ค.

1. Route 53 โ†’ ํ˜ธ์ŠคํŒ… ์˜์—ญ โ†’ theo-test.com
2. "๋ ˆ์ฝ”๋“œ ์ƒ์„ฑ"
3. ์„ค์ •:
   - ๋ ˆ์ฝ”๋“œ ์ด๋ฆ„: api (โ†’ api.theo-test.com์ด ๋จ)
   - ๋ ˆ์ฝ”๋“œ ์œ ํ˜•: A
   - ๋ณ„์นญ: ์ผœ๊ธฐ
   - ๋ณ„์นญ ๋Œ€์ƒ: ELB ์„ ํƒ (theo-elb)
4. "๋ ˆ์ฝ”๋“œ ์ƒ์„ฑ"

โ†’ ์ด์ œ https://api.theo-test.com์œผ๋กœ ์ ‘์† ๊ฐ€๋Šฅ!

์ตœ์ข… ๋ฐฐํฌ๋œ ํ™”๋ฉด


๐ŸŒ Part 2: ํ”„๋ก ํŠธ์—”๋“œ ์›น ๋ฐฐํฌ

React ์•ฑ์„ ๋นŒ๋“œํ•˜์—ฌ S3์— ์—…๋กœ๋“œํ•˜๊ณ , CloudFront๋กœ ์ „์„ธ๊ณ„์— ๋น ๋ฅด๊ฒŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

1. React ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ

# ๋กœ์ปฌ ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰
cd web-client

# ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •
echo "VITE_API_URL=https://api.theo-test.com" > .env.production

# ๋นŒ๋“œ (์ตœ์ ํ™”๋œ ์ •์  ํŒŒ์ผ ์ƒ์„ฑ)
npm run build

# dist ํด๋”์— HTML, CSS, JS ํŒŒ์ผ ์ƒ์„ฑ๋จ

2. S3 ์ •์  ์›น ํ˜ธ์ŠคํŒ…

2-1. S3 ๋ฒ„ํ‚ท ์ƒ์„ฑ (์›น ํ˜ธ์ŠคํŒ…์šฉ)

1. S3 โ†’ "๋ฒ„ํ‚ท ๋งŒ๋“ค๊ธฐ"
2. ๋ฒ„ํ‚ท ์ด๋ฆ„: theo-web-client
3. ํผ๋ธ”๋ฆญ ์•ก์„ธ์Šค ์ฐจ๋‹จ: ๋ชจ๋‘ ํ•ด์ œ

2-2. ์ •์  ์›น์‚ฌ์ดํŠธ ํ˜ธ์ŠคํŒ… ํ™œ์„ฑํ™”

1. ๋ฒ„ํ‚ท โ†’ ์†์„ฑ ํƒญ โ†’ ์ •์  ์›น์‚ฌ์ดํŠธ ํ˜ธ์ŠคํŒ…
2. ํ™œ์„ฑํ™”
3. ์ธ๋ฑ์Šค ๋ฌธ์„œ: index.html
4. ์˜ค๋ฅ˜ ๋ฌธ์„œ: index.html (React Router ์ง€์›)

2-3. ๋ฒ„ํ‚ท ์ •์ฑ… ์„ค์ • (๊ณต๊ฐœ ์ฝ๊ธฐ ๊ถŒํ•œ)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::theo-web-client/*"
    }
  ]
}

2-4. ๋นŒ๋“œ ํŒŒ์ผ ์—…๋กœ๋“œ

# S3 ์ฝ˜์†”์—์„œ
1. theo-web-client ๋ฒ„ํ‚ท ์—ด๊ธฐ
2. "์—…๋กœ๋“œ" ํด๋ฆญ
3. dist ํด๋” ๋‚ด์˜ ๋ชจ๋“  ํŒŒ์ผ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ
4. "์—…๋กœ๋“œ"

# ์ด์ œ S3 ์—”๋“œํฌ์ธํŠธ๋กœ ์ ‘์† ๊ฐ€๋Šฅ
# http://theo-web-client.s3-website.ap-northeast-2.amazonaws.com

3. CloudFront CDN ๊ตฌ์ถ•

๐Ÿ’ก CloudFront๋ž€? ์ „์„ธ๊ณ„ ์—ฃ์ง€ ์„œ๋ฒ„์— ์ฝ˜ํ…์ธ ๋ฅผ ์บ์‹ฑํ•˜์—ฌ
๋น ๋ฅธ ๋กœ๋”ฉ ์†๋„๋ฅผ ์ œ๊ณตํ•˜๋Š” CDN ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

3-1. SSL ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ (๋ฒ„์ง€๋‹ˆ์•„ ๋ถ๋ถ€ ๋ฆฌ์ „)

โš ๏ธ ์ค‘์š”: CloudFront์šฉ ์ธ์ฆ์„œ๋Š” ๋ฐ˜๋“œ์‹œ us-east-1 ๋ฆฌ์ „์—์„œ ์ƒ์„ฑ!

1. ๋ฆฌ์ „์„ "๋ฏธ๊ตญ ๋™๋ถ€(๋ฒ„์ง€๋‹ˆ์•„ ๋ถ๋ถ€)"๋กœ ๋ณ€๊ฒฝ
2. Certificate Manager โ†’ "์ธ์ฆ์„œ ์š”์ฒญ"
3. ๋„๋ฉ”์ธ: web.theo-test.com
4. DNS ๊ฒ€์ฆ โ†’ Route 53 CNAME ์ž๋™ ์ƒ์„ฑ

3-2. CloudFront ๋ฐฐํฌ ์ƒ์„ฑ

1. CloudFront โ†’ "๋ฐฐํฌ ์ƒ์„ฑ"

2. ์›๋ณธ ์„ค์ •:
   - ์›๋ณธ ๋„๋ฉ”์ธ: S3 ์ •์  ์›น ํ˜ธ์ŠคํŒ… ์—”๋“œํฌ์ธํŠธ
     (theo-web-client.s3-website.ap-northeast-2.amazonaws.com)
   โš ๏ธ ๋“œ๋กญ๋‹ค์šด ๋ชฉ๋ก์ด ์•„๋‹Œ ์ง์ ‘ ์ž…๋ ฅ!

3. ๊ธฐ๋ณธ ์บ์‹œ ๋™์ž‘:
   - ๋ทฐ์–ด ํ”„๋กœํ† ์ฝœ: Redirect HTTP to HTTPS

4. ์„ค์ •:
   - ๋Œ€์ฒด ๋„๋ฉ”์ธ(CNAME): web.theo-test.com
   - SSL ์ธ์ฆ์„œ: ์œ„์—์„œ ์ƒ์„ฑํ•œ ์ธ์ฆ์„œ ์„ ํƒ
   - ๊ธฐ๋ณธ ๋ฃจํŠธ ๊ฐ์ฒด: index.html

5. ์˜ค๋ฅ˜ ํŽ˜์ด์ง€ (React SPA ์ง€์›):
   - 404 ์—๋Ÿฌ โ†’ /index.html ๋ฐ˜ํ™˜ (200 ์ƒํƒœ)
   - 403 ์—๋Ÿฌ โ†’ /index.html ๋ฐ˜ํ™˜ (200 ์ƒํƒœ)

4. Route 53 ๋„๋ฉ”์ธ ์—ฐ๊ฒฐ

1. Route 53 โ†’ ํ˜ธ์ŠคํŒ… ์˜์—ญ โ†’ theo-test.com
2. "๋ ˆ์ฝ”๋“œ ์ƒ์„ฑ"
3. ์„ค์ •:
   - ๋ ˆ์ฝ”๋“œ ์ด๋ฆ„: web
   - ๋ ˆ์ฝ”๋“œ ์œ ํ˜•: A
   - ๋ณ„์นญ: ์ผœ๊ธฐ
   - ๋ณ„์นญ ๋Œ€์ƒ: CloudFront ๋ฐฐํฌ ์„ ํƒ

โ†’ https://web.theo-test.com์œผ๋กœ ์ ‘์† ๊ฐ€๋Šฅ!

์ตœ์ข… ๋ฐฐํฌ๋œ ํ™”๋ฉด

DB์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ชจ์Šต

S3 ๋ฒ„ํ‚ท์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์˜ฌ๋ผ๊ฐ€์žˆ๋Š” ํŒŒ์ผ๋“ค


๐Ÿ”’ ๋ณด์•ˆ ๊ทธ๋ฃน ์„ค์ • ์š”์•ฝ

โœ… EC2 ๋ณด์•ˆ ๊ทธ๋ฃน
- SSH(22): 0.0.0.0/0 (๋ชจ๋“  IP)
- HTTP(80): 0.0.0.0/0 (๋ชจ๋“  IP)

โœ… ELB ๋ณด์•ˆ ๊ทธ๋ฃน
- HTTP(80): 0.0.0.0/0 (๋ชจ๋“  IP)
- HTTPS(443): 0.0.0.0/0 (๋ชจ๋“  IP)

โœ… RDS ๋ณด์•ˆ ๊ทธ๋ฃน
- MySQL(3306): EC2 ๋ณด์•ˆ ๊ทธ๋ฃน ID๋งŒ

โ†’ ์™ธ๋ถ€์—์„œ๋Š” ELB๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
โ†’ DB๋Š” EC2์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

๐Ÿ’ฐ ๋น„์šฉ ๊ด€๋ฆฌ (๊ณผ๊ธˆ ๋ฐฉ์ง€!)

ํ”„๋ฆฌํ‹ฐ์–ด ํ•œ๋„

  • EC2 t2.micro: ์›” 750์‹œ๊ฐ„
  • RDS db.t3.micro: ์›” 750์‹œ๊ฐ„
  • S3: 5GB ์ €์žฅ, 20,000 GET ์š”์ฒญ
  • CloudFront: 1TB ์ „์†ก

๋ฆฌ์†Œ์Šค ์‚ญ์ œ ์ˆœ์„œ (์‹ค์Šต ํ›„ ํ•„์ˆ˜!)

1. CloudFront ๋ฐฐํฌ ๋น„ํ™œ์„ฑํ™” โ†’ ์‚ญ์ œ
2. ELB ์‚ญ์ œ
3. EC2 ์ธ์Šคํ„ด์Šค ์ข…๋ฃŒ
4. RDS ์‚ญ์ œ (์Šค๋ƒ…์ƒท ์ƒ์„ฑ ์ฒดํฌ ํ•ด์ œ!)
5. ํƒ„๋ ฅ์  IP ๋ฆด๋ฆฌ์ฆˆ โš ๏ธ ๋ฏธ์‚ฌ์šฉ ์‹œ ์‹œ๊ฐ„๋‹น ๊ณผ๊ธˆ!
6. S3 ๋ฒ„ํ‚ท ๋น„์šฐ๊ธฐ โ†’ ์‚ญ์ œ
7. Route 53 ํ˜ธ์ŠคํŒ… ์˜์—ญ ์‚ญ์ œ (๋„๋ฉ”์ธ์€ ์œ ์ง€)

๐Ÿ“š ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๊ฐ€์ด๋“œ

์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ๋ฒ•

1. RDS ์—ฐ๊ฒฐ ์‹คํŒจ

โœ“ RDS ๋ณด์•ˆ ๊ทธ๋ฃน์— EC2 ๋ณด์•ˆ ๊ทธ๋ฃน ID ์ถ”๊ฐ€ํ–ˆ๋Š”์ง€ ํ™•์ธ
โœ“ RDS ํผ๋ธ”๋ฆญ ์•ก์„ธ์Šค "์˜ˆ"๋กœ ์„ค์ •ํ–ˆ๋Š”์ง€ ํ™•์ธ
โœ“ .env ํŒŒ์ผ์˜ DATABASE_HOST๊ฐ€ ์ •ํ™•ํ•œ์ง€ ํ™•์ธ
โœ“ RDS ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน ์ ์šฉํ–ˆ๋Š”์ง€ ํ™•์ธ

2. ELB Health Check ์‹คํŒจ

โœ“ EC2 ๋ณด์•ˆ ๊ทธ๋ฃน์ด ELB ๋ณด์•ˆ ๊ทธ๋ฃน ID ํ—ˆ์šฉํ•˜๋Š”์ง€ ํ™•์ธ
โœ“ PM2๋กœ ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธ (pm2 status)
โœ“ ๋Œ€์ƒ ๊ทธ๋ฃน์˜ ํ—ฌ์Šค์ฒดํฌ ๊ฒฝ๋กœ๊ฐ€ "/" ์ธ์ง€ ํ™•์ธ

3. S3 ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์‹คํŒจ

โœ“ IAM ์‚ฌ์šฉ์ž ์•ก์„ธ์Šค ํ‚ค ์ œ๋Œ€๋กœ ๋ณต์‚ฌํ–ˆ๋Š”์ง€ ํ™•์ธ
โœ“ S3 ๋ฒ„ํ‚ท ์ด๋ฆ„์ด .env์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ
โœ“ S3 ๋ฒ„ํ‚ท ํผ๋ธ”๋ฆญ ์•ก์„ธ์Šค ์ฐจ๋‹จ ํ•ด์ œํ–ˆ๋Š”์ง€ ํ™•์ธ

4. CloudFront 403/404 ์—๋Ÿฌ

โœ“ S3 ์ •์  ์›น ํ˜ธ์ŠคํŒ… ์—”๋“œํฌ์ธํŠธ ์ง์ ‘ ์ž…๋ ฅํ–ˆ๋Š”์ง€ ํ™•์ธ
โœ“ ์˜ค๋ฅ˜ ํŽ˜์ด์ง€ ์„ค์ •์—์„œ /index.html ๋ฐ˜ํ™˜ ์„ค์ •ํ–ˆ๋Š”์ง€ ํ™•์ธ
โœ“ S3 ๋ฒ„ํ‚ท ์ •์ฑ… ์ œ๋Œ€๋กœ ์„ค์ •ํ–ˆ๋Š”์ง€ ํ™•์ธ

๐ŸŽฏ ์ตœ์ข… ์ฒดํฌ๋ฆฌ์ŠคํŠธ

๋ฐฐํฌ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด ๋‹ค์Œ์„ ํ™•์ธํ•˜์„ธ์š”

โœ… ๋ฐฑ์—”๋“œ

  • https://api.theo-test.com ์ ‘์† ๊ฐ€๋Šฅ
  • ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ API ๋™์ž‘
  • DB ์—ฐ๊ฒฐ ์ •์ƒ
  • PM2๋กœ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ ์ค‘

โœ… ํ”„๋ก ํŠธ์—”๋“œ

  • https://web.theo-test.com ์ ‘์† ๊ฐ€๋Šฅ
  • API ์„œ๋ฒ„์™€ ํ†ต์‹  ์ •์ƒ
  • ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ/์กฐํšŒ ๊ธฐ๋Šฅ ๋™์ž‘
  • ์ƒˆ๋กœ๊ณ ์นจ ์‹œ์—๋„ ํŽ˜์ด์ง€ ์ •์ƒ ํ‘œ์‹œ

โœ… ๋ณด์•ˆ

  • ๋ชจ๋“  ๋ณด์•ˆ ๊ทธ๋ฃน ๊ทœ์น™ ์ตœ์†Œํ™”
  • HTTPS ์ ์šฉ ์™„๋ฃŒ
  • ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌ

๐Ÿš€ ๋‹ค์Œ ๋‹จ๊ณ„

์ด์ œ ๊ธฐ๋ณธ์ ์ธ AWS ๋ฐฐํฌ๋ฅผ ๋งˆ์Šคํ„ฐํ–ˆ์Šต๋‹ˆ๋‹ค! ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋‚˜์•„๊ฐ‘๋‹ˆ๋‹ค.

  1. GitHub Actions๋กœ ์ž๋™ ๋ฐฐํฌ ๊ตฌ์ถ•
  2. CloudWatch๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง ์„ค์ •
  3. Docker ์ปจํ…Œ์ด๋„ˆํ™”
  4. Kubernetes(EKS) ๋„์ž…
  5. Terraform์œผ๋กœ ์ธํ”„๋ผ ์ฝ”๋“œํ™”
profile
ํ•™์Šต ๊ธฐ๋ก.

0๊ฐœ์˜ ๋Œ“๊ธ€