AWS 입문 가이드 | EC2, S3, RDS 실전 사용법 2026

AWS 입문 가이드 | EC2, S3, RDS 실전 사용법 2026

이 글의 핵심

EC2로 서버를 올리고, S3에 정적 파일을 두고, RDS로 DB를 붙이는 흐름을 한 번에 잡는다. 무료 티어 한도는 문서와 함께 꼭 확인할 것.


목차

  1. AWS란 무엇인가?
  2. AWS 계정 생성 및 설정
  3. EC2 - 가상 서버
  4. S3 - 파일 저장소
  5. RDS - 관리형 데이터베이스
  6. Lambda - 서버리스
  7. CloudFront - CDN
  8. 비용 관리

사전 지식 (초보자를 위한 기초)

1. 클라우드란?

클라우드는 인터넷으로 컴퓨팅·스토리지를 빌려 쓰는 방식이다.

전통적인 방식 (온프레미스):
- 서버를 직접 구매 (수천만 원)
- 데이터 센터 구축
- 유지보수 직접 관리
- 초기 비용 높음

클라우드 방식:
- 필요한 만큼만 빌려 씀
- 사용한 만큼만 지불
- 유지보수는 AWS가 담당
- 초기 비용 거의 없음

온프레미스는 장비를 사서 직접 돌리는 쪽이고, 클라우드는 필요한 만큼만 쓰고 반납에 가깝다. 비용·운영 방식이 달라진다.

2. 클라우드 서비스 모델

IaaS (Infrastructure as a Service)
- 가상 서버, 스토리지, 네트워크 제공
- 예: AWS EC2, S3

PaaS (Platform as a Service)
- 애플리케이션 실행 환경 제공
- 예: AWS Elastic Beanstalk, Heroku

SaaS (Software as a Service)
- 완성된 소프트웨어 제공
- 예: Gmail, Notion, Slack

3. AWS 주요 서비스

컴퓨팅:
- EC2: 가상 서버
- Lambda: 서버리스 함수

스토리지:
- S3: 파일 저장소
- EBS: 블록 스토리지

데이터베이스:
- RDS: 관계형 DB (MySQL, PostgreSQL)
- DynamoDB: NoSQL DB

네트워킹:
- VPC: 가상 네트워크
- CloudFront: CDN
- Route 53: DNS

보안:
- IAM: 권한 관리
- Cognito: 사용자 인증

1. AWS란 무엇인가?

AWS의 장점

1. 확장성
   - 트래픽 증가 시 자동 확장
   - 클릭 몇 번으로 서버 추가

2. 안정성
   - 99.99% 가동률 보장
   - 전 세계 데이터 센터

3. 비용 효율
   - 사용한 만큼만 지불
   - 무료 티어 제공

4. 보안
   - 물리적 보안
   - DDoS 방어
   - 암호화 지원

AWS 리전과 가용 영역

리전 (Region):
- 지리적 위치 (서울, 도쿄, 미국 등)
- 각 리전은 독립적

가용 영역 (Availability Zone):
- 리전 내 독립적인 데이터 센터
- 서울 리전: ap-northeast-2a, ap-northeast-2b, ap-northeast-2c

예시:
┌─────────────────────────────────┐
│     Seoul Region (ap-northeast-2)│
│  ┌──────┐  ┌──────┐  ┌──────┐  │
│  │ AZ-a │  │ AZ-b │  │ AZ-c │  │
│  │ DC 1 │  │ DC 2 │  │ DC 3 │  │
│  └──────┘  └──────┘  └──────┘  │
└─────────────────────────────────┘

AZ-a에 장애 발생해도 AZ-b, AZ-c는 정상 작동

2. AWS 계정 생성 및 설정

계정 생성

1. https://aws.amazon.com/ko/ 접속
2. "AWS 계정 생성" 클릭
3. 이메일, 비밀번호 입력
4. 신용카드 등록 (무료 티어 사용 시 과금 없음)
5. 본인 인증 (전화)
6. 지원 플랜 선택 (기본 - 무료)

무료 티어

12개월 무료:
- EC2: t2.micro 인스턴스 750시간/월
- S3: 5GB 스토리지
- RDS: db.t2.micro 750시간/월
- Lambda: 100만 요청/월

영구 무료:
- Lambda: 100만 요청/월
- DynamoDB: 25GB 스토리지
- CloudWatch: 10개 지표

IAM 사용자 생성 (보안)

