みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

DjangoのcollectstaticでAmazon S3に直接アップロードするとParamValidationError

タイトルの通りですが,Djangoに django-storagesboto3をインストールして,collectstaticを実行してAmazon S3に直接アップロードを試みましたが,ParamValidationErrorが発生しました.

settings.py

STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
AWS_ACCESS_KEY_ID = os.environ["AWS_ACCESS_KEY_ID"]
AWS_SECRET_ACCESS_KEY = os.environ["AWS_SECRET_ACCESS_KEY"]
AWS_STORAGE_BUCKET_NAME = os.environ["AWS_STORAGE_BUCKET_NAME"]
AWS_S3_OBJECT_PARAMETERS = {
    "CacheControl": "max-age=86400",
    "ACL": "public-read"
}
INSTALLED_APPS += ['storages', ]

command

python3 manage.py collectstatic --no-input --clear

output

Traceback (most recent call last):
  File "manage.py", line 30, in 
    execute_from_command_line(sys.argv)
  File "/opt/venv/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "/opt/venv/lib/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/opt/venv/lib/python3.8/site-packages/django/core/management/base.py", line 330, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/opt/venv/lib/python3.8/site-packages/django/core/management/base.py", line 371, in execute
    output = self.handle(*args, **options)
  File "/opt/venv/lib/python3.8/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 194, in handle
    collected = self.collect()
  File "/opt/venv/lib/python3.8/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 100, in collect
    self.clear_dir('')
  File "/opt/venv/lib/python3.8/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 228, in clear_dir
    if not self.storage.exists(path):
  File "/opt/venv/lib/python3.8/site-packages/storages/backends/s3boto3.py", line 461, in exists
    self.connection.meta.client.head_object(Bucket=self.bucket_name, Key=name)
  File "/opt/venv/lib/python3.8/site-packages/botocore/client.py", line 357, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/opt/venv/lib/python3.8/site-packages/botocore/client.py", line 648, in _make_api_call
    request_dict = self._convert_to_request_dict(
  File "/opt/venv/lib/python3.8/site-packages/botocore/client.py", line 696, in _convert_to_request_dict
    request_dict = self._serializer.serialize_to_request(
  File "/opt/venv/lib/python3.8/site-packages/botocore/validate.py", line 297, in serialize_to_request
    raise ParamValidationError(report=report.generate_report())
botocore.exceptions.ParamValidationError: Parameter validation failed:
Invalid length for parameter Key, value: 0, valid range: 1-inf

django-storagesと--clearオプションの相性

collectstaticの--clearオプションを有効にするとコピー先を最初に空にしてくれます.

--clear, -c¶
Clear the existing files before trying to copy or link the original file.

The staticfiles app | Django documentation | Django

どうやらこのオプションとdjango-storagesの相性が悪いらしく,--clearオプションを削除して実行したところ,解決しました.