我正在使用django,而像img这样的东西我存放在s3(为此我使用boto),但最近我收到了这个错误:
' foo.bar.com.s3.amazonaws.com'不匹配任何一个 ' * .s3.amazonaws.com',' s3.amazonaws.com'
我正在寻找可能的解决方案大约两天,但建议的独特之处是更改boto的源代码,但是我无法在生产中执行此操作。
编辑:使用Django 1.58,Boto 2.38.0
任何帮助将不胜感激。 Thx提前。
答案 0 :(得分:5)
如前所述,问题出现在名称上包含点的桶中。下面只是一个阻止这种情况的例子。
import boto
from boto.s3.connection import VHostCallingFormat
c = boto.connect_s3(aws_access_key_id='your-access-key',
is_secure=False,
aws_secret_access_key='your-secret-access',
calling_format=VHostCallingFormat())
b = c.get_bucket(bucket_name='your.bucket.with.dots', validate=True)
print(b)
答案 1 :(得分:2)
这是一个众所周知的问题:#2836。这是由于您的桶名称中的点。 几天前我有这个问题。用户似乎已成功通过设置:
来解决此问题int main()
{
int N = 10;
int sum = (N*N + N) >> 1;
}
但它对我没用。
否则,您可以创建一个没有分数的桶( E.g :AWS_S3_HOST = 's3-eu-central-1.amazonaws.com'
AWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat
)。它会工作。这就是我暂时解决这个问题的方法。
答案 2 :(得分:2)
您可以在connection.py文件(boto / connection.py)中使用此Monkey补丁:
import ssl
_old_match_hostname = ssl.match_hostname
def _new_match_hostname(cert, hostname):
if hostname.endswith('.s3.amazonaws.com'):
pos = hostname.find('.s3.amazonaws.com')
hostname = hostname[:pos].replace('.', '') + hostname[pos:]
return _old_match_hostname(cert, hostname)
ssl.match_hostname = _new_match_hostname
(source)
答案 3 :(得分:1)
当我从python3.4移动到python3.5时,我遇到了同样的错误(boto版本保持不变)。
通过从boto转移到 boto3 包来解决问题。
示例:
import boto3
s3_client = boto3.client("s3", aws_access_key_id=aws_access_key, aws_secret_access_key=aws_secret_key)
body = open(local_filename, 'rb').read()
resp = s3_client.put_object(ACL="private", Body=body, Bucket=your_bucket_name, Key=path_to_the_file_inside_the_bucket)
if resp["ResponseMetadata"]["HTTPStatusCode"] != 200:
raise Exception("Something went wrong...")