【问题标题】:'foo.bar.com.s3.amazonaws.com' doesn't match either of '*.s3.amazonaws.com', 's3.amazonaws.com'“foo.bar.com.s3.amazonaws.com”与“*.s3.amazonaws.com”、“s3.amazonaws.com”中的任何一个都不匹配
【发布时间】:2016-03-13 07:24:02
【问题描述】:

我使用的是 django,以及存储在 s3 中的 imgs 之类的东西(为此我使用的是 boto),但最近我收到了这个错误:

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

我正在寻找可能的解决方案大约两天,但建议的独特之处是更改 boto 的源代码,但我无法在生产环境中执行此操作。

编辑:使用 Django 1.58,Boto 2.38.0

任何帮助将不胜感激。 提前谢谢。

【问题讨论】:

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


【解决方案1】:

如前所述,问题出现在名称上包含点的存储桶中。下面只是一个防止这种情况发生的例子。

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)

【讨论】:

  • FWIW,VHostCallingFormat 对我不起作用(写入 s3 时得到 403),但来自同一模块的 OrdinaryCallingFormat 可以。
  • @georg 的建议应该添加到 ECC 响应中,它看起来是一个合适的解决方案。
  • 这里也一样,VHostCallingFormat 导致gaierror: [Errno -2] Name or service not knownOrdinaryCallingFormat 的作用就像一个魅力。
【解决方案2】:

您可以在您的 connection.py 文件 (boto/connection.py) 中使用这个猴子补丁:

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)

另一个解决方案在here:

【讨论】:

  • 这对我有用,直到我在 python2 上。但是在 python3 上迁移期间,它给了我错误certificate is not valid for '*.s3.amazonaws.com'。对我来说有助于使用boto3 而不是boto
【解决方案3】:

这是一个已知问题:#2836。这是由于您的存储桶名称中的点。 几天前我遇到了这个问题。用户似乎已通过设置成功解决此问题:

AWS_S3_HOST = 's3-eu-central-1.amazonaws.com'
AWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat

但这对我不起作用。

否则,您可以创建一个没有积分的存储桶(例如foo-bar-com)。它会起作用的。这是我为临时解决此问题所做的。

【讨论】:

  • 我尝试使用您所说的为用户修复的内容,但对我来说,我只是得到了 301 Moved Permanently
  • 我也收到此错误。这就是我重命名存储桶的原因
  • 问题是我无法更改存储桶或存储桶名称。不过感谢您的关注
  • 你不能再创建一个吗?
  • 我创建了另一个存储桶,但仍然得到 301 Moved Permanently
【解决方案4】:

我从 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...")

【讨论】:

    猜你喜欢
    • 2017-11-27
    • 2017-08-23
    • 2020-01-16
    • 2012-12-24
    • 2020-11-24
    • 2015-09-27
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多