[Wagtail]에서 AWS S3를 사용해서 Media를 관리해보자

DARTZ·2022년 3월 17일
0

Django, Wagtail

목록 보기
1/5
post-thumbnail

서론

최근 Heroku를 통해 Web을 배포했다. Wagtail 배포에는 문제가 없었지만 관리자 페이지에서 미디어 파일 (사진)을 업로드가 되지 않았다.
알고보니 Heroku는 일시적인 하드 드라이드라서 파일을 write할 수는 있지만 지속되지 않는다고 한다.
Heroku문서

media 파일을 관리하려면 AWS의 S3를 사용하는 것을 추천하고 있다. 마침 관련 튜토리얼도 있어 이번 기회에 AWS S3를 사용해보려고 한다.

AWS S3란?

AWS S3는 클라우드 스토리지이다. Amazon Simple Storage Service의 약자로 아마존에서 제공하는 온라인 스토리지 웹 서비스이다. 일종의 데이터 저장소라고 보면 될 것이다.

Media 파일(사진이나 동영상 등)을 저장해야할 경우, 서버에 저장할 수도 있겠지만 서버의 용량이 커지고 그만큼 비용이 비싸지기 때문에 따로 Media 스토리지를 사용하여 관리하는 것이 현명할 것이다.


본론

Wagtail AWS S3 튜토리얼

AWS에 가입이 되어있다는 가정하에 작성해보도록 하겠다.

1) IAM User 설정하기

링크

대시보드 탭에서 사용자 메뉴로 들어가서 생성되어 있는 IAM User로 들어간다. 그리고 나서 보안 자격증명을 클릭하고 엑세스 키를 만들면 된다.

여기서 필요한 정보는
1. 엑세스 키 ID
2. 엑세스 암호
3. 사용자 ARN이다.

잘 적어놓도록 하자.

주의!
생성한 엑세스 키는 생성시에만 보거나 다운로드 할 수 있다. 꼭 다운로드 해서 보관 해놓자.

2) S3 버킷 생성

AWS S3로 이동해서 버킷을 생성해보자. AWS S3에 저장된 데이터를 객체라고 하는데 이 객체들을 그룹핑한 최상위 디렉토리를 버킷이라고 한다.

학습용으로 사용할 경우 5GB 프리티어를 이용해주면 된다.

버킷을 생성해줄 때, 이 버킷의 퍼블릭 액세스 차단 설정에서 1,2 체크를 해제 해주자.

3) 정책, Cors 설정

이제 버킷에 정책을 설정해줘야 하는데 생성된 버킷에 들어가서 권한 탭을 클릭하자.

스크롤을 내리다보면 버킷 정책과 Cors 설정이 나오게 되는데 편집을 누르고 아래와 같이 수정해주자.

버킷 정책

{
	"Version": "2008-10-17",
	"Statement": [
		{
			"Sid": "PublicReadForGetBucketObjects",
			"Effect": "Allow",
			"Principal": {
				"AWS": "*"
			},
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::BUCKET-NAME/*"
		},
		{
			"Effect": "Allow",
			"Principal": {
				"AWS": "USER-ARN"
			},
			"Action": "s3:*",
			"Resource": [
				"arn:aws:s3:::BUCKET-NAME",
				"arn:aws:s3:::BUCKET-NAME/*"
			]
		}
	]
}

여기서 USER-ARN은 아까 IAM의 필요정보 3번인 사용자 ARN을 적고 BUCKET-NAME은 버킷을 생성할 때, 사용한 버킷 이름을 적어준다.

CROS

[
    {
        "AllowedHeaders": [
            "Authorization"
        ],
        "AllowedMethods": [
            "GET"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [
            "x-amz-server-side-encryption",
            "x-amz-request-id",
            "x-amz-id-2"
        ],
        "MaxAgeSeconds": 3000
    }
]

위와 같이 설정를 해준다. 여기서 AllowedOrigins가 CORS IP를 설정하는 부분이다.
특정 사이트에 대해서만 허용하고 싶다면 (일반적으로 서비스하는 경우) 해당 url를 적어주면 된다.

4) Wagtail 설정

아래 명령어를 실행시켜주자

pip install django-storages
pip install boto3
pip freeze > requirements.txt

base.py 수정

installed_apps에 'storages'를 추가한다.

INSTALLED_APPS = [
    ...
    'storages',
    ...
]


AWS_STORAGE_BUCKET_NAME = '####'
AWS_ACCESS_KEY_ID = '####'
AWS_SECRET_ACCESS_KEY = '####'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME

차례로 AWS 버킷 이름, 엑세스 키 ID, 엑세스 키를 입력해주면 된다.

Production.py 수정

MEDIA_URL = "https://%s/" % AWS_S3_CUSTOM_DOMAIN
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

결론

Wagtail에서 AWS S3를 사용하여 Media 파일을 관리하는 방법에 대해서 알아봤다. 웹을 구축하는 것도 중요하지만 효율적으로 배포하고 관리하는 것도 못지 않게 중요하다고 생각된다.
원래 AWS로 배포가 어려워서 Heroku를 사용했었는데 결국에는 AWS를 사용하게 되는 것 같다.
이번 기회에 다시 AWS로 넘어 가봐야겠다.

profile
사람들이 비용을 지불하고 사용할 만큼 가치를 주는 서비스를 만들고 싶습니다.

0개의 댓글