Python boto3为具有自定义url的S3上的有效bucket名称提供InvalidBucketName错误

Python boto3为具有自定义url的S3上的有效bucket名称提供InvalidBucketName错误,python,amazon-web-services,amazon-s3,boto3,botocore,Python,Amazon Web Services,Amazon S3,Boto3,Botocore,我试图为S3上的基本get/put/delete/list操作编写一个python脚本。我使用的是cloudian S3对象存储,而不是AWS。为了设置boto3资源,我像这样设置端点和键- URL = 'http://ip:80' s3_resource = boto3.resource ('s3', endpoint_url=URL, aws_access_key_id = ACCESS_KEY, aws_secret_access_key = SECRET_KEY, r

我试图为S3上的基本get/put/delete/list操作编写一个python脚本。我使用的是cloudian S3对象存储,而不是AWS。为了设置boto3资源,我像这样设置端点和键-

URL = 'http://ip:80'

s3_resource = boto3.resource ('s3', endpoint_url=URL,
   aws_access_key_id = ACCESS_KEY,
   aws_secret_access_key = SECRET_KEY,
   region_name='region1')
s3_client = boto3.client ('s3', 
   endpoint_url='http://10.50.32.5:80',
   aws_access_key_id = 'AAA',
   aws_secret_access_key = 'SSS',
   region_name='region1')
10.50.32.5   s3-region1.example.com
我已经用以下名称手动创建了一些测试存储桶,这些名称通过了有效的S3存储桶名称约束:

  • 测试-0
  • 试验-1
  • 样本桶
  • 测试桶
然而,当我试图从python代码创建一个bucket时,我反复出现以下错误-

# >>> client.list_buckets()
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
#   File "/usr/local/lib/python3.8/site-packages/botocore/client.py", line 357, in _api_call
#     return self._make_api_call(operation_name, kwargs)
#   File "/usr/local/lib/python3.8/site-packages/botocore/client.py", line 676, in _make_api_call
#     raise error_class(parsed_response, operation_name)
# botocore.exceptions.ClientError: An error occurred (InvalidBucketName) when calling the ListBuckets operation: The specified bucket is not valid.

python脚本运行在一个容器内,与运行s3容器的pod相同。因此,IP可以从一个容器访问到另一个容器。我该如何解决这个问题?

我的发现很奇怪。尽管有一个错误是
InvalidBucketName
,但这是非常容易误导的,我在boto3 github上发现了很多关于这一点的帖子。但事实证明,大多数用户都是AWS用户,而不是prem私有云S3用户,所以这并没有多大帮助

对我来说,在创建S3_客户端时,将IP ex.10.50.32.5作为配置中的S3端点是行不通的。因此,端点设置如下-

URL = 'http://ip:80'

s3_resource = boto3.resource ('s3', endpoint_url=URL,
   aws_access_key_id = ACCESS_KEY,
   aws_secret_access_key = SECRET_KEY,
   region_name='region1')
s3_client = boto3.client ('s3', 
   endpoint_url='http://10.50.32.5:80',
   aws_access_key_id = 'AAA',
   aws_secret_access_key = 'SSS',
   region_name='region1')
10.50.32.5   s3-region1.example.com
这是失败的

我是如何解决这个问题的?

我在/etc/hosts中添加了一个DNS条目;i、 像这样的IP和S3端点URL的映射-

URL = 'http://ip:80'

s3_resource = boto3.resource ('s3', endpoint_url=URL,
   aws_access_key_id = ACCESS_KEY,
   aws_secret_access_key = SECRET_KEY,
   region_name='region1')
s3_client = boto3.client ('s3', 
   endpoint_url='http://10.50.32.5:80',
   aws_access_key_id = 'AAA',
   aws_secret_access_key = 'SSS',
   region_name='region1')
10.50.32.5   s3-region1.example.com
然后使用boto创建了一个S3客户端,如下所示-

URL = 'http://ip:80'

s3_resource = boto3.resource ('s3', endpoint_url=URL,
   aws_access_key_id = ACCESS_KEY,
   aws_secret_access_key = SECRET_KEY,
   region_name='region1')
s3_client = boto3.client ('s3', 
   endpoint_url='http://10.50.32.5:80',
   aws_access_key_id = 'AAA',
   aws_secret_access_key = 'SSS',
   region_name='region1')
10.50.32.5   s3-region1.example.com
s3\u client=boto3.client('s3',
端点\u url=s3\u端点,
aws\u访问\u密钥\u id='AAA',
aws_secret_access_key='BBB',
地区(名称='region1')

它成功了。

不要将访问凭据放入StackOverflow。您应该立即使这些凭据无效,这样就没有人可以使用它们!仅供参考,您应该通过
aws configure
命令将凭据存储在配置文件中,而不是将其放入代码中。对不起,您到底有什么问题?您说过您成功创建了一些bucket,但是创建其他bucket失败了?它们都失败了吗,还是只有特定的桶名?你能更详细地描述一下这种情况吗?另外,以
10开头的IP地址是什么。
?这是一个只能从网络内部访问的专用IP地址。它是您网络中Cloudian服务器的地址吗?@JohnRotenstein感谢您的建议,但这些密钥是假的。我手动创建了bucket。IP是
10。
是因为它运行在kubernetes集群中。因此,在一个容器中运行的客户端应用程序可以与在另一个容器中运行的s3服务通信。@JohnRotenstein服务器作为容器在我的Kubernetes集群中运行。