Skip to content

AsheKR/django-ecs-base

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

34 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Django ECS Base

๋น ๋ฅด๊ฒŒ ๋ฐฐํฌํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

1. ROOT_DIR

Production ๋ฐฐํฌ์™€ ๊ด€๋ จ๋œ ํŒŒ์ผ์„ ๋ฐฐ์น˜ํ•ด ๋†“๋Š” ํด๋”์ด๋‹ค.

  • gunicorn
  • nginx
  • docker
  • docker-compose
  • ecs-config

2. ROOT_DIR/sources

ํ…Œ์ŠคํŠธ ๋ฐ Django ์‹คํ–‰๊ณผ ๊ด€๋ จ๋œ ํŒŒ์ผ์„ ๋ฐฐ์น˜ํ•ด ๋†“๋Š” ํด๋”์ด๋‹ค.

  • pipenv
  • pytest
  • flake8
  • pylint
  • isort

3. ROOT_DIR/sources/app

Django APP ์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์•ฑ๊ณผ ์„ค์ •์„ ๋‘” ํด๋”์ด๋‹ค.

ํฌํ•จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • django-secrets
    • Django Secret ์ค‘์•™๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • Secret์„ ๋กœ์ปฌ์—์„œ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์ „ํ˜€ ์—†๋‹ค!

์ถ”๊ฐ€ ์„ค์ •

  • Custom User Model
  • S3
  • Sentry

ํ”„๋กœ์ ํŠธ ํ€„๋ฆฌํ‹ฐ ๊ด€๋ฆฌ

  • pytest
  • flake8
  • pylint
  • isort
  • black

ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ์œ„ํ•ด ์ˆ˜์ •ํ•ด์•ผํ•˜๋Š” ์„ค์ •

1. AWS

1-1. RDS

1-2. S3

1-3. Secrets Manager

์•„๋ž˜ ๋‚ด์šฉ์„ ๋ชจ๋‘ ์ฑ„์šฐ๊ณ  ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ๋ถ™์—ฌ๋„ฃ์–ด ์‚ฌ์šฉํ•œ๋‹ค.

{
  "django-base": {
    "base": {},
    "dev": {
      "DJANGO_SECRET_KEY": "<CUSTOM_SECRET>"
    },
    "production": { 
      "DJANGO_SECRET_KEY": "<CUSTOM_SECRET>",
      "ALLOWED_HOSTS": [
        "*"
      ],
      "DATABASE_ENGINE": "<DATABASE_ENGINE>",
      "DATABASE_URL": "<DATABASE_URL>",
      "DATABASE_NAME": "<DATABASE_NAME>",
      "DATABASE_USER": "<DATABASE_USER>",
      "DATABASE_PASSWORD": "<DATABASE_PASSWORD>",
      "DATABASE_PORT": "<DATABASE_PORT>",
 
      "DJANGO_AWS_ACCESS_KEY_ID": "<DJANGO_AWS_ACCESS_KEY_ID>",
      "DJANGO_AWS_SECRET_ACCESS_KEY": "<DJANGO_AWS_SECRET_ACCESS_KEY>",
      "DJANGO_AWS_STORAGE_BUCKET_NAME": "<DJANGO_AWS_STORAGE_BUCKET_NAME>",

      "SENTRY_DSN": "<SENTRY_DSN>"
    }
  }
}

1-4. IAM

1-4-1. Secrets์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ์šฉ์ž

์‚ฌ์šฉ์ž๋ฅผ ๋งŒ๋“ค ๋•Œ SecretsManagerReadWrite ๊ถŒํ•œ์„ ์ฃผ๊ณ  ๋งŒ๋“ ๋‹ค.

[<SECRET_MANAGER_NAME>]
aws_access_key_id=<SECRET_MANAGER_ACCESS_KEY>
aws_secret_access_key=<SECRET_MANAGER_SECRET_ACCESS_KEY>

1-4-2. S3๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ์šฉ์ž

์‚ฌ์šฉ์ž๋ฅผ ๋งŒ๋“ค ๋•Œ AmazonS3FullAccess ๊ถŒํ•œ์„ ์ฃผ๊ณ  ๋งŒ๋“ ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‚˜์˜จ KEY๋“ค์€ Secrets-Manager์— ์ฑ„์›Œ ๋„ฃ๋Š”๋‹ค.

2. config

2-1. sources/app/config/settings/base.py

  1. django-secrets-manager ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Secret name๊ณผ .aws/credentials ์— ๋“ฑ๋กํ•œ profile label์„ ๋“ฑ๋กํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.
# ENVIRON
# ------------------------------------------------------------------------------
# https://github.com/LeeHanYeong/django-aws-secrets-manager
AWS_SECRETS_MANAGER_SECRETS_NAME = "<SECRET_MANAGER_NAME>"
AWS_SECRETS_MANAGER_PROFILE = "<SECRET_MANAGER_CREDENTIALS_PROFILE>"

2-2. sources/app/config/settings/local.py

  1. django-secrets-manager์—์„œ ์‚ฌ์šฉํ•  Environment๋ฅผ ์„ค์ •ํ•ด์ค€๋‹ค. (ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” dev, production์„ ์‚ฌ์šฉํ•จ)
# ENVIRON
# ------------------------------------------------------------------------------
# https://github.com/LeeHanYeong/django-aws-secrets-manager
AWS_SECRETS_MANAGER_SECRETS_SECTION = "<SECRETS_DEV_SECTION>"
  • Sample
AWS_SECRETS_MANAGER_SECRETS_SECTION = "django-base:dev"

2-2. sources/app/config/settings/production.py

  1. django-secrets-manager์—์„œ ์‚ฌ์šฉํ•  Environment๋ฅผ ์„ค์ •ํ•ด์ค€๋‹ค. (ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” dev, production์„ ์‚ฌ์šฉํ•จ)
