[Django/ 배포하기 (AWS - EC2, RDS, S3)]

SooYeon Yeon·2022년 7월 2일
1

Django

목록 보기
15/20

AWS

EC2

  • 클라우드 상에서 이용 가능한 가상의 컴퓨터(인스턴스) (vmware에서 쓴 컴퓨터처럼)

  • 웹서버 + diango 연동

  • 한 달에 750시간 무료

블록 스토리지 서비스(EBS) : 가상의 하드디스크 (운영체제 있어야 사용가능)

RDS

  • 클라우드 상에서 이용 가능한 가상의 컴퓨터인데 DB 서버 프로그램만 다룰 수 있는 컴퓨터

  • 한 달에 750시간 무료

S3

  • 객체 스토리지 서비스, 인터넷 저장소 (네이버클라우드나 구글클라우드 같은거)

인스턴스 - 가상의 컴퓨터

볼륨 -가상의 하드디스크

보안그룹 - 방화벽

파티션 - 물리적인걸 논리적으로 쪼갠 것

키 페어 - 키 세트(암호화 복호화 키) 잃어버리면 복잡해짐

AWS이용하기

EC2

EC2 검색 → 인스턴스 만들기 →윈도우 운영체제 → 기본값 설정 → 상태 : 실행중, 상태검사 통과→ 인스턴스 체크 후 연결 → RDP → 암호 가져오기에서 key 파일 입력 → 원격 데스트톱 파일 다운로드 및 실행 → 암호입력 → 접속

  1. 가상머신(원격)에서 내 원래 컴퓨터에 있던 python 파일을 복사해 가상머신에 붙여넣기 해줌

  2. 설치시 customize해서 환경변수도 check

  3. cmd에서 pip 확인

  4. VC_redist.x64파일 가상머신에 복사 붙여넣기 후 실행, httpd-2.4~~ 도 복붙 후 압축 풀어서 Apache24폴더만 C드라이브에 넣기

  5. Apache24에서 bin → httpd.exe 실행하면 웹서버가 되는 것

  6. 둘다 방화벽 0번포트 접속 허용이 되어야함 (방화벽 끄기)

  7. check firewall status 검색해서 Turn window~~~ 에서 Turn off 시킴

  8. 퍼블릭, 프라이빗 IPv4 주소 나눠져 있음 (포트포워딩과는 조금 다름)

  9. 인스턴스 자세히보기

    → 내부만 할땐 프라이빗, 외부하면 퍼블릭 해야함

    → 보안그룹 클릭

inbound

  • 밖에서 안쪽으로 들어오는 네트워크트래픽

outbound

  • 내 컴퓨터에서 바깥쪽으로 나가는 네트워크 트래픽
  1. Apache는 HTTP, 80번 포트를 사용하기떄문에 인바운드 규칙 편집 눌러서 유형 HTTP선택

  2. 바인드IP주소

  • 지금 이 컴퓨터에 80번포트로 통신할 수 있는 IP주소(127이면 자기자신, 0000이면 모든, 사설일때 같은 네트워크대역은 올수있음, 다른 네트워크대역은 안됨(안보이는곳))

  • 모든 사용자들에게 다 제공해주기 위함이기 때문에 0.0.0.0/0으로 설정해줌

이제 내 퍼블릭 IPv4 주소를 주소창에 입력하면 접속할 수 있게 됨

장고랑 연결해야하는데, Apache같은 것으로 장고를 연결할것

CGI

  • 전통적인 방식, 웹서버 프로그램이 다른 프로그램을 실행시키고 싶을 때 (어떤 프로그램인지 상관없이) 사용하는 방법.
  • Common Gateway Interface

WSGI

  • 좀더 발전됨. 웹서버 프로그램이 다른 프로그램을 실행시키고 싶을 때 쓰는 표준 양식

장고에서 wsgi 이용할 것임. 장고에 wsgi.py가 있음

웹서버 프로그램 설정

  1. AWS 인스턴스

  2. mod_wsgi-4.9.2~ 이걸 원격 C드라이브에 설치하고 명령어 실행

    리눅스에서는 pip install로 함.

