需要有效的日期或x-amz-date头吗?
我在尝试上传文件到S3时遇到了以下错误:
S3StorageError: <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>AWS authentication requires a valid Date or x-amz-date header</Message><RequestId>7910FF83F3FE17E2</RequestId><HostId>EjycXTgSwUkx19YNkpAoY2UDDur/0d5SMvGJUicpN6qCZFa2OuqcpibIR3NJ2WKB</HostId></Error>
我正在使用Django,并且用到了Django-Storages和Imagekit这两个库。
我在settings.py中的S3设置如下:
locale.setlocale(locale.LC_TIME, 'en_US')
DEFAULT_FILE_STORAGE = 'backends.s3.S3Storage'
AWS_ACCESS_KEY_ID = '************************'
AWS_SECRET_ACCESS_KEY = '*****************************'
AWS_STORAGE_BUCKET_NAME = 'static.blabla.com'
AWS_HEADERS = {
'x-amz-date': datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT'),
'Expires': 'Thu, 15 Apr 2200 20:00:00 GMT',
}
from S3 import CallingFormat
AWS_CALLING_FORMAT = CallingFormat.SUBDOMAIN
谢谢你们提供的任何帮助!
3 个回答
0
试着使用格式化的UTC(协调世界时)时间,也叫做Zulu时间:
datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')
'20220830T153825Z'
比如说:
AWS_HEADERS = {
'X-Amz-Date': datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ'),
'X-Amz-Expires': 3600,
}
0
我觉得把'x-amz-date'这个头信息放在settings.py里并不好,因为这个文件每次服务器启动时只会运行一次。
我猜你是在用开发服务器,这个服务器在你每次修改.py文件时都会重启。
不过,django-storages已经有代码可以设置相关的头信息,所以你根本不需要那一行。
我还遇到了django-storages设置的头信息的问题,关于这个问题的解决办法可以在BitBucket上找到,链接是: http://code.welldev.org/django-storages/issue/56/aws-authentication-requires-a-valid-date-or-x-amz-date
1
我发现时区差异似乎是一个因素。我是一个来自墨尔本的外籍人士,现在在马来西亚。把时区改回墨尔本的时间后,这个错误就消失了(之前在我使用的所有主要s3访问工具中都会出现这个错误,比如s3fox、s3hub等)。