Yang 코딩 공부

AWS S3 버킷 생성하기 본문

AWS

AWS S3 버킷 생성하기

코딩하는 Yang 2022. 7. 15. 14:31

AWS S3 사용 가이드

: Amazon Simple Storage Service(Amazon S3)

Simple Storage Service의 약자로 파일 서버의 역할을 하는 서비스다. 일반적인 파일서버는 트래픽이 증가함에 따라서 장비를 증설하는 작업을 해야 하는데 S3는 이와 같은 것을 대행한다. 트래픽에 따른 시스템적인 문제는 걱정할 필요가 없어진다. 또 파일에 대한 접근 권한을 지정 할 수 있어서 서비스를 호스팅 용도로 사용하는 것을 방지 할 수 있다. 아래는 S3의 주요한 기능적인 특성들이다.

AWS S3(Simple Storage Service의 특징

  • 많은 사용자가 접속을 해도 이를 감당하기 위해서 시스템적인 작업을 하지 않아도 된다.
  • 저장할 수 있는 파일 수의 제한이 없다.
  • 최소 1바이트에서 최대 5TB의 데이터를 저장하고 서비스 할 수 있다.
  • 파일에 인증을 붙여서 무단으로 엑세스 하지 못하도록 할 수 있다.
  • HTTP와 BitTorrent 프로토콜을 지원한다.
  • REST, SOAP 인터페이스를 제공한다.
  • 데이터를 여러 시설에서 중복으로 저장해 데이터의 손실이 발생할 경우 자동으로 복원한다.
  • 버전관리 기능을 통해서 사용자에 의한 실수도 복원이 가능하다.
  • 정보의 중요도에 따라서 보호 수준을 차등 할 수 있고, 이에 따라서 비용을 절감 할 수 있다. (RSS)

AWS S3(Simple Storage Service에서 사용되는 용어

  • 객체 - object, AWS는 S3에 저장된 데이터 하나 하나를 객체라고 명명하는데, 하나 하나의 파일이라고 생각하면 된다.
  • 버킷 - bucket, 객체가 파일이라면 버킷은 연관된 객체들을 그룹핑한 최상위 디렉토리라고 할 수 있다. 버킷 단위로 지역(region)을 지정 할 수 있고, 또 버킷에 포함된 모든 객체에 대해서 일괄적으로 인증과 접속 제한을 걸 수 있다.
  • 버전관리 - S3에 저장된 객체들의 변화를 저장. 예를들어 A라는 객체를 사용자가 삭제하거나 변경해도 각각의 변화를 모두 기록하기 때문에 실수를 만회할 수 있다.
  • RSS - Reduced Redundancy Storage의 약자로 일반 S3 객체에 비해서 데이터가 손실될 확률이 높은 형태의 저장 방식. 대신에 가력이 저렴하기 때문에 복원이 가능한 데이터, 이를테면 섬네일 이미지와 같은 것을 저장하는데 적합하다. 그럼에도 불구하고 물리적인 하드 디스크 대비 400배 가량 안전하다는 것이 아마존의 주장
  • Glacier - 영어로는 빙하라는 뜻으로 매우 저렴한 가격으로 데이터를 저장 할 수 있는 아마존의 스토리지 서비스

-출처 https://dev.classmethod.jp/articles/for-beginner-s3-explanation/

1. 버킷 생성하기

  • aws 사이트 접속후 로그인 -> s3 서비스 접속

https://s3.console.aws.amazon.com/s3/home?region=ap-northeast-2

or

  • 킷 만들기 버튼 클릭

  • 버킷 이름 생성 및 AWS 리전 지역 선택

  • 버킷 퍼플릭 액세스 차단 설정 변경

: 퍼블릭 액세스는 기본적으로 모든 퍼블릭 액세스를 차단하게 되어있다.

ACL

  • : access control list
  • 객체 소유자 ,AllUsers, AuthenticatedUsers 기본으로 3가지 ACL가 있고 새 ACL를 추가할 수 있다.
  • Amazon S3는 미리 정의된 AllUsers 또는 AuthenticatedUsers 그룹의 구성원에게 권한을 부여하는 경우 버킷 또는 객체 ACL을 퍼블릭으로 간주합니다.

퍼블릭 액세스란 : 위에 설명된 버킷 또는 객체 ALC들을 퍼블릭으로 간주하고 이들에게 접근을 허용할 지 안할지를 정하는 것이다.

허용하지 않으면 객체소유자 외에는 해당 버킷 및 객체에 접근할 수 가 없다.

가장 첫 번째 부분을 체크해두면, 공개 설정으로 해둔 파일을 업로드 할 때, 업로드가 거절이 됩니다. 체크를 해제하면 공개 파일을 업로드 할 때 업로드가 됩니다.두 번째의 경우, 첫 번째 체크를 해제 하더라도, 비공개로 인식해서 공개가 되지 않습니다.

즉 bucket를 비공개로 사용하겠다고 하면 체크를 하는것이 좋고, 업로드하는 파일중 어떠한것들은 공개 하고 싶다 라고 하면 체크를 해제하는것이 좋습니다

  • IAM 사용자 추가하기

1. IAM 페이지 이동

2. 사용자 페이지 이동 -> 사용자 추가 버튼

3. 사용자 이름 입력 -> 다른 사용자 추가 -> 액세스 키 프로그래밍 방식 체크 ->다음 권한

4. 사용자 권한 및 그뤂 추가

그뤂 생성 -> 그뤂생성 버튼 클릭

5. 태그 추가 -> 패스

6. 검토

 

7. 사용자 추가 성공 시 액세스 키 빛 비밀 엑세스키 발급

8 소스코드 세팅

  • 필요 패키지
    • pip install boto3
  • pip install Django-storages

: AWS S3 STATIC, MEDIA 위치 지정

storages.py 추가 (프로젝트/storages.py)

import os
from django.utils.encoding import filepath_to_uri
from django.conf import settings
from tempfile import SpooledTemporaryFile
from storages.backends.s3boto3 import S3Boto3Storage


class StaticS3Boto3storage(S3Boto3Storage):
    location = 'static'


class MediaS3Boto3storage(S3Boto3Storage):
    location = "media"
    file_overwrite = False

    def path(self, name):
        if os.environ.get("DJANGO_SETTINGS_MODULE") == "config.settings.prod":
            return "https%s//생성한버킷이름-s3.s3.ap-northeast-2.amazonaws.com/media/" % (":") + name

    def _save_content(self, obj, content, parameters):
        content.seek(0, os.SEEK_SET)

        content_autoclose = SpooledTemporaryFile()

        content_autoclose.write(content.read())

        super(MediaS3Boto3storage, self)._save_content(obj, content_autoclose, parameters)


        if not content_autoclose.closed:
            content_autoclose.close()

 

setting.py 세팅

AWS_ACCESS_KEY_ID = "발급받은 엑세스 키 id"
AWS_SECRET_ACCESS_KEY = "발급 받은 시크릿 키 id"
AWS_REGION = 'ap-northeast-2'
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', #하루동안은 캐쉬 유지해라
}
AWS_LOCATION = 'static'
AWS_DEFAULT_ACL = 'public-read'

STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN,AWS_LOCATION)

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

STATICFILES_STORAGE = 'config.storages.StaticS3Boto3storage'
DEFAULT_FILE_STORAGE = 'config.storages.MediaS3Boto3storage'

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
  • 업로드 명령어 python manage.py collectstatic --noinput
  • --noinput -> 사용자에게 질문을 받지않고 바로 실행하라 는 명령어