Using S3 for media files

Hi I’m trying to follow this tutorial to connect to S3 and I keep getting forbidden errors. I’ve checked my access codes and they are correct and there are no extra spaces or quotes. Everything on the aws side is exactly the same as outlined in the video. I have all the proper libraries as well.

This is the setup I have for aws

35  print(environ["AWS_SECRET_ACCESS_KEY_ID"])
  1 AWS_ACCESS_KEY_ID = environ["AWS_ACCESS_KEY_ID"]
  2 AWS_SECRET_ACCESS_KEY_ID = environ["AWS_SECRET_ACCESS_KEY_ID"]
  3 
  4 AWS_STORAGE_BUCKET_NAME = environ["AWS_STORAGE_BUCKET_NAME"]
  5 AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com"
  6 # If a name collision happens, aws will fix it for us and rename new files.
  7 AWS_S3_FILE_OVERWRITE = False
  8 
  9 AWS_S3_SIGNATURE_NAME = "s3v4"
 10 AWS_S3_REGION_NAME = "us-east-1"
 11 AWS_DEFAULT_ACL = None
 12 AWS_S3_VERITY = True
 13 
 14 STORAGES = {
 15     # media files
 16     "default": {
 17         "BACKEND": "storages.backends.s3boto3.S3Boto3Storage",
 18     },
 19     # css, js, etc
 20     "staticfiles": {
 21         "BACKEND": "storages.backends.s3boto3.S3Boto3Storage",
 22     },
 23 }
 24 
 25 MEDIA_URL = "/media/"
 26 # MEDIA_URL = f"//{AWS_S3_CUSTOM_DOMAIN}/media/"
 27 MEDIA_ROOT = BASE_DIR / "media"
 28 # MEDIA_ROOT = MEDIA_URL

Please be more specific with the errors you are receiving.

Post the complete error message(s) with the tracebacks here.

here’s this traceback

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
January 27, 2025 - 17:59:41
Django version 5.1.3, using settings 'core.settings' 
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

[27/Jan/2025 17:59:47] "GET /dogs/list HTTP/1.1" 200 305
[27/Jan/2025 17:59:49] "GET /dogs/list HTTP/1.1" 200 305
Internal Server Error: /dogs/
Traceback (most recent call last):
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/django/core/handlers/exception.py", line 55, in inner    
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/redhawk/code/upload-exaple/src/dogs/views.py", line 11, in upload_form
    form.save()
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/django/forms/models.py", line 554, in save
    self.instance.save()
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/django/db/models/base.py", line 891, in save
    self.save_base(
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/django/db/models/base.py", line 997, in save_base
    updated = self._save_table(
              ^^^^^^^^^^^^^^^^^
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/django/db/models/base.py", line 1160, in _save_table
    results = self._do_insert(
              ^^^^^^^^^^^^^^^^
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/django/db/models/base.py", line 1201, in _do_insert
    return manager._insert(
           ^^^^^^^^^^^^^^^^
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/django/db/models/manager.py", line 87, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/django/db/models/query.py", line 1847, in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/django/db/models/sql/compiler.py", line 1835, in execute_sql
    for sql, params in self.as_sql():
                       ^^^^^^^^^^^^^
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/django/db/models/sql/compiler.py", line 1758, in as_sql
    value_rows = [
                 ^
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/django/db/models/sql/compiler.py", line 1759, in <listcomp>
    [
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/django/db/models/sql/compiler.py", line 1760, in <listcomp>
    self.prepare_value(field, self.pre_save_val(field, obj))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/django/db/models/sql/compiler.py", line 1708, in pre_save_val
    return field.pre_save(obj, add=True)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/django/db/models/fields/files.py", line 338, in pre_save
    file.save(file.name, file.file, save=False)
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/django/db/models/fields/files.py", line 99, in save
    self.name = self.storage.save(name, content, max_length=self.field.max_length)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/django/core/files/storage/base.py", line 44, in save
    name = self.get_available_name(name, max_length=max_length)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/django/core/files/storage/base.py", line 93, in get_available_name
    while not self.is_name_available(name, max_length=max_length):
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/django/core/files/storage/base.py", line 56, in is_name_available
    return not self.exists(name) and not exceeds_max_length
               ^^^^^^^^^^^^^^^^^
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/storages/backends/s3.py", line 587, in exists
    self.connection.meta.client.head_object(Bucket=self.bucket_name, Key=name)
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/botocore/client.py", line 569, in _api_call
    return self._make_api_call(operation_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/redhawk/code/upload-exaple/.venv/lib/python3.11/site-packages/botocore/client.py", line 1023, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (403) when calling the HeadObject operation: Forbidden
[27/Jan/2025 18:00:20] "POST /dogs/ HTTP/1.1" 500 169237

The problem is it’s AWS_SECRET_ACCESS_KEY not AWS_SECRET_ACCESS_KEY_ID It works perfectly now.