AWS Docker ๋ฐฐํฌ ๊ฐ์
Django ํ๋ก์ ํธ๋ฅผ Docker ์ปจํ ์ด๋๋ก ํจํค์งํ ํ, AWS EC2์ ๋ฐฐํฌํ๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Django ํ๋ก์ ํธ ์ค๋น
- ํ๋ก์ ํธ ์ ์ ์คํ ํ์ธ
- requirements.txt ์์ฑ
- Docker ์ปจํ
์ด๋ํ
- Dockerfile & docker-compose.yml ์์ฑ
- Docker ์ด๋ฏธ์ง ๋น๋ ๋ฐ ์คํ
- AWS ๊ณ์ ์์ฑ ๋ฐ IAM ์ค์
- AWS ๊ณ์ ์์ฑ
- IAM ์ฌ์ฉ์ ์์ฑ (๋ณด์ ํค ๋ฐ๊ธ)
- AWS CLI ์ค์
- EC2 ์ธ์คํด์ค ์์ฑ ๋ฐ ์ ์
- Ubuntu ๊ธฐ๋ฐ ์๋ฒ ๋ง๋ค๊ธฐ
- Windows & Mac์์ SSH ์ ์
- Docker & Docker Compose ์ค์น
- AWS EC2์ Docker ํ๊ฒฝ ๊ตฌ์ถ
- Docker ์ปจํ
์ด๋ ๋ฐฐํฌ
- Docker ์ด๋ฏธ์ง AWS ์๋ฒ๋ก ์ ์ก
- Docker Compose๋ก ์ปจํ ์ด๋ ์คํ
- PostgreSQL RDS ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์
- AWS RDS์์ PostgreSQL ์์ฑ
- Django์ ์ฐ๊ฒฐ
- NGINX + HTTPS ์ ์ฉ (์ ํ ์ฌํญ)
- NGINX ๋ฆฌ๋ฒ์ค ํ๋ก์ ์ค์
- Let's Encrypt๋ก HTTPS ์ ์ฉ
1๏ธโฃ Django ํ๋ก์ ํธ ์ค๋น
๐น 1-1. ํ๋ก์ ํธ ์ ์ ์คํ ํ์ธ
๋ก์ปฌ์์ ํ๋ก์ ํธ๊ฐ ์ ์์ ์ผ๋ก ์คํ๋๋์ง ํ์ธํ ๊ฒ.
python manage.py runserver
โ ์ ์ ์คํ๋๋ฉด ๋ธ๋ผ์ฐ์ ์์ http://127.0.0.1:8000 ํ์ธ
๐น 1-2. requirements.txt ํ์ผ ์์ฑ
AWS์์ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํ ์ ์๋๋ก ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ธฐ.
pip freeze > requirements.txt
โ ์ด ํ์ผ์ Docker ์ปจํ ์ด๋์์๋ ์ฌ์ฉํ ์์
2๏ธโฃ Docker ์ปจํ ์ด๋ํ
์ด์ Django ํ๋ก์ ํธ๋ฅผ Docker๋ก ์ปจํ ์ด๋ํ.
๐น 2-1. Dockerfile ์์ฑ
๋ฃจํธ ๋๋ ํฐ๋ฆฌ์ Dockerfile์ ๋ง๋ค๊ณ ๋ค์ ๋ด์ฉ์ ์ถ๊ฐํด์ผํจ.
# 1. ๋ฒ ์ด์ค ์ด๋ฏธ์ง ์ค์
FROM python:3.9
# 2. ์์
๋๋ ํ ๋ฆฌ ์ค์
WORKDIR /app
# 3. ํ์ํ ํจํค์ง ์ค์น
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 4. ํ๋ก์ ํธ ํ์ผ ๋ณต์ฌ
COPY . .
# 5. ํฌํธ ๊ฐ๋ฐฉ
EXPOSE 8000
# 6. Django ์๋ฒ ์คํ ๋ช
๋ น
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "myproject.wsgi:application"]
๐น 2-2. docker-compose.yml ์์ฑ
Django + PostgreSQL์ ์ปจํ ์ด๋๋ก ์คํํ๋ ค๋ฉด docker-compose๋ฅผ ์ฌ์ฉ.
version: '3.8'
services:
web:
build: .
container_name: django_app
restart: always
depends_on:
- db
ports:
- "8000:8000"
environment:
- DEBUG=True
- DATABASE_URL=postgres://myuser:mypassword@db:5432/mydatabase
db:
image: postgres:13
container_name: postgres_db
restart: always
environment:
POSTGRES_DB: mydatabase
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
ports:
- "5432:5432"
๐น 2-3. Docker ์ปจํ ์ด๋ ๋น๋ ๋ฐ ์คํ
1) Docker ์ด๋ฏธ์ง ๋น๋
docker build -t my-django-app .
2) Docker Compose๋ก ์ปจํ ์ด๋ ์คํ
docker-compose up -d
โ ์ด์ ์ปจํ ์ด๋๊ฐ ์คํ๋๊ณ , localhost:8000์์ Django ํ์ธ ๊ฐ๋ฅ
3๏ธโฃ AWS ๊ณ์ ์์ฑ ๋ฐ IAM ์ค์
AWS ์๋น์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๊ณ์ ์ ์์ฑํ๊ณ IAM ์ฌ์ฉ์ ์์ฑ.
๐น 3-1. AWS CLI ์ค์ (Windows & Mac)
1) AWS CLI ์ค์น
- AWS CLI ๋ค์ด๋ก๋ ํ ์ค์น
2) IAM ์ฌ์ฉ์ ์ฐ๊ฒฐ
aws configure
์ดํ ์๋ ์ ๋ณด๋ฅผ ์ ๋ ฅ:
AWS Access Key ID [None]: (์ก์ธ์ค ํค ์
๋ ฅ)
AWS Secret Access Key [None]: (์ํฌ๋ฆฟ ์ก์ธ์ค ํค ์
๋ ฅ)
Default region name [None]: ap-northeast-2 (์์ธ)
Default output format [None]: json
4๏ธโฃ EC2 ์ธ์คํด์ค ์์ฑ ๋ฐ ์ ์
AWS์์ Django๋ฅผ ์คํํ ์๋ฒ(EC2)๋ฅผ ๋ง๋ค์ด์ผํจ.
๐น 4-1. EC2 ์ธ์คํด์ค ์์ฑ
- AWS ์ฝ์ → EC2 ์๋น์ค ์ด๋
- Ubuntu 22.04 LTS ์ ํ
- t2.micro (๋ฌด๋ฃ ํฐ์ด) ์ ํ
- ๋ณด์ ๊ทธ๋ฃน์์ HTTP(80), HTTPS(443), SSH(22), 8000 ํฌํธ ์ด๊ธฐ
- ํค ํ์ด ์์ฑ ํ ๋ค์ด๋ก๋
๐น 4-2. Windows & Mac์์ SSH ์ ์
ssh -i "mykey.pem" ubuntu@<EC2 ํผ๋ธ๋ฆญ IP>
5๏ธโฃ Docker & Docker Compose ์ค์น
EC2 ์๋ฒ์ Docker ํ๊ฒฝ์ ๊ตฌ์ถ.
sudo apt update
sudo apt install docker.io docker-compose
sudo systemctl start docker
sudo systemctl enable docker
6๏ธโฃ Docker ์ปจํ ์ด๋ ๋ฐฐํฌ
1) ๋ก์ปฌ์์ EC2๋ก ํ๋ก์ ํธ ์ ์ก
scp -i "mykey.pem" -r myproject ubuntu@<EC2 ํผ๋ธ๋ฆญ IP>:~
2) EC2์์ ์ปจํ ์ด๋ ์คํ
cd myproject
docker-compose up -d --build
โ EC2 ํผ๋ธ๋ฆญ IP:8000์์ Django๊ฐ ์คํ๋จ
7๏ธโฃ AWS RDS PostgreSQL ์ฐ๊ฒฐ
- AWS ์ฝ์ → RDS ์๋น์ค ์ด๋
- PostgreSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
- settings.py ์์ :
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'your_db_name',
'USER': 'your_db_user',
'PASSWORD': 'your_db_password',
'HOST': 'your_rds_endpoint',
'PORT': '5432',
}
}
- ๋ง์ด๊ทธ๋ ์ด์ ์ ์ฉ
python manage.py migrate
8๏ธโฃ NGINX + HTTPS ์ ์ฉ (์ ํ ์ฌํญ)
1) NGINX ์ค์
sudo nano /etc/nginx/sites-available/django
server {
listen 80;
server_name <EC2 ํผ๋ธ๋ฆญ IP>;
location / {
proxy_pass http://127.0.0.1:8000;
}
}
sudo ln -s /etc/nginx/sites-available/django /etc/nginx/sites-enabled
sudo systemctl restart nginx
โ Django + Docker + AWS ๋ฐฐํฌ
์ด์ http://<EC2 ํผ๋ธ๋ฆญ IP>์์ Django ํ๋ก์ ํธ๋ฅผ ํ์ธ ๊ฐ๋ฅ
์ถ๊ฐ๋ก Route 53์ผ๋ก ๋๋ฉ์ธ ์ฐ๊ฒฐ ๋ฐ HTTPS ์ ์ฉ๋ ๊ฐ๋ฅ
๐ป๋ฐฐํฌ ๋ฐฉ๋ฒ ์ข ๋ฅ ๋น๊ต
AWS ๋ฐฐํฌ: Elastic Beanstalk vs App Runner vs EC2 + Docker (์ฐ๋ฆฌ๋ ๋ญ ํด์ผ ํ ๊น?)
AWS์์ Django + Docker ํ๋ก์ ํธ๋ฅผ ๋ฐฐํฌํ ๋ ์ฌ์ฉํ ์ ์๋ ์ต์ ์ ํฌ๊ฒ 3๊ฐ์ง:
- EC2 + Docker (๊ธฐ๋ณธ์ ์ธ ๋ฐฐํฌ ๋ฐฉ๋ฒ - ์ฐ๋ฆฌ๊ฐ ์ง๊ธ ์ฌ์ฉ ์ค!)
- Elastic Beanstalk (AWS์์ ์๋ ๋ฐฐํฌ + ๊ด๋ฆฌ ์ ๊ณต)
- App Runner (์์ ์๋ํ๋ ์ปจํ ์ด๋ ๋ฐฐํฌ - ๋จ, ์ ์ฝ ๋ง์)
๐น 1. EC2 + Docker (์ฐ๋ฆฌ๊ฐ ์ง๊ธ ์ฌ์ฉ ์ค)
์ฐ๋ฆฌ๊ฐ ํ์ฌ ์งํํ๋ ๋ฐฉ์
โ ์ฅ์
- ์์ ํ ์์ ๋ (์๋ฒ ์ค์ , DB ์ฐ๋, NGINX ๋ฑ ๋ชจ๋ ์ง์ ์ค์ ๊ฐ๋ฅ)
- ๋น์ฉ์ด ์ ๋ ดํจ (๋ฌด๋ฃ ํฐ์ด ์ฌ์ฉ ๊ฐ๋ฅ)
- ํ์ฅ์ฑ์ด ๋ฐ์ด๋จ (ํ์ํ๋ฉด ์ง์ ๋ก๋ ๋ฐธ๋ฐ์ฑ ์ถ๊ฐ ๊ฐ๋ฅ)
โ ๋จ์
- ์ค์ ์ด ๋ง์ (์๋ฒ, Docker, NGINX, HTTPS ๋ฑ ์ง์ ์ค์ ํด์ผ ํจ)
- ์๋ฒ ๊ด๋ฆฌ ํ์ (๋ณด์ ์ ๋ฐ์ดํธ, ์ค์ผ์ผ๋ง ๋ฑ ์ง์ ์ฒ๋ฆฌํด์ผ ํจ)
๐น 2. AWS Elastic Beanstalk (EB)
- AWS๊ฐ ์๋ฒ, ๋ก๋ ๋ฐธ๋ฐ์ฑ, ๋ฐฐํฌ๊น์ง ์๋์ผ๋ก ์ค์ ํด์ฃผ๋ ์๋น์ค
- Docker๋ฅผ ์ง์ํ๋ฏ๋ก, Docker ์ปจํ ์ด๋๋ฅผ ์ฌ๋ ค์ ๋ฐฐํฌ ๊ฐ๋ฅ
โ ์ฅ์
- ๋ฐฐํฌ๊ฐ ๊ฐ๋จํจ (AWS๊ฐ ์๋์ผ๋ก ์ค์ )
- ๋ก๋ ๋ฐธ๋ฐ์ฑ & ์ค์ผ์ผ๋ง ์๋ ์ง์
- Docker ์ง์ → Docker ์ปจํ ์ด๋๋ฅผ ์ฌ๋ฆฌ๋ฉด ๋!
โ ๋จ์
- ์ปค์คํ ์ค์ ์ด ์ด๋ ต๋ค (NGINX, ๋ณด์, ๋ฐฐํฌ ๋ฐฉ์ ๋ฑ์ ์ธ์ธํ๊ฒ ์กฐ์ ํ๊ธฐ ์ด๋ ค์)
- ๋น์ฉ์ด EC2๋ณด๋ค ๋น์ (๋ฌด๋ฃ ํฐ์ด ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ง, ์ถ๊ฐ์ ์ธ AWS ๋ฆฌ์์ค ์ฌ์ฉ ๊ฐ๋ฅ์ฑ ๋์)
โ Elastic Beanstalk์ ์ฌ์ฉํด์ผ ํ ๋
- ๋น ๋ฅด๊ฒ ๋ฐฐํฌํ๊ณ ์ถ์ ๋
- ์๋ฒ ๊ด๋ฆฌ๋ฅผ AWS์๊ฒ ๋งก๊ธฐ๊ณ ์ถ์ ๋
- ์๋ ์ค์ผ์ผ๋ง & ๋ก๋ ๋ฐธ๋ฐ์ฑ์ด ํ์ํ ๊ฒฝ์ฐ
๐น 3. AWS App Runner
์์ ํ ๊ด๋ฆฌํ ์๋น์ค → Docker ์ปจํ ์ด๋๋ฅผ ์ฌ๋ฆฌ๋ฉด AWS๊ฐ ์์์ ๋ฐฐํฌ!
โ ์ฅ์
- ์ค์ ์ด ๊ฑฐ์ ํ์ ์์ (์์ ์๋ํ)
- ๋ก๋ ๋ฐธ๋ฐ์ฑ & HTTPS ์๋ ์ง์
- ๋ฐฐํฌ๊ฐ ๊ฐ์ฅ ๋น ๋ฆ (์ปจํ ์ด๋๋ง ์ฌ๋ฆฌ๋ฉด ๋)
โ ๋จ์
- PostgreSQL RDS ์ฐ๊ฒฐ์ด ๋ฒ๊ฑฐ๋ก์ (VPC ์ค์ ํ์)
- ๋น์ฉ์ด ๊ฐ์ฅ ๋น์ (๋ฌด๋ฃ ํฐ์ด ์์)
- ์ธ๋ถ ์ค์ ์ด ๋ถ๊ฐ๋ฅํจ (NGINX, ํ๊ฒฝ ๋ณ์ ์ค์ ์ ํ)
โ App Runner๋ฅผ ์ฌ์ฉํด์ผ ํ ๋
- ์ ๋ง ๋น ๋ฅด๊ณ ๊ฐ๋จํ๊ฒ ๋ฐฐํฌํ๊ณ ์ถ์ ๋
- ์๋ฒ ๊ด๋ฆฌ๋ฅผ ์์ ํ AWS์๊ฒ ๋งก๊ธฐ๊ณ ์ถ์ ๋
- ๋์ด ์ข ๋ ๋ค๋๋ผ๋ ์ฝ๊ฒ ์ด์ํ๊ณ ์ถ์ ๋
์ฐ๋ฆฌ๋ ๋ญ ์ ํํด์ผ ํ ๊น?
ํญ๋ชฉ | EC2 + Docker | Elastic Beanstalk | App Runner |
์ค์ ๋์ด๋ | ์ด๋ ค์ (๋ชจ๋ ์ค์ ์ง์ ) | ์ค๊ฐ (AWS๊ฐ ์๋ ์ค์ ) | ๊ฐ์ฅ ์ฌ์ (์์ ์๋) |
๋ฐฐํฌ ์๋ | ๋๋ฆผ (์๋ฒ ๊ตฌ์ถ ํ์) | ๋น ๋ฆ (์๋ํ) | ๋งค์ฐ ๋น ๋ฆ (์ปจํ ์ด๋๋ง ์ฌ๋ฆฌ๋ฉด ๋) |
์ปค์คํ ๊ฐ๋ฅ์ฑ | ๋์ (์์ ๋กญ๊ฒ ์ค์ ๊ฐ๋ฅ) | ์ค๊ฐ (AWS ๊ธฐ๋ณธ ์ค์ ๋ฐ๋ฆ) | ๊ฑฐ์ ์์ (AWS๊ฐ ์์์ ์ค์ ) |
์๋ฒ ๊ด๋ฆฌ | ์ง์ ํด์ผ ํจ | ์ผ๋ถ AWS๊ฐ ๊ด๋ฆฌ | AWS๊ฐ ๋ชจ๋ ๊ด๋ฆฌ |
๋น์ฉ | ์ ๋ ดํจ (๋ฌด๋ฃ ํฐ์ด ๊ฐ๋ฅ) | ์ค๊ฐ (EC2๋ณด๋ค ๋น์) | ๊ฐ์ฅ ๋น์ (๋ฌด๋ฃ ํฐ์ด ์์) |
ํ์ฅ์ฑ | ์ง์ ์ค์ ๊ฐ๋ฅ | ์๋ ์ค์ผ์ผ๋ง ์ง์ | ์๋ ์ค์ผ์ผ๋ง ์ง์ |
๊ฒฐ๋ก : ์ฐ๋ฆฌ๋ ์ด๋ค ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผ ํ ๊น?
1) ์ง์ ์๋ฒ๋ฅผ ์ค์ ํ๋ฉด์ "๋ฐฐํฌ ๊ฐ๋ "์ ๋ฐฐ์ฐ๊ณ ์ถ๋ค๋ฉด → EC2 + Docker (ํ์ฌ ์งํ ์ค!)
- ์ฐ๋ฆฌ๊ฐ ์ง๊ธ ํ๊ณ ์๋ ๋ฐฉ์์ด์ผ!
- Docker ์ปจํ ์ด๋๋ฅผ AWS EC2์ ๋ฐฐํฌํ๋ ๊ฒฝํ์ ์์ ์ ์์
- AWS ์๋ฒ ์ค์ , NGINX, PostgreSQL ์ฐ๊ฒฐ๊น์ง ์ง์ ๊ฒฝํ ๊ฐ๋ฅ
- ๋ฐฐํฌ ์๋ํ(์ถํ CI/CD ์ ์ฉ)๋ ๊ฐ๋ฅํจ
2) "๋น ๋ฅด๊ณ ๊ฐํธํ ๋ฐฐํฌ"๋ฅผ ์ํ๋ค๋ฉด → Elastic Beanstalk (EB)
- Docker ์ปจํ ์ด๋๋ง ์ฌ๋ ค์ ๋ฐฐํฌ ๊ฐ๋ฅ
- ๋ก๋ ๋ฐธ๋ฐ์ฑ & ์ค์ผ์ผ๋ง ์๋ ์ง์
- ์๋ฒ ์ค์ ์ AWS๊ฐ ์์์ ํด์ค
- Django + PostgreSQL RDS ์ฐ๊ฒฐ์ด ์ฌ์
โ "๋น ๋ฅด๊ณ ๊ฐ๋จํ๊ฒ ๋ฐฐํฌํ๊ณ ์ถ๋ค!"๋ฉด Elastic Beanstalk ์ถ์ฒ
3) "์ต๋ํ ์ฝ๊ฒ & ์๋ฒ ๊ด๋ฆฌ ์์ด ๋ฐฐํฌ"ํ๊ณ ์ถ๋ค๋ฉด → AWS App Runner
- Docker ์ปจํ ์ด๋๋ง ์ฌ๋ฆฌ๋ฉด AWS๊ฐ ์๋ ๋ฐฐํฌ
- ์ค์ ์ด ๊ฑฐ์ ํ์ ์์ (๊ฐ์ฅ ์ฌ์ด ๋ฐฐํฌ ๋ฐฉ๋ฒ)
- ๋น์ฉ์ด ๊ฐ์ฅ ๋น์ธ์ง๋ง, ์๋ฒ ๊ด๋ฆฌ ์์ด ์ด์ ๊ฐ๋ฅ
โ "์๋ฒ ์ค์ ์ ์ ํ ํ๊ณ ์ถ์ง ์๋ค!"๋ฉด App Runner ์ถ์ฒ
์ฐ๋ฆฌ๊ฐ ์ ํํด์ผ ํ AWS ๋ฐฐํฌ ๋ฐฉ๋ฒ
- ๋จ๊ธฐ์ ์ผ๋ก๋? → EC2 + Docker๋ก ๋ฐฐํฌ (ํ์ฌ ์งํ ์ค!)
- ์ฅ๊ธฐ์ ์ผ๋ก๋? → Elastic Beanstalk (EB)๋ก ๋ฐฐํฌ ์๋ํ ๊ณ ๋ ค
์ต์ข ๊ฒฐ๋ก
- "AWS๋ฅผ ๋ฐฐ์ฐ๋ฉด์ ์ง์ ๋ฐฐํฌ & ์ค์ ์ ์ตํ์!" → EC2 + Docker ๋ฐฐํฌ ์งํ (ํ์ฌ ๋ฐฉ์ ์ ์ง!)
- "๋์ค์ ๋ฐฐํฌ๋ฅผ ์๋ํํ๊ณ ์ถ๋ค!" → Elastic Beanstalk ์ฌ์ฉ ๊ณ ๋ ค (์๋ ๋ฐฐํฌ ๊ฐ๋ฅ!)
- "์๋ฒ ๊ด๋ฆฌ ์์ด ์ ์ผ ์ฝ๊ฒ ๋ฐฐํฌํ๊ณ ์ถ๋ค!" → App Runner ๊ฐ๋ฅ (ํ์ง๋ง ๋น์ฉ ↑)
'Computer Science ๐ > Develop ๐ฉ๐ปโ๐ป' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[250228] SA ๋ฌธ์ ์์ฑ์ ์ค์์ฑ (0) | 2025.02.28 |
---|---|
[250213] API ๋ช ์ธ์ ์์ฑ๋ฒ๊ณผ ํ์์ฑ์ ๋ํ์ฌ (5) | 2025.02.13 |