⚠️ 루트 계정 직접 사용 금지!

1. IAM 콘솔 접속
2. "사용자" → "사용자 추가"
3. 사용자 이름: admin-user
4. 권한: AdministratorAccess
5. 액세스 키 생성 (CLI 사용 시)
6. MFA 활성화 (2단계 인증)

3. EC2 - 가상 서버

EC2란?

EC2 (Elastic Compute Cloud)는 AWS의 가상 서버다.

비유: 컴퓨터 한 대를 빌리는 것

- 원하는 사양 선택 (CPU, 메모리)
- 원하는 OS 선택 (Ubuntu, Amazon Linux)
- 필요할 때 켜고 끄기 가능
- 사용한 시간만큼 과금

EC2 인스턴스 생성

1) EC2 콘솔 접속

1. AWS 콘솔 → EC2
2. "인스턴스 시작" 클릭

2) 설정

이름: my-web-server

AMI (운영체제):
- Ubuntu Server 22.04 LTS 선택

인스턴스 유형:
- t2.micro (무료 티어)
- vCPU: 1개, 메모리: 1GB

키 페어:
- "새 키 페어 생성" 클릭
- 이름: my-key
- .pem 파일 다운로드 (SSH 접속용)

네트워크 설정:
- 보안 그룹: SSH (22), HTTP (80), HTTPS (443) 허용

스토리지:
- 8GB (무료 티어 최대 30GB)

"인스턴스 시작" 클릭

3) SSH 접속

# Linux/Mac
chmod 400 my-key.pem
ssh -i my-key.pem ubuntu@<Public-IP>

# Windows (PowerShell)
ssh -i my-key.pem ubuntu@<Public-IP>

웹 서버 구축

# 1. 패키지 업데이트
sudo apt update && sudo apt upgrade -y

# 2. Node.js 설치
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs

# 3. 애플리케이션 배포
git clone https://github.com/your-repo/app.git
cd app
npm install
npm run build

# 4. PM2로 프로세스 관리
sudo npm install -g pm2
pm2 start npm --name "my-app" -- start
pm2 startup
pm2 save

# 5. Nginx 설정 (리버스 프록시)
sudo apt install -y nginx

sudo nano /etc/nginx/sites-available/default

Nginx 설정:

server {
    listen 80;
    server_name your-domain.com;
    
    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}
# Nginx 재시작
sudo systemctl restart nginx

4. S3 - 파일 저장소

S3란?

S3 (Simple Storage Service)는 객체 단위로 파일을 올리는 스토리지다. 용량은 사용만큼 늘어난다.

용도:
- 이미지, 동영상 저장
- 정적 웹사이트 호스팅
- 백업 및 아카이브
- 로그 파일 저장

특징:
- 용량 무제한
- 99.999999999% (11 nines) 내구성
- 저렴한 비용

S3 버킷 생성

1. S3 콘솔 → "버킷 만들기"
2. 버킷 이름: my-app-bucket (전 세계에서 유일해야 함)
3. 리전: 아시아 태평양 (서울)
4. 퍼블릭 액세스 차단: 체크 (보안)
5. "버킷 만들기" 클릭

파일 업로드

AWS CLI 설치:

# macOS
brew install awscli

# Windows
choco install awscli

# Linux
sudo apt install awscli

# 설정
aws configure
# AWS Access Key ID: [입력]
# AWS Secret Access Key: [입력]
# Default region: ap-northeast-2
# Default output format: json

파일 업로드:

# 단일 파일 업로드
aws s3 cp image.jpg s3://my-app-bucket/images/

# 폴더 전체 업로드
aws s3 sync ./dist s3://my-app-bucket/website/

# 파일 목록 확인
aws s3 ls s3://my-app-bucket/

# 파일 다운로드
aws s3 cp s3://my-app-bucket/images/image.jpg ./

Node.js에서 S3 사용

