웹 프로그래밍 스쿨 django 수업 4주차 포스팅입니다!😃

 

 

벌써 장고를 배운지 한달이 다 되어가고 있는데요!

 

그동안 수업을 진행하면서 완성했던 어플리케이션을 aws, heroku, pythonanywhere 에

배포하는 방법에 대해 배웠는데, 그 중 aws의 s3에 대해 간단히 포스팅 해보겠습니다.

 

 

 

1.  AWS 란?

 

Amazon Web Service 는 아마존에서 제공하는 클라우드 서비스로,

네트워킹을 기반으로 가상 컴퓨터와 스토리지, 네트워크 인프라 등 을 제공합니다.

 

여기서 클라우드 서비스란 기존의 물리적인 형태의 실물 컴퓨팅 리소스를

네트워크 기반 서비스 형태로 제공하는 것으로서 

 

일시적으로 증가하는 리소스 필요에 대해 실물을 구입하는 것이 아닌

네트워크를 통해 리소스를 잠시 대여하고 사용한 리소스에 대한 비용만 지불하는 방법으로

실물 리소스를 구입하는 것 보다 상대적으로 저렴한 비용으로 리소스를 이용할 수 있게 해줍니다.

 

 

 

https://commons.wikimedia.org/wiki/File:Cloud_Services.gif

 

 

 

2.  s3란?

 

AWS 서비스를 사용하면 여러대의 서버 인스턴스(컴퓨터)를 사용할 수 있는데

어떤 유저가 브라우저를 통해서 이미지 파일 업로드를 요청한다면 그 요청은 로드밸런서에 의해 선택된

인스턴스에 배정되고  해당 인스턴스에서 업로드 요청을 수행하게됩니다. 

 

 

 

 

인스턴스가 이미지 파일저장을 완료했다면 다른 인스턴스로 배정된 유저가 해당 이미지파일을 요청할 때를

대비해서 인스턴스간의 동기화작업이 필요한데 이 작업을 동기화보다 더 효율적으로 처리하기 위해

static파일을 저장 할 곳을 따로 두는 곳을 s3라고 합니다.

 

 

 

3.  boto3 란?

 

Boto3는 AWS에서 제공하는 파이썬 용 SDK(software development kit) 으로 boto3를 통해서 S3를 사용할 수 있습니다.

 

  • $ pip install boto3 명령어를 이용해  boto3를 설치합니다.
  • settings.py 파일에 boto3의 기본값으로 정할 변수들을 입력합니다.
  • 업로드 된 파일을 설정된 bucket에 저장 시킬 수 있습니다.

 

AWS_ACCESS_KEY_ID = ''
AWS_SECRET_ACCESS_KEY = ''

AWS_REGION = 'ap-northeast-2'
AWS_STORAGE_BUCKET_NAME = ''

AWS_S3_CUSTOM_DOMAIN = '%s' % AWS_STORAGE_BUCKET_NAME
AWS_S3_SECURE_URLS = False

AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}
AWS_DEFAULT_ACL = 'public-read'
AWS_LOCATION = 'static'

STATIC_URL = 'http://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

 

해당 변수들에 대한 자세한 설명은 아래 링크에서 확인할 수 있습니다.

 

 

https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#usage

 

 

 

 

4.  static 파일과 media 파일을 각 다른 bucket에 분리하기

 

 

1. media 파일을 연동할 버킷을 하나 더 생성합니다.

 

 

2. media 파일을 연동할 버킷을 default로 설정하고, static 파일을 연동시킬 새로운 버킷을 찾는 작업을 처리할

    파일의 경로를 STATICFILES_STORAGE 에 할당합니다.

 

AWS_STORAGE_BUCKET_NAME = ''  # 새로만든 bucket의 이름으로 수정합니다.

AWS_STATIC_STORAGE_BUCKET_NAME = '' # 새로운 변수에 기존 bucket의 이름을 할당합니다.
AWS_STATIC_CUSTOM_DOMAIN = '%s' % AWS_STATIC_STORAGE_BUCKET_NAME

STATIC_URL = 'http://%s/%s/' % (AWS_STATIC_STORAGE_BUCKET_NAME, AWS_LOCATION)
STATICFILES_STORAGE = 'config.static_storage.SetStaticStorage'
					# 기존 주소를 찾게 할 customed boto3 를 실행할 파일경로를 입력합니다.

 

 

3. static 파일을 기존의 버킷으로 연동하기 위해서는 default가 아닌 경로로 bucket을 찾아야 하므로 

     boto3에 매개변수를 전달해주기 위해 S3Boto3Storage 를 상속받아 bucket_name과 custom_domain을

     오버라이딩 하는 SetStaticStorage 클래스를 만들면 static 파일과 media 파일을 각각의 bucket 에서 관리할 수 있습니다.

 

from storages.backends.s3boto3 import S3Boto3Storage
from storages.utils import setting

class SetStaticStorage(S3Boto3Storage):
    bucket_name = setting('AWS_STATIC_STORAGE_BUCKET_NAME')
    custom_domain = setting('AWS_STATIC_CUSTOM_DOMAIN')

 

 

 

 

웹 프로그래밍 스쿨에 대해 더 알아보기 ⭐

 

 

BELATED ARTICLES

more