# Using AWS to Store the Static and Media Files From
## 1. Setting Up S3 bucket Configuration ON AWS
- **Head over to [AWS Sign in Link](https://console.aws.amazon.com/console/home?nc2=h_ct&src=header-signin)**
- **Select S3 From The Search Bar**

- **Create a New Bucket With A Name**

- **Give Bucket A Name**

**Note Down:**
- Bucket Name
- Region
- **Unselect Block All Public Access**

> Caveats: Do not Allow Public Access By Default. This is just for a demo purpose.
## 2. Configuring IAM Roles and User For the Bucket
> At this step we'll create a user and a **AWS_ACCESS_KEY** and **AWS_ACCESS_KEY_SECRET** to be used with our django app
- **Head over to IAM Roles Management Page and select the Users**


On the very next screen after creating a user, you'll be prompted with what access should be provided to this user. Select the One With **AmazonS3FullAccess** then procede to next screen and create a user

To create an access credentials for the user Head Over to the Users Screen and select the user created.

On the next screen select **Security Credentials**

At the bottom of a page, you can find an option to create an ACCESS KEYs for the user as:

On the next screen, you'll be prompted with option to describe how would you intend to use the user's credentials for:
Select Local Code as we are going to access the objects on buckets programatically.

Then provide a Tag Value to Identify the Resource Cost and Access Details for the Bucket.
Copy the Access Keys from this screen

So far We created a user and the necessay credentials to use in our django app
```js
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_STORAGE_BUCKET_NAME=
AWS_S3_REGION_NAME=
```
## 3. Setting Up S3 storage on Django App
**Setting Up [django-storages](https://django-storages.readthedocs.io/en/latest/):**
- Insall django storages and boto3: ``pip install django-storages boto3 boto3 botocore``
- Add ``storages`` to the installed app.
```python
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
# libraries
"storages",
]
```
- Replace the settings for Staticfiles and Media files with the code below.
```python
if not DEBUG:
# aws settings
AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.getenv('AWS_STORAGE_BUCKET_NAME')
AWS_S3_REGION_NAME = os.getenv('AWS_S3_REGION_NAME')
AWS_DEFAULT_ACL = None
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'
AWS_S3_OBJECT_PARAMETERS = {'CacheControl': 'max-age=86400'}
# s3 static settings
STATIC_LOCATION = 'static'
STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/{STATIC_LOCATION}/'
STATICFILES_STORAGE = '<app>.storage_backends.StaticStorage'
# s3 public media settings
PUBLIC_MEDIA_LOCATION = 'media'
MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/{PUBLIC_MEDIA_LOCATION}/'
DEFAULT_FILE_STORAGE = '<app>.storage_backends.PublicMediaStorage'
# s3 private media settings
PRIVATE_MEDIA_LOCATION = 'private'
PRIVATE_FILE_STORAGE = '<app>.storage_backends.PrivateMediaStorage'
else:
STATIC_URL = '/staticfiles/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
MEDIA_URL = '/mediafiles/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'mediafiles')
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),)
```
**Note:** Make sure that all the variables are loaded from the environment variables
What we are doing with above configuration is, if it's not a debug mode, we'll override the default storage settings to use the storage with S3 bucket. Your .env file should look like below
```env
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_STORAGE_BUCKET_NAME=
AWS_S3_REGION_NAME=
```
**Configuring Custom Backends for Static Storage and Public and Private Media Files**
- **<app_name>/storage_backends.py**
```pthon
from storages.backends.s3boto3 import S3Boto3Storage
class StaticStorage(S3Boto3Storage):
"""Static files configuration backend"""
location = 'static'
default_acl = 'public-read'
class PublicMediaStorage(S3Boto3Storage):
"""COnfiguration for public media files"""
location = 'media'
default_acl = 'public-read'
file_overwrite = False
class PrivateMediaStorage(S3Boto3Storage):
"""COnfiguration for pricate media files"""
location = 'private'
default_acl = 'private'
file_overwrite = False
custom_domain = False
```
## 4. Testing
- Try Running ``python manage.py collectstatic`` command rom your terminal. If this succeds, then you should be able to see the static directory on the bucket we created.
