[Django REST framework] 인스타그램 클론코딩(7) - AWS S3

woownsgud·2022년 9월 28일

참고사이트

[Django] AWS S3 Storage Connect(장고 S3 연결 이미지 업로드)

1. AWS S3에 들어가서 버킷 만들기 클릭



2. 버킷 이름 설정



3. 버킷 퍼플릭 액세스 차단 설정

처음에 들어가면 모든 퍼블릭 액세스 차단이 체크가 되어있는데 다시 클릭해서 차단을 다 풀고 맨 밑에만 체크해줍니다.


4. 버킷 생성

나머지는 기본값으로(건드지리 않음)으로 설정하고, 버킷 만들기 클릭

5. AWS IAM에서 사용자 추가 클릭



6. 사용자 추가

1) 사용자 이름과 AWS 액세스 유형을 액세스 키로 선택 후 다음



2) 그룹 생성 클릭



3) 그룹 이름을 적고 정책 필터에 s3 를 적어서 AmazonS3FullAccess 를 체크 한후 그룹 생성 클릭



4) 그룹이 잘 생성되었으면 다음 클릭



4) 태그는 입력 없이 다음 클릭



5) 사용자 만들기 클릭



6) 액세스 키는 다시 확인할 방법이 없으므로 csv를 다운로드 받아 잘 보관해둡니다.


7. Django에 S3 연동

1) boto3와 storages 설치

pip install boto3

pip install django-storages

2) settings.py에 코드 추가

INSTALLED_APPS = [
	.......
    .......
    
    'storages',
]    
    
AWS_ACCESS_KEY_ID = '[액세스 키]'
AWS_SECRET_ACCESS_KEY = '[액세스 시크릿 키]'
AWS_REGION = 'ap-northeast-2'
AWS_S3_SIGNATURE_VERSION = "s3v4"

AWS_STORAGE_BUCKET_NAME = '버킷 이름'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.%s.amazonaws.com' % (AWS_STORAGE_BUCKET_NAME,AWS_REGION)
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
MEDIA_ROOT = os.path.join(BASE_DIR, 'path/to/store/my/files/')

3) Github에 커밋 및 푸시 후 Postman이나 RESTframework에 직접 들어가 이미지를 올리면 해당 버킷에 이미지 파일이 잘 올라가 있는지 확인할 수 있습니다.


8. 에러

이미지 파일을 직접 클릭했는데 이러한 오류가 뜰 수 있습니다. (AccessDenied)


해결

1) 해당 버킷에 들어가 버킷정책 편집 클릭



2) 버킷 정책 편집에 아래 코드를 넣어줍니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Mannual",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::[버킷 이름]/*",
                "arn:aws:s3:::[버킷 이름]"
            ]
        }
    ]
}


변경 사항 저장을 클릭하고 다시 이미지 확인을 해보면 정상적으로 나올겁니다.

0개의 댓글