프로젝트를 배포 할 때, 서버에 웹서버를 구축하고, 데이터베이스 서버도 구축하고, 서버 내에서 정적파일들도 관리를 해 준다.
이렇게 서버를 구축하면 서버가 무겁고 관리하기가 어려워지기 마련이다.
그래서 AWS를 사용하면서 많은것들을 이용해서 편리하게 배포를 진행 할 수 있다.
웹서버
AWS EC2 : 가상서버를 통해 직접 서버 구축
AWS ElasticBeanstalk : 웹 서비스 간편 배포/확장 서비스
AWS lamnda : serverless
데이터베이스 서버
AWS EC2에 직접 구축
AWS RDS(Relational Database Service) : Database as a Sevice
스토리지 서버
AWS EC2에 직접 저장/서빙
AWS S3( Simple Storage Service )
캐시서버
AWS EC2에 직접 설치
Elastic Cache: Redis, Memcached
AWS RDS(Relational Database Service)
데이터베이스 서비스
데이터베이스를 사용하기 위해선 일단 서버에서 데이터베이스를 위한 포트가 개방되어야 한다
mysql을 사용할 것이기 때문에 포트 3306번을 여는 보안그룹을 ec2에서 생성한다


보안그룹을 생성했으면 RDS로 이동한다


아랫부분을 보면 프리티어가 사용할 수 있는 목록을 보여주는 옵션 체크란이 있다.

개발 테스트용으로 선택한다( 프리티어를 위한 것, 나머지는 과금위험 )

이 부분에서도 프리티어를 위한 옵션만 보여주는 기능이있다. 이를 체크하고 디폴트 값으로 진행

마지막으로 identifier와 유저이름/패스워드를 입력하고 이를 기록해놓고 다음으로 넘어간다

이 부분은 디폴트값으로 진행

IAM 유저가 접근 가능하도록 해놓고 진행한다
런쳐를 누르면 디비가 생성되기 시작하고 몇분 뒤에 available 상태로 변경되면 사용 할 수 있다.
AWS S3( Simple Storage Service )


프로젝트의 정적/동적 파일들을 관리할 스토리지의 이름을 지정
다음으로 넘어가서 속성/권한 설정은 디폴트로 넘어간다
그리고 버킷을 생성한 후에 설정으로 들어가서 권한 설정을 바꿔준다

