Mr. Editor-in-chief Mr. Editor-in-chief February 9, 2022 Updated April 24, 2026

Django & AWS S3 Storage

AWS Set Up

Create & Set Up A User
- IAM -> Users -> [User Name] -> Permissions -> Attach polity directly (AmazonS3FullAccess) OR Add user to a group with AmazonS3FullAccess
- IAM -> Users -> [User Name] -> Security credentials -> Create access key -> Application running outside AWS - Write down 'Access key' & 'Secret access key' for later usage

Create & Set Up A S3 Bucket
Amazon S3 -> Buckets -> [Bucket Name] -> Permissions -> Bucket policy (Edit)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicRead",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::[Bucket Name]/*"
        }
    ]
}

Django Set Up

pip install django-storages boto3
# settings.py
AWS_ACCESS_KEY_ID = config('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = config('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = config('AWS_STORAGE_BUCKET_NAME')
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.ap-northeast-1.amazonaws.com'
AWS_S3_OBJECT_PARAMETERS = {'CacheControl': 'max-age=86400'}
# AWS_DEFAULT_ACL = None
AWS_DEFAULT_ACL = 'public-read'

AWS_LOCATION = 'static'
STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/{AWS_LOCATION}/'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/'
# MEDIA_ROOT = MEDIA_URL
AWS_S3_FILE_OVERWRITE = False
DEFAULT_FILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
python manage.py collectstatic