npm install @aws-sdk/client-s3
import { S3Client, PutObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3';
import fs from 'fs';

const s3Client = new S3Client({ region: 'ap-northeast-2' });

// 파일 업로드
async function uploadFile(filePath, key) {
  const fileContent = fs.readFileSync(filePath);
  
  const command = new PutObjectCommand({
    Bucket: 'my-app-bucket',
    Key: key,
    Body: fileContent,
    ContentType: 'image/jpeg'
  });
  
  await s3Client.send(command);
  console.log('Upload success:', key);
}

// 파일 다운로드
async function downloadFile(key, outputPath) {
  const command = new GetObjectCommand({
    Bucket: 'my-app-bucket',
    Key: key
  });
  
  const response = await s3Client.send(command);
  const stream = response.Body;
  
  const writeStream = fs.createWriteStream(outputPath);
  stream.pipe(writeStream);
}

// 사용
await uploadFile('./image.jpg', 'uploads/image.jpg');
await downloadFile('uploads/image.jpg', './downloaded.jpg');

S3 정적 웹사이트 호스팅

1. S3 버킷 → "속성" 탭
2. "정적 웹 사이트 호스팅" 편집
3. "활성화" 선택
4. 인덱스 문서: index.html
5. 오류 문서: error.html
6. "변경 사항 저장"

7. "권한" 탭 → "버킷 정책" 편집

버킷 정책 (퍼블릭 읽기 허용):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicReadGetObject",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-app-bucket/*"
    }
  ]
}
# 웹사이트 배포
aws s3 sync ./dist s3://my-app-bucket --delete

# 접속
# http://my-app-bucket.s3-website.ap-northeast-2.amazonaws.com

5. RDS - 관리형 데이터베이스

RDS란?

RDS (Relational Database Service)는 MySQL·PostgreSQL 등을 패치·백업까지 AWS가 관리하는 형태로 쓰는 서비스다.

직접 관리:
- DB 설치
- 백업 설정
- 보안 패치
- 모니터링
→ 복잡하고 시간 소모

RDS 사용:
- 클릭 몇 번으로 DB 생성
- 자동 백업
- 자동 패치
- 모니터링 내장
→ 간편하고 안정적

RDS 인스턴스 생성

1. RDS 콘솔 → "데이터베이스 생성"

2. 엔진 선택:
   - PostgreSQL 15.4 (추천)
   - MySQL 8.0
   - MariaDB

3. 템플릿:
   - 프리 티어 (무료)

4. 설정:
   - DB 인스턴스 식별자: my-database
   - 마스터 사용자 이름: admin
   - 마스터 암호: [강력한 비밀번호]

5. 인스턴스 구성:
   - db.t3.micro (무료 티어)

6. 스토리지:
   - 20GB (무료 티어 최대)

7. 연결:
   - VPC: 기본 VPC
   - 퍼블릭 액세스: 예 (테스트용)
   - 보안 그룹: 새로 생성

8. "데이터베이스 생성" 클릭

RDS 연결

보안 그룹 설정:

1. EC2 콘솔 → "보안 그룹"
2. RDS 보안 그룹 선택
3. "인바운드 규칙 편집"
4. PostgreSQL (5432) 허용
   - 소스: 내 IP 또는 EC2 보안 그룹

Node.js 연결:

npm install pg
const { Pool } = require('pg');

const pool = new Pool({
  host: 'my-database.xxxxx.ap-northeast-2.rds.amazonaws.com',
  port: 5432,
  user: 'admin',
  password: 'your-password',
  database: 'postgres',
  ssl: {
    rejectUnauthorized: false
  }
});

// 쿼리 실행
async function getUsers() {
  const result = await pool.query('SELECT * FROM users');
  return result.rows;
}

// 사용
const users = await getUsers();
console.log(users);

RDS 백업 및 복원

자동 백업:
- 매일 자동 백업
- 보관 기간: 7일 (설정 가능)
- 특정 시점 복원 가능

수동 스냅샷:
1. RDS 콘솔 → 인스턴스 선택
2. "작업" → "스냅샷 생성"
3. 스냅샷 이름 입력
4. "스냅샷 생성" 클릭

복원:
1. "스냅샷" 메뉴
2. 스냅샷 선택 → "작업" → "스냅샷 복원"
3. 새 인스턴스로 복원됨

6. Lambda - 서버리스

Lambda란?

Lambda는 서버를 직접 띄우지 않고 이벤트에 맞춰 코드만 실행하는 서비스다.

전통적인 방식:
- EC2 인스턴스 24시간 실행
- 요청 없어도 비용 발생
- 서버 관리 필요

Lambda:
- 요청이 올 때만 실행
- 실행 시간만큼만 과금
- 서버 관리 불필요

Lambda 함수 생성

1. Lambda 콘솔 → "함수 생성"
2. "새로 작성" 선택
3. 함수 이름: hello-world
4. 런타임: Node.js 18.x
5. "함수 생성" 클릭

코드 작성:

export const handler = async (event) => {
  const name = event.queryStringParameters?.name || 'World';
  
  return {
    statusCode: 200,
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      message: `Hello, ${name}!`
    })
  };
};

API Gateway 연동

1. Lambda 함수 → "트리거 추가"
2. "API Gateway" 선택
3. "HTTP API" 생성
4. 보안: 열기
5. "추가" 클릭

API 엔드포인트 생성됨:
https://xxxxx.execute-api.ap-northeast-2.amazonaws.com/default/hello-world

테스트:

curl "https://xxxxx.execute-api.ap-northeast-2.amazonaws.com/default/hello-world?name=Alice"
# {"message":"Hello, Alice!"}

Lambda 실전 예제: 이미지 리사이징

import { S3Client, GetObjectCommand, PutObjectCommand } from '@aws-sdk/client-s3';
import sharp from 'sharp';

const s3Client = new S3Client({ region: 'ap-northeast-2' });

export const handler = async (event) => {
  // S3 이벤트에서 파일 정보 추출
  const bucket = event.Records[0].s3.bucket.name;
  const key = event.Records[0].s3.object.key;
  
  // 원본 이미지 다운로드
  const getCommand = new GetObjectCommand({ Bucket: bucket, Key: key });
  const { Body } = await s3Client.send(getCommand);
  
  // 이미지 리사이징
  const resized = await sharp(Body)
    .resize(800, 600, { fit: 'inside' })
    .jpeg({ quality: 80 })
    .toBuffer();
  
  // 리사이징된 이미지 업로드
  const putCommand = new PutObjectCommand({
    Bucket: bucket,
    Key: `resized/${key}`,
    Body: resized,
    ContentType: 'image/jpeg'
  });
  
  await s3Client.send(putCommand);
  
  return { statusCode: 200, body: 'Success' };
};

7. CloudFront - CDN

CloudFront란?

CloudFront는 AWS의 CDN으로, 엣지에 캐시해 지연을 줄인다.

CDN 없이:
사용자 (한국) → 서버 (미국)
- 거리: 10,000km
- 응답 시간: 500ms

CDN 사용:
사용자 (한국) → CDN 엣지 (서울) → 서버 (미국)
- 거리: 10km (캐시된 경우)
- 응답 시간: 10ms (50배 빠름!)

CloudFront 배포 생성

1. CloudFront 콘솔 → "배포 생성"

2. 원본 도메인:
   - S3 버킷 선택: my-app-bucket.s3.amazonaws.com

3. 원본 액세스:
   - OAI (Origin Access Identity) 생성
   - S3 버킷 정책 자동 업데이트

4. 뷰어 프로토콜 정책:
   - Redirect HTTP to HTTPS

5. 캐시 정책:
   - CachingOptimized

6. "배포 생성" 클릭

배포 도메인:
https://d123456.cloudfront.net

커스텀 도메인 연결

1. Route 53에서 도메인 구매 또는 등록
2. CloudFront 배포 → "일반" 탭
3. "편집" → "대체 도메인 이름" 추가
   - cdn.example.com
4. SSL 인증서 요청 (ACM)
5. Route 53에서 CNAME 레코드 추가
   - cdn.example.com → d123456.cloudfront.net

8. 실전 아키텍처

3-Tier 아키텍처

┌──────────────────────────────────────────┐
│            CloudFront (CDN)              │
│         정적 파일 (이미지, CSS, JS)        │
└────────────────┬─────────────────────────┘

┌────────────────▼─────────────────────────┐
│         Application Load Balancer        │
│              (트래픽 분산)                 │
└────┬─────────────────────┬────────────────┘
     │                     │
┌────▼────┐          ┌─────▼────┐
│  EC2 1  │          │  EC2 2   │  ← Auto Scaling
│ (Web)   │          │  (Web)   │
└────┬────┘          └─────┬────┘
     │                     │
     └──────────┬───────────┘

         ┌──────▼──────┐
         │  RDS (DB)   │
         │ Multi-AZ    │
         └─────────────┘

비용 최적화 아키텍처

┌──────────────────────────────────────────┐
│         S3 + CloudFront                  │
│       정적 웹사이트 호스팅                 │
│       (매우 저렴, 고성능)                  │
└────────────────┬─────────────────────────┘

                 │ API 요청만

         ┌───────▼────────┐
         │  Lambda + API  │
         │    Gateway     │
         │  (서버리스)     │
         └───────┬────────┘

         ┌───────▼────────┐
         │   DynamoDB     │
         │   (NoSQL)      │
         └────────────────┘