pip install c:\mod_wsgi-4.9.2-cp39-cp39-win_amd64.whl

밑 명령어 쳐서 잘 설치 되었는지 확인

mod_wsgi-express

해당 명령어 확인 - 여기 나온 결과를 나중에 Apache에 사용할 것임

mod_wsgi-express module-config

장고에서 설정

settings.py

  • 장고에서 에러메시지 출력해주는 부분을 사용자한테 보이면 안되기 때문에
DEBUG = False 
  • 접속 허용해주는 HOST 설정 (다 허용)
ALLOWED_HOST = ['*',]

Terminal

  • 추가한 라이브러리 목록을 보여줌
pip freeze
  • 원격에는 라이브러리가 설치 되어있지 않기때문에 목록으로 만들고, 그 목록을 옮겨 설치할 것임
  • 출력되는 내용이 파일에 저장 될 것임
pip freeze > requirements.txt

다시 원격 컴퓨터

  • 배포하려는 web 프로젝트를 복사하여 원격 컴퓨터 C드라이브에 복사 붙여넣기

Apache폴더 > conf > httpd.conf 파일 메모장으로 열기

제일 밑에 아까 명령어로 얻은 결과, 경로 복붙(c드라이브 밑에 우리 프로젝트의 config안에 wsgi.py의 경로를 지정)

LoadFile "C:/Users/Administrator/AppData/Local/Programs/Python/Python39/python39.dll"
LoadModule wsgi_module "C:/Users/Administrator/AppData/Local/Programs/Python/Python39/lib/site-packages/mod_wsgi/server/mod_wsgi.cp39-win_amd64.pyd"
WSGIPythonHome "C:/Users/Administrator/AppData/Local/Programs/Python/Python39"

WSGIScriptAlias / "C:\<Project 폴더>\<Project 안의 설정 폴더>\wsgi.py"

WSGIPythonPath "C:\<Project 폴더>"

<Directory "C:\<Project 폴더>\<Project 안의 설정 폴더>">
	<Files wsgi.py>
		Require all granted
	</Files>
</Directory>

Alias /static/ C:/<Project 폴더>/static/

<Directory C:/<Project 폴더>/static/>
	Require all granted
</Directory>

Alias /media/ C:/<Project 폴더>/media/

<Directory C:/<Project 폴더>/media/>
	Require all granted
</Directory>

  • cd로 web 프로젝트 폴더로 가서 requirements.txt 파일에 대한 라이브러리를 설치해주기
$ cd /
$ cd web
$ pip install -r requirements.txt
  • 현재 DB의 설정 (HOST,PORT)가 가상머신VM에 되어있는 상태로 바꾸어 줘야함.

  • 가상머신 web폴더 config settings.py에서 DB 부분을 default상태로 바꿔줌

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
  • 정보를 바꿨기 때문에 cmd에서 migration
python manage.py makemigrations
python manage.py migrate
  • Apache 웹서버 종료 후 다시 키기

RDS

AWS RDS 검색 → 데이터베이스 생성 MariaDB, 프리티어

  1. 스토리지 자동조정 활성화 끔 (자동으로 늘리지않을것임, 돈나올수도 있으니까)

  2. 퍼블릭 액세스 여기서는 예로 바꿔주려함(원래 DB는 그러면안되는데)

  3. VPC 보안 그룹 새로생성으로 해주고 이름 db_sg로해줌

  4. 데이터베이스 옵션 추가구성에 초기 데이터베이스 이름 우리가 쓰던거에 맞게 web이라고 할것임

  5. 여기서는 백업 비활성화할거

  6. 암호화도 안할거 유지관리 마이너도 비활성화

  7. DB 방화벽 설정

