Ошибка инициализации сессии boto3 в Django-приложении с использованием DigitalOcean Spaces

У меня возникла проблема с моим Django-приложением при попытке настроить его на использование DigitalOcean Spaces для статических и медиафайлов. Вот соответствующая часть моего settings.py файла:

import boto3
from botocore.exceptions import NoCredentialsError, PartialCredentialsError
from botocore.client import Config
from os import getenv

AWS_ACCESS_KEY_ID = getenv('SPACES_KEY')
AWS_SECRET_ACCESS_KEY = getenv('SPACES_SECRET')
AWS_STORAGE_BUCKET_NAME = getenv('BUCKET_NAME')
AWS_S3_REGION_NAME = "region"
AWS_S3_ENDPOINT_URL = f"https://{AWS_S3_REGION_NAME}.digitaloceanspaces.com"

AWS_S3_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}

AWS_DEFAULT_ACL = 'public-read'
AWS_S3_SIGNATURE_VERSION = 's3v4'

STATIC_URL = f"{AWS_S3_ENDPOINT_URL}/{AWS_STORAGE_BUCKET_NAME}/static/"
MEDIA_URL = f"{AWS_S3_ENDPOINT_URL}/{AWS_STORAGE_BUCKET_NAME}/media/"

STATICFILES_STORAGE = 'name.custom_storages.StaticStorage'
DEFAULT_FILE_STORAGE = 'name.custom_storages.MediaStorage'

# Ensure the credentials are explicitly set for boto3
session = boto3.session.Session()
s3_client = session.client(
    's3',
    region_name=AWS_S3_REGION_NAME,
    endpoint_url=AWS_S3_ENDPOINT_URL,
    aws_access_key_id=AWS_ACCESS_KEY_ID,
    aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
    config=Config(signature_version='s3v4')
)

# Test connection to S3
def test_s3_connection():
    try:
        print("Connecting to S3...")
        response = s3_client.list_objects_v2(Bucket=AWS_STORAGE_BUCKET_NAME)
        print("Connection successful. Contents:")
        for obj in response.get('Contents', []):
            print(obj['Key'])
    except NoCredentialsError:
        print("Error: No credentials found.")
    except PartialCredentialsError:
        print("Error: Incomplete credentials.")
    except Exception as e:
        print(f"Error: {e}")

test_s3_connection()

Когда я запускаю сервер, используя python3 manage.py runserver, я получаю следующую ошибку:

Traceback (most recent call last):
  ...
  File "/Users/User/.aws/credentials"
botocore.exceptions.ConfigParseError: Unable to parse config file: /Users/User/.aws/credentials

Я не хочу, чтобы boto3 использовал учетные данные из файла ~/.aws/credentials, потому что я не использую AWS, я использую DigitalOcean Spaces.

Любая помощь или предложения о том, как решить эту проблему, будут очень признательны. Заранее спасибо!

Проверили файл учетных данных AWS:

  1. Проверил на наличие синтаксических ошибок: Я убедился, что в файле учетных данных нет синтаксических ошибок или проблем с форматированием.

  2. Переменные окружения: Я подтвердил, что переменные окружения (SPACES_KEY, SPACES_SECRET, BUCKET_NAME) правильно установлены в моем окружении.

    .
  3. Обновил boto3 и botocore: Я убедился, что в моем виртуальном окружении установлены последние версии boto3 и botocore.

  4. Журналы отладки: Добавлены операторы печати и протоколирование для проверки правильности загрузки и передачи переменных окружения в boto3.

  5. Я ожидал, что приложение Django будет инициализировать сессию boto3, используя только предоставленные переменные окружения, и не будет ссылаться на файл учетных данных AWS. Однако я продолжаю сталкиваться с ошибкой ConfigParseError, связанной с файлом учетных данных, и не могу продолжить работу.

Любые соображения или предложения о том, как решить эту проблему, будут очень признательны.

Похоже, что у вас есть файл по адресу ~/.aws/credentials, который имеет какое-то недопустимое содержимое.

В любом случае, ваша проблема в том, что вы вызываете boto3.session.Session() без аргументов, поэтому он пытается использовать поведение по умолчанию для поиска учетных данных. Вы ждете, пока не создадите S3-клиент, чтобы "отменить" стандартные настройки учетных данных boto3 с вашими собственными учетными данными для S3-клиента. Вместо этого вы должны просто передать эти учетные данные в вызов Session.

Вернуться на верх