boto3 дава грешка InvalidBucketName за валидни имена на кофи на S3 с персонализиран url

Опитвам се да напиша скрипт на Python за основни операции get/put/delete/list на 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-скриптът се изпълнява вътре в контейнер и същия pod, който изпълнява s3 ​​контейнер. Следователно IP е достъпен от един контейнер в друг. Как трябва да реша този проблем?


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