자세한 정보 → 보안그룹 클릭 → 인바운드 설정 (현재 소스가 1.11.90.40/32인데 이 앞에가 전부 일치해야만 허용해줄것임, 강의장에서만 DB접속. EC2컴퓨터의 웹서버-장고프로그램이 DB연결이 되어야하는것임(원격)) 그래서 바꿔줘야함. 인바운드 규칙 편집 0.0.0.0/0으로 바꿔줌 (원래는 이렇게 하면안됨)

  1. 본체에 heidi 클라이언트로 접속 (호스트명은 엔드포인트)

settings.py

  1. DATABASES 아까처럼 돌리기(원격)

  1. secret.json 내용 맞게 변경(원격)

  2. 바꿨으니 migrate 해주기

  3. 원래 runserver 해주면 특정 폴더 안에 위치를 잘 찾아갔음. 그런데 Apache프로그램으로 장고를 실행시켰을 때 경로를 찾아가지못해서 admin페이지의 css, js가 적용이 안됨

  4. 클라우드의 인스턴스(가상머신)에서 web 프로젝트의 config → settings.py에 해당 명령어 추가

  5. static_dirs는 지움

STATIC_ROOT=os.path.join(BASE_DIR,'static')

  1. static파일들을 static root로 collect
cd c:\web
python manage.py collectstatic

  1. Apache 프로그램 껐다 키고 admin이 잘 css적용한 채로 뜨면 됨

도메인 설정

내도메인한글에서 가입해서 등록

일반도메인 검색해서 검색 후 등록

DNS고급설정에서 IP연결 www / EC2의 public IP주소

S3

  • AWS에서 제공하는 스토리지
  • 현재는 파일시스템에 이미지같은게 저장되어 용량이 부족해질수도 있음

S3 검색 → 버킷 만들기 → 기본값 → 만들고 이름 클릭 → 권한 파트 → 퍼블릭 액세스 차단 편집, 모든퍼블릭액세스 차단 해제하고 변경사항 저장

  1. 버킷 정책 편집 눌러서 밑 부분 입력 (ysy-s3은 아까 정한 이름), 접근하는 사람을 모두로 하겠다.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::ysy-s3/*"
        }
    ]
}
  1. 객체 소유권 설정 - ACL 화렁화됨, 버킷 소유자 선호로 선택

  2. 서비스 검색 IAM (우리 프로그램이 s3이용할때, IAM을 통해 키를 발급받음)

  3. 사용자 눌러서 사용자 추가 사용자이름 ysy-s3, 증명유형 액세스키

  4. 그룹생성(이름 아무거나 ysy-s3), 정책 검색 s3full 이라고 검색하고 체크하고 그룹생성 다음(태그는없어도됨) 사용자 만들기

  5. 장고에 액세스키ID, 비밀엑세스키를 등록해야함. 기억하던가 csv로 하던가. 잃어버리면안됨

  6. csv에서 잘 보고 저장

  7. config에 asset_storage.py 생성

settings.py에 관련 설정추가

처음엔 public read인 부분을 먼저 주석해제하고 None주석하고

AWS_ACCESS_KEY_ID = ' '
AWS_SECRET_ACCESS_KEY = ' '
AWS_REGION = 'ap-northeast-2'
AWS_STORAGE_BUCKET_NAME = 'ysy-s3'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.%s.amazonaws.com' % (AWS_STORAGE_BUCKET_NAME, AWS_REGION)
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}

# https://arikong.tistory.com/21 참고
# https://intrepidgeeks.com/tutorial/aws-s3-access-denied-error-when-packet-policy-fails 참고
# https://kimcoder.tistory.com/381
AWS_DEFAULT_ACL = 'public-read'
#AWS_DEFAULT_ACL = 'None'
AWS_LOCATION = 'static'
AWS_MEDIA_LOCATION = 'media'

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/

STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATICFILES_DIRS = [
	os.path.join(BASE_DIR, 'static')
]

MEDIA_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_MEDIA_LOCATION)
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
 #  명령어로 설치 먼저해줘야함
pip install django-storages

pip install boto3

python manage.py collectstatic
  1. pubic read로 해서 안되면 None으로 했다가 다시 python manage.py collectstatic 명령어 실행

  2. 웹서버 재시작

  3. urls에

  • static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 지우기

0개의 댓글