' foo.bar.com.s3.amazonaws.com'不匹配' * .s3.amazonaws.com',' s3.amazonaws.com'

时间:2015-12-08 11:32:03

标签: django amazon-web-services amazon-s3 boto

我正在使用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提前。

4 个答案:

答案 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...")