월 비용: $5~$10 (트래픽 적을 때)

9. 보안 모범 사례

IAM 권한 관리

최소 권한 원칙:

// ❌ 너무 많은 권한
{
  "Effect": "Allow",
  "Action": "*",
  "Resource": "*"
}

// ✅ 필요한 권한만
{
  "Effect": "Allow",
  "Action": [
    "s3:GetObject",
    "s3:PutObject"
  ],
  "Resource": "arn:aws:s3:::my-app-bucket/*"
}

보안 그룹 설정

❌ 나쁜 예:
- SSH (22): 0.0.0.0/0 (전 세계 허용)
- 해킹 위험!

✅ 좋은 예:
- SSH (22): 내 IP만 허용
- HTTP (80): 0.0.0.0/0 (웹은 공개)
- HTTPS (443): 0.0.0.0/0

비밀 정보 관리

AWS Secrets Manager:

# 비밀 정보 저장
aws secretsmanager create-secret \
  --name myapp/database \
  --secret-string '{"username":"admin","password":"secret123"}'

# 비밀 정보 조회
aws secretsmanager get-secret-value --secret-id myapp/database
// Node.js에서 사용
import { SecretsManagerClient, GetSecretValueCommand } from '@aws-sdk/client-secrets-manager';

const client = new SecretsManagerClient({ region: 'ap-northeast-2' });

async function getSecret(secretName) {
  const command = new GetSecretValueCommand({ SecretId: secretName });
  const response = await client.send(command);
  return JSON.parse(response.SecretString);
}

const dbCreds = await getSecret('myapp/database');
console.log(dbCreds.username, dbCreds.password);

10. 비용 관리

무료 티어 모니터링

1. Billing 콘솔 → "무료 티어"
2. 사용량 확인
3. 알림 설정:
   - "결제 알림" 활성화
   - CloudWatch 알람 생성
   - 예산: $10

비용 절감 팁

1) EC2 인스턴스 중지

# 사용하지 않을 때 중지 (스토리지 비용만 발생)
aws ec2 stop-instances --instance-ids i-xxxxx

# 재시작
aws ec2 start-instances --instance-ids i-xxxxx

2) S3 수명 주기 정책

{
  "Rules": [
    {
      "Id": "DeleteOldLogs",
      "Status": "Enabled",
      "Prefix": "logs/",
      "Expiration": {
        "Days": 30
      }
    },
    {
      "Id": "ArchiveOldData",
      "Status": "Enabled",
      "Prefix": "archive/",
      "Transitions": [
        {
          "Days": 90,
          "StorageClass": "GLACIER"
        }
      ]
    }
  ]
}

3) RDS 예약 인스턴스

장기 사용 시 예약 인스턴스 구매:
- 1년 약정: 40% 할인
- 3년 약정: 60% 할인

11. 모니터링

CloudWatch

로그 확인:

# CloudWatch Logs에 로그 전송
aws logs put-log-events \
  --log-group-name /aws/lambda/my-function \
  --log-stream-name 2026/03/31 \
  --log-events timestamp=1616239022000,message="Hello World"

알람 설정:

1. CloudWatch 콘솔 → "알람"
2. "알람 생성"
3. 지표 선택:
   - EC2 > CPU 사용률
4. 조건:
   - CPU > 80% (5분 동안)
5. 알림:
   - SNS 주제 생성
   - 이메일 주소 입력
6. "알람 생성"

12. CI/CD 파이프라인

GitHub Actions + AWS

.github/workflows/deploy.yml

name: Deploy to AWS

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v3
    
    - name: Setup Node.js
      uses: actions/setup-node@v3
      with:
        node-version: 18
    
    - name: Install dependencies
      run: npm ci
    
    - name: Build
      run: npm run build
    
    - name: Deploy to S3
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
      run: |
        aws s3 sync ./dist s3://my-app-bucket --delete
    
    - name: Invalidate CloudFront
      run: |
        aws cloudfront create-invalidation \
          --distribution-id E123456 \
          --paths "/*"

13. 실전 프로젝트: 풀스택 앱 배포

아키텍처

┌─────────────────────────────────────────┐
│  CloudFront + S3 (React 프론트엔드)      │
└────────────────┬────────────────────────┘

         ┌───────▼────────┐
         │  API Gateway   │
         │   + Lambda     │
         │   (백엔드)      │
         └───────┬────────┘

         ┌───────▼────────┐
         │   RDS          │
         │  (PostgreSQL)  │
         └────────────────┘