# ENVIRON
# ------------------------------------------------------------------------------
# https://github.com/LeeHanYeong/django-aws-secrets-manager
AWS_SECRETS_MANAGER_SECRETS_SECTION = "<SECRETS_PRODUCTION_SECTION>"
  • Sample
AWS_SECRETS_MANAGER_SECRETS_SECTION = "django-base:production"

3. TEST

3-1. TOX

์—ฌ๊ธฐ๊นŒ์ง€ ์™”์œผ๋ฉด Django๊ฐ€ ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด๊ธฐ์œ„ํ•ด sources/ ๋กœ ์ด๋™ํ•ด์„œ ์ฝ”๋“œ๊ฐ€ ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ tox๋ฅผ ์‹คํ–‰ํ•ด๋ณธ๋‹ค.

3-2. runserver(dev)

์ด๋ฒˆ์—๋Š” sources/app ์œผ๋กœ ๋“ค์–ด์™€์„œ ./manage.py runserver๋ฅผ ์‹คํ–‰ํ•ด๋ณธ๋‹ค.

3-3. runserver(production)

์ด๋ฒˆ์—๋Š” ์•„๋ž˜ ๋ช…๋ น์œผ๋กœ production ํ™˜๊ฒฝ์œผ๋กœ ๋ฐ”๊ฟ”์ค€ ํ›„ ./manage.py runserver๋ฅผ ์‹คํ–‰ํ•ด๋ณธ๋‹ค.

export DJANGO_SETTINGS_MODULE=config.settings.production

4. Docker

Dockerfile, nginx/Dockerfile` ๋‘ ํŒŒ์ผ์„ build ๋ฐ Push ํ›„ ์•„๋ž˜ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•œ๋‹ค.

4-1. Docker-compose.yml

services:
  ...
  nginx:
    ...
    image: <niginx/Dockerfile์˜ ๋ณธ์ธ์ด ์‚ฌ์šฉํ•  DockerImage์˜ ์ด๋ฆ„์„ ์ ๋Š”๋‹ค.>
  web:
    ...
    image: <๋ณธ์ธ์ด ์‚ฌ์šฉํ•  DockerImage์˜ ์ด๋ฆ„์„ ์ ๋Š”๋‹ค.>

4-2. Docker-compose.prod.yml

services:
  ...
  nginx:
    ...
    logging:
      ...
      options:
        awslogs-group: <web๊ณผ ๊ฐ™์€ ๊ทธ๋ฃน์„ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ ์ž์œ ๋กญ๊ฒŒ ์ง€์ •ํ•ด๋„ ์ข‹๋‹ค.>
        ...
        awslogs-stream-prefix: <๋ณธ์ธ์ด nginx๋ฅผ ์•Œ์•„์ฐจ๋ฆด ์ˆ˜ ์žˆ์„๋งŒํ•œ Prefix๋ฅผ ์ง€์ •ํ•œ๋‹ค.>
  web:
    ...
      logging:
      ...
      options:
          awslogs-group: <nginx์™€ ๊ฐ™์€ ๊ทธ๋ฃน์„ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ ์ž์œ ๋กญ๊ฒŒ ์ง€์ •ํ•ด๋„ ์ข‹๋‹ค.>
          ...
          awslogs-stream-prefix: <๋ณธ์ธ์ด web์ž„์„ ์•Œ์•„์ฐจ๋ฆด ์ˆ˜ ์žˆ์„๋งŒํ•œ Prefix๋ฅผ ์ง€์ •ํ•œ๋‹ค.>

Production ํ™˜๊ฒฝ์œผ๋กœ ๋„์ปค ์‹คํ–‰ํ•ด๋ณด๊ธฐ

1. Docker ์‹คํ–‰

nginx, gunicorn์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š๊ณ  ์ง์ ‘ Docker์— ๋“ค์–ด๊ฐ€์„œ runserver๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

docker run -it -v $HOME/.aws/credentials:/root/.aws/credentials <DOCKER_FILE_NAME> /bin/bash

2. Docker-Compose ์‹คํ–‰

์‹ค์ œ ์„œ๋น„์Šคํ™˜๊ฒฝ๊ณผ ๋™์ผํ•˜๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

docker-compose up

3. Docker-Compose ๋ฐฐํฌ

docker-compose.prod.yml ์— aws logging ์„ค์ •์„ ๋ถ™์—ฌ์„œ ์‹คํ–‰ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

docker-compose -f docker-compose.yml -f docker-compose.prod.yml up

๋ฐฐํฌ

ECS CLI ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ์„ค์ •

๋งํฌ

  • ecsTaskExecutionRole ์ƒ์„ฑ
  • arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy ์— Attach
# ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์„ฑ
ecs-cli configure --cluster <Cluster ์ด๋ฆ„> --default-launch-type EC2 --region ap-northeast-2

ECS IAM ์‚ฌ์šฉ์ž ์ถ”๊ฐ€

  • IAMFullAccess
  • AmazonECS_FullAccess
  • AmazonSSMFullAccess

๋ฐฐํฌ ํ™˜๊ฒฝ ์„ค์ •

1. ecs-params.yml

Parameter Store ์„ค์ •๋ฐฉ๋ฒ•

๋ฐฐํฌ ๋ช…๋ น์–ด

# ๋ฐฐํฌ!
ecs-cli compose --file docker-compose.yml --file docker-compose.prod.yml --project-name <Task ์ด๋ฆ„> up

TODO

  • ๋ฐฐํฌ ์ตœ์ข… ๋ชฉ์ ์ง€์— ๋„๋‹ฌํ–ˆ๋‹ค. ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…ํ•˜์ž

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published