Skip to content

LOGBOOK 2020.03.06 FRI

ghilbut edited this page Mar 8, 2020 · 1 revision
  • MacBook Pro (15-inch, 2017)
  • macOS Catalina 10.15.3

개요

  • 모노리포
    build-your-first-service
      │
      ├ django
      │
      ├ terraform
      │   ├ environments
      │   │   ├ common
      │   │   ├ develop
      │   │   └ release
      │   └ modules
      │
      ├ vue.js
      │
      ├ LICENSE
      └ README.md
    
  • Stacks
    • Terraform 0.12
    • Django 3.0
    • Vue.js 2
    • iOS(?)
    • Android(?)

A. Initialize Django project for local stage

A1. Create Django project with Pipenv

$ mkdir django django/src
$ cd django
$ pipenv --python 3.8
$ pipenv install django~=3.0.4
$ pipenv run django-admin startproject byfs ./src
$ pipenv run ./src/manage.py runserver 0:8000
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

February 26, 2020 - 04:50:11
Django version 3.0.3, using settings 'byfs.settings'
Starting development server at http://0:8000/
Quit the server with CONTROL-C.

A2. Run MySQL with docker-compose

  • django/docker-compose.yml

    version: '3.7'
    networks:
      byfs:
    services:
      mysql:
        container_name: mysql
        command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
        environment:
          - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-rootpw}
          - MYSQL_DATABASE=${MYSQL_DATABASE:-byfs}
          - MYSQL_USER=${MYSQL_USER:-byfs}
          - MYSQL_PASSWORD=${MYSQL_PASSWORD:-byfspw}
        image: mysql:5.7
        networks:
          - byfs
        ports:
          - 3306:3306
        restart: always
        volumes:
          - ./db/mysql/data:/var/lib/mysql
          - ./db/mysql/init:/docker-entrypoint-initdb.d
    # run MySQL
    $ docker-compose up -d
    
    # stop MySQL
    $ docker-compose down

A3. Bind Django and MySQL

  • django/src/byfs/settings.py
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': os.environ.get('BYFS_DB_DEFAULT_NAME', 'byfs'),
            'HOST': os.environ.get('BYFS_DB_DEFAULT_HOST', '127.0.0.1'),
            'PORT': os.environ.get('BYFS_DB_DEFAULT_PORT', '3306'),
            'USER': os.environ.get('BYFS_DB_DEFAULT_USER', 'byfs'),
            'PASSWORD': os.environ.get('BYFS_DB_DEFAULT_PASSWORD', 'byfspw'),
            'CONN_MAX_AGE': 60,
        }
    }
    
$ pipenv install mysqlclient~=1.4.6
$ pipenv run ./src/manage.py makemigrations
$ pipenv run ./src/manage.py migrate
$ pipenv run ./src/manage.py createsuperuser
Username (leave blank to use 'ghilbut'): ↵
Email address: ↵
Password: ********↵
Password (again): ********↵
Superuser created successfully.

pipenv run ./src/manage.py runserver 0:8000
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
March 06, 2020 - 12:06:50
Django version 3.0.4, using settings 'byfs.settings'
Starting development server at http://0:8000/
Quit the server with CONTROL-C.

B. Initialize AWS for Terraform

B1. Create S3 bucket for terraform states

Name: byfs-terraform

B2. Create IAM for terraform backend and provider

Name: byfs

Tags

  • Name: byfs
  • organization: platform
  • owner: devops

Inline Policy

  • Name: terraform-states

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucket",
                    "s3:GetBucketLocation",
                    "s3:ListBucketMultipartUploads"
                ],
                "Resource": [
                    "arn:aws:s3:::byfs-terraform"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject",
                    "s3:PutObjectACL",
                    "s3:GetObject",
                    "s3:GetObjectACL",
                    "s3:DeleteObject",
                    "s3:ListMultipartUploadParts",
                    "s3:AbortMultipartUpload"
                ],
                "Resource": [
                    "arn:aws:s3:::byfs-terraform/*"
                ]
            }
        ]
    }
    
  • ~/.aws/credentials

    ...
    
    [byfs]
    aws_access_key_id=********
    aws_secret_access_key=********

C. Create remote MySQL for develop environment

C1. Create physical MySQL on AWS RDS with Terraform

Set backend

  • terraform/environments/common/main.tf

    terraform {
      required_version = "~> 0.12.6"
    
      backend s3 {
        # s3://<bucket>/<workspace_key_prefix>/<workspace-name>/<key>
        bucket  = "byfs-terraform"
        key     = "terraform.tfstate"
    
        profile = "byfs-terraform"
        region  = "ap-northeast-2"
        encrypt = true
      }
    }
    
    provider aws {
      region  = var.aws_region
      profile = var.aws_profile
    }
  • terraform/environments/common/variables.tf

    variable aws_region {
      type = string
      default = "ap-northeast-2"
    }
    
    variable aws_profile {
      type = string
      default = "byfs"
    }
$ terraform init
$ terraform apply

C2. Create logical database for dev stage

C3. Separate Django setting to local and dev stage

D. Deploy Django to dev stage with AWS ECS Fargate

D1. Make Django docker image and push to docker-hub

D2. Create AWS common services

D3. Create AWS ECS Fargate