Django Cookiecutter Docker环境下DO Spaces连接AWS端点报错
问题场景
已确认DO Spaces的环境变量配置无误:
DJANGO_AWS_ACCESS_KEY_ID='DO00CBN....BATCXAE' DJANGO_AWS_SECRET_ACCESS_KEY='vkmMV3Eluv8.....U1nvalkSFugkg' DJANGO_AWS_STORAGE_BUCKET_NAME='my-key' DJANGO_AWS_DEFAULT_ACL = 'public-read' DJANGO_AWS_S3_REGION_NAME = 'sgp1' DJANGO_AWS_S3_CUSTOM_DOMAIN = 'https://my-key.sgp1.digitaloceanspaces.com'
在production.py中修改域名后缀后,仍出现端点连接错误:
AWS_ACCESS_KEY_ID = env("DJANGO_AWS_ACCESS_KEY_ID") AWS_SECRET_ACCESS_KEY = env("DJANGO_AWS_SECRET_ACCESS_KEY") AWS_STORAGE_BUCKET_NAME = env("DJANGO_AWS_STORAGE_BUCKET_NAME") AWS_QUERYSTRING_AUTH = False _AWS_EXPIRY = 60 * 60 * 24 * 7 AWS_S3_OBJECT_PARAMETERS = { "CacheControl": f"max-age={_AWS_EXPIRY}, s-maxage={_AWS_EXPIRY}, must-revalidate", } AWS_S3_MAX_MEMORY_SIZE = env.int( "DJANGO_AWS_S3_MAX_MEMORY_SIZE", default=100_000_000, # 100MB) AWS_S3_REGION_NAME = env("DJANGO_AWS_S3_REGION_NAME", default=None) AWS_S3_CUSTOM_DOMAIN = env("DJANGO_AWS_S3_CUSTOM_DOMAIN", default=None) # aws_s3_domain = AWS_S3_CUSTOM_DOMAIN or f"{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com" aws_s3_domain = AWS_S3_CUSTOM_DOMAIN or f"{AWS_STORAGE_BUCKET_NAME}.digitaloceanspaces.com"
错误信息:
botocore.exceptions.EndpointConnectionError: Could not connect to the endpoint URL: "https://my-key.s3.sgp1.amazonaws.com/static/sass/project.scss"
解决方法
1. 强制指定DO Spaces端点URL
问题根源是boto3默认使用AWS S3端点,需在production.py中添加**AWS_S3_ENDPOINT_URL**配置,直接指向DO Spaces的区域端点:
AWS_S3_ENDPOINT_URL = f"https://{AWS_S3_REGION_NAME}.digitaloceanspaces.com"
若已通过环境变量配置DJANGO_AWS_S3_ENDPOINT_URL,也可通过env读取:
AWS_S3_ENDPOINT_URL = env("DJANGO_AWS_S3_ENDPOINT_URL", default=f"https://{AWS_S3_REGION_NAME}.digitaloceanspaces.com")
2. Docker环境下的配置方式
通过production.yml环境变量配置
在production.yml的django服务环境变量段添加:
services: django: environment: - DJANGO_AWS_S3_ENDPOINT_URL=https://sgp1.digitaloceanspaces.com # 保留其他已有环境变量
通过Dockerfile配置(可选)
如需在镜像构建阶段注入环境变量,可在Dockerfile中添加:
ENV DJANGO_AWS_S3_ENDPOINT_URL=https://sgp1.digitaloceanspaces.com
3. 验证配置
添加端点配置后,boto3会直接连接DO Spaces端点,不再指向AWS S3。同时确保AWS_S3_REGION_NAME与你的DO空间区域一致(如sgp1)。
内容的提问来源于stack exchange,提问作者diogenes
相关产品推荐
相关产品推荐