생성된 버킷의 권한 설정을 들어가게되면, Everyone의 권한을 설정하는 창이 있는데,
여기에서 "이 버킷의 ACL에 액세스"부분의 읽기 권한을 줘야만 모든 사용자가 정적파일을 읽어들여서
프로젝트의 css,js 등이 동작할 수 있게된다
이제 배포 설정을 해야한다
S3를 위한 IAM 유저 생성
이전에 IAM유저 생성할 때와 동일한 방식으로 생성하되, 권한은 S3FullAccess 권한을 준 그룹을 생성하고,
그에 속하는 유저를 생성한다
이때 생성되는 ACCESS/SECRET KEY도 잘 보관해 두어야 한다
배포를 위한 settings / requirement 분기
settings
- common.py
- dev.py( 개발용 )
- prod.py( 배포용 )
reqs
- common.txt
- dev.txt (개발용)
- prod.txt (배포용)
배포용 reqs/prod.txt
django-storages : static/media 저장/서빙을 S3에서 처리하는 라이브러리
boto3 : AWS SDK
pymysql : Pure Python MySQL Client
배포용 settings/prod.py
from .common import *DEBUG = FalseALLOWED_HOSTS = ['*']# RDS를 위한 설정import osimport pymysqlpymysql.install_as_MySQLdb() # pymysql이 MySQLdb처럼 동작토록 세팅DATABASES = {'default': {'ENGINE': os.environ.get('DB_ENGINE', 'django.db.backends.mysql'),'HOST': os.environ['DB_HOST'],'USER': os.environ['DB_USER'],'PASSWORD': os.environ['DB_PASSWORD'],'NAME': os.environ['DB_NAME'],'PO RT': os.environ['DB_PORT'],},}# S3를 위한 설정INSTALLED_APPS += ['storages']# django-storages 앱 의존성 추가# 기본 static/media 저장소를 django-storages로 변경STATICFILES_STORAGE = 'develop_diary.storages.StaticS3Boto3Storage'DEFAULT_FILE_STORAGE = 'develop_diary.storages.MediaS3Boto3Storage'# S3 파일 관리에 필요한 최소 설정# 소스코드에 설정정보를 남기지마세요. 환경변수를 통한 설정 추천AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']AWS_STORAGE_BUCKET_NAME = os.environ['AWS_STORAGE_BUCKET_NAME'] # 필수 지정AWS_S3_REGION_NAME = os.environ.get('AWS_S3_REGION_NAME', 'ap-northeast-2')
프로젝트/storages.py( s3에서 static/media 파일이 섞이지 않도록 설정 )
from storages.backends.s3boto3 import S3Boto3Storageclass StaticS3Boto3Storage(S3Boto3Storage):location = 'static' # bucket 업로드 prefix 지정class MediaS3Boto3Storage(S3Boto3Storage):location = 'media' # bucket 업로드 prefix 지정
.ebextenstions/options.config
packages:yum:freetype-devel: []libjpeg-turbo-devel: []libpng-devel: []option_settings:aws:elasticbeanstalk:container:python:WSGIPath: 프로젝트/wsgi.py
pillow 라이브러리 설치를 위해 필요한 패키지를 yum을 통해서 직접 설치
static파일은 s3를 사용하므로 이전 설정 삭제
eb cli를 통해서 init -> create 를 실시하고
설정에서 뺀 내용들을 환경변수로 지정해줘야 정상적으로 동작한다
#> eb setenv \DJANGO_SETTINGS_MODULE=프로젝트.settings.prod_aws_eb \AWS_ACCESS_KEY_ID='' \AWS_SECRET_ACCESS_KEY='' \DB_HOST='' \DB_USER='' \DB_PASSWORD='' \DB_PORT='' \DB_NAME='' \AWS_STORAGE_BUCKET_NAME='' \AWS_S3_REGION_NAME='ap-northeast-2'
eb setenv 명령어를 통해서 eb환경에 환경변수를 설정한다.
RDS,S3에 필요한 정보들을 지정하고, 프로젝트를 구동시킬 때 settings를 prod로 지정해준다
이때 DB_PASSWORD 에 특수문자가 들어간다면 이 명령어를 통해서 지정할때 특수문자가 빠져서
프로젝트 시동할 때 디비에 연결되지 않아서 인터널 에러가 날 수 있다.
그러니 직접 콘솔에 들어가서 환경변수를 체크해주는 것이 좋겠다.
이제 로컬에서 settings를 prod로 지정하고 migrate, collectstatic을 하면 aws rds에 마이그레이션 되고,
s3에 정적파일이 모이는것을 확인 할 수 있다.
그리고 서버도 제대로 돌아간다
+)
s3를 사용하는 경우 CORS에러가 생길 수 있다.
이는 s3의 cors설정에 들어가서 규칙을 수정해주면 된다
<?xml version="1.0" encoding="UTF-8"?> <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <CORSRule> <AllowedOrigin>http://diary.jamiejang.me/</AllowedOrigin> <AllowedMethod>GET</AllowedMethod> <MaxAgeSeconds>3000</MaxAgeSeconds> <AllowedHeader>Authorization</AllowedHeader> </CORSRule> </CORSConfiguration>
AllowedOrigin 부분에 자신이 사용하는 도메인 이름을 적어주면 된다
+)
s3에 올린 파일들이 일정 시간이 지나면 서빙되지 않는 에러가 생겼는데,
이는 요청 URL에 expire 옵션이 3600으로 설정되어 전송되었기 때문에 일정시간이 지나 파기되어서 그랬다
그래서 settings에 AWS_QUERYSTRING_AUTH = False 옵션을 주어서 계속 사용가능하도록 만들었다
askdjango페이지에서 도움을 받았습니다 감사합니다
이 모든 내용은 AskDjango 강의를 통해서 배웠습니다 감사합니다.
댓글
댓글 쓰기