Команда Django collectStatic не сработала при развертывании на ElasticBeastalk с S3
Я пытаюсь изменить свое приложение Django, чтобы использовать S3 для хранения статических данных и мультимедиа. Это работает без проблем на локальной машине, и я могу запустить "collectstatic" локально.
При развертывании на экземпляр Elastic Beanstalk я получаю следующую ошибку:
ERROR Instance deployment failed. For details, see 'eb-engine.log'.
INFO Command execution completed on all instances. Summary: [Successful: 0, Failed: 1].
ERROR Failed to deploy application.
В eb-engine.log:
[ERROR] An error occurred during execution of command [app-deploy] - [PostBuildEbExtension]. Stop running the command. Error: container commands build failed. Please refer to /var/log/cfn-init.log for more details.
В журнале cfn-init.log
[INFO] -----------------------Starting build-----------------------
[INFO] Running configSets: Infra-EmbeddedPostBuild
[INFO] Running configSet Infra-EmbeddedPostBuild
[INFO] Running config postbuild_0_LocalEyes_WebApp
[ERROR] Command 00_collectstatic (source /var/app/venv/*/bin/activate && python3 manage.py collectstatic --noinput) failed
[ERROR] Error encountered during build of postbuild_0_LocalEyes_WebApp: Command 00_collectstatic failed
Traceback (most recent call last):
File "/usr/lib/python3.7/site-packages/cfnbootstrap/construction.py", line 573, in run_config
CloudFormationCarpenter(config, self._auth_config).build(worklog)
File "/usr/lib/python3.7/site-packages/cfnbootstrap/construction.py", line 273, in build
self._config.commands)
File "/usr/lib/python3.7/site-packages/cfnbootstrap/command_tool.py", line 127, in apply
raise ToolError(u"Command %s failed" % name)
cfnbootstrap.construction_errors.ToolError: Command 00_collectstatic failed
[ERROR] -----------------------BUILD FAILED!------------------------
[ERROR] Unhandled exception during build: Command 00_collectstatic failed
Traceback (most recent call last):
File "/opt/aws/bin/cfn-init", line 176, in <module>
worklog.build(metadata, configSets)
File "/usr/lib/python3.7/site-packages/cfnbootstrap/construction.py", line 135, in build
Contractor(metadata).build(configSets, self)
File "/usr/lib/python3.7/site-packages/cfnbootstrap/construction.py", line 561, in build
self.run_config(config, worklog)
File "/usr/lib/python3.7/site-packages/cfnbootstrap/construction.py", line 573, in run_config
CloudFormationCarpenter(config, self._auth_config).build(worklog)
File "/usr/lib/python3.7/site-packages/cfnbootstrap/construction.py", line 273, in build
self._config.commands)
File "/usr/lib/python3.7/site-packages/cfnbootstrap/command_tool.py", line 127, in apply
raise ToolError(u"Command %s failed" % name)
cfnbootstrap.construction_errors.ToolError: Command 00_collectstatic failed
Похоже, что в моей команде collect static есть ошибка. Я пробовал разные способы ее написания и возился в файле settings.py, но не могу понять, что вызывает эту ошибку.
Любая помощь или совет будут очень признательны!
Мой файл django.config:
container_commands:
00_collectstatic:
command: "source /var/app/venv/*/bin/activate && python3 manage.py collectstatic --noinput"
01_migrate:
command: "source /var/app/venv/*/bin/activate && python3 manage.py migrate"
leader_only: true
option_settings:
aws:elasticbeanstalk:container:python:
WSGIPath: my_project.wsgi:application
aws:elasticbeanstalk:application:environment:
DJANGO_SETTINGS_MODULE: my_project.settings
IS_AWS: true
AWS_ACCESS_KEY_ID: <KEYID>
AWS_SECRET_ACCESS_KEY: <ACCESSKEY>
USE_S3: TRUE
Соответствующий код settings.py:
USE_S3 = os.getenv('USE_S3') == 'TRUE'
if USE_S3:
# aws settings
AWS_STORAGE_BUCKET_NAME = "my-djangobucket"
AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY')
AWS_DEFAULT_ACL = None
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'
AWS_S3_OBJECT_PARAMETERS = {'CacheControl': 'max-age=86400'}
AWS_S3_REGION_NAME = 'us-west-2'
# s3 static settings
STATIC_LOCATION = 'static'
STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/{STATIC_LOCATION}/'
STATICFILES_STORAGE = 'my_project.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 = 'my_project.storage_backends.PublicMediaStorage'
else:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),)