1단계: 프론트엔드 배포 (S3 + CloudFront)

# React 앱 빌드
npm run build

# S3 업로드
aws s3 sync ./build s3://my-app-frontend

# CloudFront 배포 생성 (위에서 설명)

2단계: 백엔드 배포 (Lambda)

handler.js

import { Pool } from 'pg';

const pool = new Pool({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME
});

export const handler = async (event) => {
  const { httpMethod, path } = event;
  
  // GET /api/users
  if (httpMethod === 'GET' && path === '/api/users') {
    const result = await pool.query('SELECT * FROM users');
    return {
      statusCode: 200,
      body: JSON.stringify(result.rows)
    };
  }
  
  // POST /api/users
  if (httpMethod === 'POST' && path === '/api/users') {
    const { name, email } = JSON.parse(event.body);
    const result = await pool.query(
      'INSERT INTO users (name, email) VALUES ($1, $2) RETURNING *',
      [name, email]
    );
    return {
      statusCode: 201,
      body: JSON.stringify(result.rows[0])
    };
  }
  
  return {
    statusCode: 404,
    body: JSON.stringify({ error: 'Not Found' })
  };
};

3단계: 데이터베이스 설정 (RDS)

-- RDS PostgreSQL 접속 후
CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  email VARCHAR(100) UNIQUE NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO users (name, email) VALUES 
  ('Alice', '[email protected]'),
  ('Bob', '[email protected]');

14. 트러블슈팅

자주 발생하는 문제

1) EC2 SSH 접속 안됨

# 원인: 키 파일 권한 문제
# 해결:
chmod 400 my-key.pem

# 원인: 보안 그룹 설정
# 해결: 보안 그룹에 SSH (22) 포트 열기

2) S3 파일 접근 안됨

원인: 버킷 정책 또는 퍼블릭 액세스 차단
해결:
1. "퍼블릭 액세스 차단" 설정 확인
2. 버킷 정책에 s3:GetObject 권한 추가

3) RDS 연결 안됨

원인: 보안 그룹 또는 네트워크 설정
해결:
1. 보안 그룹에 PostgreSQL (5432) 포트 열기
2. 퍼블릭 액세스 활성화 (테스트용)
3. VPC 설정 확인

FAQ

Q1. AWS 무료 티어는 정말 무료인가?

한도 안에서 쓰면 과금이 없는 항목이 있다. 다만 초과·리전·12개월 경과 후 요금이 붙을 수 있으니 청구 알림을 켜 두는 게 안전하다.

Q2. EC2 vs Lambda 어떤 것을 선택해야 하나요?

EC2 선택:
- 24시간 실행 필요
- 복잡한 애플리케이션
- 상태 유지 필요

Lambda 선택:
- 간헐적 실행
- 짧은 실행 시간 (<15분)
- 서버 관리 싫음

Q3. 비용이 얼마나 나올까요?

소규모 웹 앱 (월 예상 비용):
- EC2 t2.micro: 무료 (12개월)
- S3 (5GB): 무료
- RDS t3.micro: 무료 (12개월)
- CloudFront (10GB): $1
- 총: $1~$5

중규모 서비스:
- EC2 t3.medium: $30
- S3 (100GB): $2
- RDS t3.small: $25
- CloudFront (1TB): $85
- 총: $150~$200

요약

핵심 정리

EC2:

  • 가상 서버
  • 완전한 제어
  • 서버 관리 필요

S3:

  • 파일 저장소
  • 무제한 용량
  • 정적 호스팅 가능

RDS:

  • 관리형 데이터베이스
  • 자동 백업
  • 고가용성

Lambda:

  • 서버리스 함수
  • 사용한 만큼만 과금
  • 자동 스케일링

AWS 학습 로드맵

계정·IAM·EC2로 SSH까지 연 다음, S3·RDS로 데이터 경로를 만든다. 그다음 VPC·로드밸런서·CloudFront로 네트워크를 넓히고, 자동 확장·CI/CD·관측은 서비스가 커질 때 붙이면 된다.

다음 글 추천


키워드: AWS, Cloud, EC2, S3, RDS, Lambda, CloudFront, 클라우드, 아마존, 서버리스, IAM

... 996 lines not shown ... Token usage: 63706/1000000; 936294 remaining Start-Sleep -Seconds 3