S3 기본 설정

ian·2023년 6월 23일
4

S3

Amazon Simple Storage Service(S3)는 AWS에서 제공하는 객체 스토리지 서비스입니다. S3는 데이터를 안전하게 저장하고, 검색하고, 다른 AWS 서비스와 연동하여 활용할 수 있는 유연하고 신뢰할 수 있는 솔루션을 제공합니다.

버킷

  • S3에서 데이터를 저장하는 단위는 "버킷(Bucket)"입니다.
  • 버킷은 전역적으로 고유한 이름을 가져야 하며, 하나 이상의 객체를 포함할 수 있습니다.

버킷 설정

정적 웹사이트 호스팅

index.html 설정

Public 설정

Bucket Policy

  • Action : Bucket에 대해 어떤 작업을 허용할 지에 대한 내용입니다. 객체에 대해 읽기 작업을 하는 경우는 S3:getObject;라 명세하고, 쓰기 작업을 하는 경우 s3:putObejct; 와 같이 사용합니다.
  • Effect는 사용자가 특정 작업을 요청하는 경우의 결과입니다. 버킷에 대한 명령을 허락(allow)하거나 거부(deny) 할 수 있으며, 특정 사용자에 대해 명령을 제한하거나, 허용하는 식으로 사용이 가능합니다.
  • Resource는 대상 Bucket에 대한 명세를 진행합니다.
  • Principal은 특정 사용자에 대해 명세해주는 작업을 합니다.
{
    "Version": "2012-10-17",
    "Id": "정책 만들면 생성되는 id",
    "Statement": [
        {
            "Sid": "정책 만들면 생성되는 sid",
             "Effect": "Allow",
             "Principal": "*",
             "Action": "s3:GetObject",
             "Resource": "arn:aws:s3:::bucket_name/static/*"
         },
         {
            "Sid": "정책 만들면 생성되는 sid",
             "Effect": "Allow",
             "Principal": "*",
             "Action": ["s3:GetObject", "s3:DeleteObject", "s3:PutObject" ]
             "Resource": "arn:aws:s3:::bucket_name/media/*"
         },
         {
             "Sid": "정책 만들면 생성되는 sid",
             "Effect": "Allow",
             "Principal": {
             "AWS": "my-IAM"
             },
             "Action": [ "s3:GetObject","s3:DeleteObject", "s3:PutObject" ],
             "Resource": "arn:aws:s3:::bucket_name/*"
         }
    ]
}

ACL

ACL은 버킷이나 객체에 대해 요청자의 권한 허용 범위를 설정합니다.

  • 접근정책(ACL)은 개별 객체에 대한 액세스를 제한하거나 허용할 수도 있지만, 버킷정책(Bucket Policy)만큼 세분화된 액세스 모드를 제공하지 않습니다.
  • 모든 퍼블릭 액세스에 대해서 차단을 설정했다면, ACL에서 퍼블릭에 대한 권한을 설정하여도 변경되지 않습니다.
  • 접근정책(ACL)과 버킷정책(Bucket Policy)은 동시에 사용할 수 있습니다.
    접근정책(ACL)이 버킷에 대한 사용자 엑세스를 허용하지만, 버킷정책(Bucket Policy)이 해당 사용자 액세스를 거부하는 경우 사용자는 해당 버킷에 접근할 수 없습니다.
  • "ACL 비활성화"를 선택하면 개별 파일이나 폴더에 대한 ACL 설정은 적용되지 않으며, 오직 버킷 정책만이 액세스 권한을 결정합니다.

IAM User 권한 설정

packages 설치

  • boto3
  • django-storages

settings.py

INSTALLED_APPS = [
"storages"
]

.env 파일

AWS_ACCESS_KEY_ID='......'
AWS_SECRET_ACCESS_KEY='......'

env.py 설정 (.env파일 로드)

from functools import lru_cache
from pathlib import Path
from decouple import config as decouple_config, Config, RepositoryEnv
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
PROJECT_DIR = BASE_DIR.parent
ENV_FILE_PATH = PROJECT_DIR / ".env-prod"


@lru_cache()
def get_config():
    if ENV_FILE_PATH.exists():
        return Config(RepositoryEnv(str(ENV_FILE_PATH)))
    return decouple_config

config = get_config()

AWS 자격증명 설정


from core.env import config

AWS_ACCESS_KEY_ID=config("AWS_ACCESS_KEY_ID", default=None)
AWS_SECRET_ACCESS_KEY=config("AWS_SECRET_ACCESS_KEY", default=None)
AWS_S3_ADDRESSING_STYLE = "virtual"

AWS_STORAGE_BUCKET_NAME=config("AWS_STORAGE_BUCKET_NAME", default="estsoft-ormi-bookstore")
AWS_S3_REGION_NAME="ap-northeast-2"

AWS_DEFAULT_ACL="public-read"
AWS_S3_USE_SSL=True


DEFAULT_FILE_STORAGE = 'core.storages.backends.MediaStorage'
STATICFILES_STORAGE = 'core.storages.backends.StaticFileStorage'

https://github.com/jschneier/django-storages/issues/782

storage 설정 (django => s3boto)

django v4.2 이하

DEFAULT_FILE_STORAGE = 'core.storages.backends.MediaStorage'
STATICFILES_STORAGE = 'core.storages.backends.StaticFileStorage'
from storages.backends.s3boto3 import S3Boto3Storage
class MediaStorage(S3Boto3Storage):
    location = "media"

class StaticFileStorage(S3Boto3Storage):
    location = "static"



django v4.2 이상
STORAGES = {
    "staticfiles": {
        "BACKEND": "storages.backends.s3boto3.StaticFileStorage",
    },
    "default": {
        "BACKEND": "storages.backends.s3boto3.MediaStorage",
    }
}

이라고 공식 문서에 되어있으나 동작하지 않았음.
4.2이상 버전에서도, 4.2 이하버전으로 작성하니 동작됨

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

from storages.backends.s3boto3 import S3Boto3Storage
class MediaStorage(S3Boto3Storage):
    location = "media"

class StaticFileStorage(S3Boto3Storage):
    location = "static"
python manage.py collectstatic

CORS 설정

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "HEAD",
            "PUT",
            "GET",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [
            "x-amz-request-id",
            "x-amz-server-side-encryption",
            "x-amz-version-id",
            "Content-Length",
            "Content-Type",
            "Connection",
            "Date",
            "ETag",
            "x-amz-delete-marker"
        ]
    }
]

https://docs.aws.amazon.com/ko_kr/sdk-for-javascript/v2/developer-guide/cors.html
https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/ManageCorsUsing.html
https://docs.aws.amazon.com/AmazonS3/latest/API/RESTCommonResponseHeaders.html

버킷 버전 관리

  • S3는 버전 관리 기능을 제공하여 객체의 버전을 관리할 수 있습니다.
  • 버전 관리를 활성화하면 객체의 수정, 삭제, 복원 등을 추적하고 관리할 수 있습니다.
  • 이를 통해 객체의 이전 버전을 복원하거나 삭제된 객체를 복구할 수 있습니다.
  • 또한 데이터의 안전한 보관과 복구를 위한 백업 솔루션으로 활용할 수 있습니다.
profile
Backend Developer

0개의 댓글