boto3 выдает ошибку InvalidBucketName для допустимых имен корзин на S3 с пользовательским URL-адресом

Я пытаюсь написать скрипт python для основных операций получения/помещения/удаления/списка на S3. Я использую облачное хранилище объектов 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:

  • тестовое ведро-0
  • тестовое ведро-1
  • ведро для образцов
  • тестбакет

Однако, когда я пытаюсь создать ведро из кода Python, я неоднократно получаю следующую ошибку:

# >>> 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.

Будучи очень новичком в boto3, я действительно не уверен, чего ожидает boto3. Я пробовал различные комбинации для создания соединений со службой S3, например, используя client вместо resource, но проблема постоянна.

Несколько других соединений S3, которые я пробовал, следующие:

s3 = boto3.resource('s3',
        endpoint_url='http://10.43.235.193:80',
        aws_access_key_id = 'aaa',                                                                                                                                              
        aws_secret_access_key = 'sss',
        config=Config(signature_version='s3v4'),
        region_name='region1')
conn = boto3.connect_s3(                                                                                                                                                       
    aws_access_key_id = 'aaa',                                                                                                                                              
    aws_secret_access_key = 'sss',                                                                                                                                       
    host = '10.43.235.193',                                                                                                                                                       
    port = 80,                                                                                                                                                              
    is_secure = False,                                                                                                                                                        
) 
from boto3.session import Session
session = Session(
    aws_access_key_id='aaa',
    aws_secret_access_key='sss',
    region_name='region1'
)

s3 = session.resource('s3')
client = session.client('s3', endpoint_url='http://10.43.235.193:80') # s3-region1.example.com
s3_client = boto3.client ('s3', 
   endpoint_url=s3_endpoint,
   aws_access_key_id = 'aaa',
   aws_secret_access_key = 'sss',
   region_name='region1')

Python-скрипт работает внутри контейнера и того же модуля, который запускает контейнер s3. Поэтому IP доступен из 1 контейнера в другой. Как мне решить эту проблему?


person Aniruddha Tekade    schedule 12.04.2021    source источник
comment
НЕ помещайте свои учетные данные для доступа в StackOverflow. Вы должны немедленно аннулировать эти учетные данные, чтобы никто не мог их использовать! К вашему сведению, вы должны хранить учетные данные в файле конфигурации с помощью команды aws configure, а не помещать их в свой код.   -  person John Rotenstein    schedule 12.04.2021
comment
Извините, а в чем именно заключается ваш вопрос/проблема? Вы сказали, что успешно создали несколько сегментов, но затем создать другие сегменты не удалось? Они все потерпели неудачу или только определенные имена бакетов? Можете ли вы описать эту ситуацию более подробно? Кроме того, какой IP-адрес начинается с 10.? Это частный IP-адрес, доступный только внутри сети. Это адрес вашего сервера Cloudian в вашей сети?   -  person John Rotenstein    schedule 12.04.2021
comment
@JohnRotenstein благодарит вас за предложение, но эти ключи фиктивные. Я создал ведра вручную. IP-адрес 10., потому что он работает в кластере kubernetes. поэтому клиентское приложение, работающее в 1 контейнере, может общаться со службой s3, работающей в другом контейнере.   -  person Aniruddha Tekade    schedule 12.04.2021
comment
@JohnRotenstein сервер работает внутри моего кластера Kubernetes как контейнер.   -  person Aniruddha Tekade    schedule 12.04.2021


Ответы (1)


Моя находка очень странная. Однако наличие ошибки InvalidBucketName вводит в заблуждение, и я нашел много тем на boto3 github по этому поводу. Но, как оказалось, большинство пользователей используют AWS, а не локальное частное облако S3, так что это мало помогло.

Для меня, имея IP ex. 10.50.32.5 в качестве конечной точки S3 в конфигурации при создании s3_client не работает. Поэтому, имея конечную точку, установленную следующим образом:

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')

терпит неудачу.

Как это исправить?

Я добавил запись DNS в /etc/hosts; то есть сопоставление IP и URL-адреса конечной точки S3, подобное этому -

10.50.32.5   s3-region1.example.com

А затем создал клиент S3, используя boto, вот так:

s3_client = boto3.client ('s3', 
   endpoint_url=s3_endpoint,
   aws_access_key_id = 'AAA',
   aws_secret_access_key = 'BBB',
   region_name='region1')

И это сработало.

person Aniruddha Tekade    schedule 16.04.2021