Отсутствие предварительной подписи URL-адреса s3 ТОЛЬКО для региона Бахрейн AWS - PullRequest
1 голос
/ 05 мая 2020

У меня был код Python, который подписывает URL-адреса AWS S3, которые работают годами. Мы только что добавили новую корзину в дата-центре Бахрейна AWS. Это местоположение было отключено и требовало явного включения этого центра обработки данных.

Кажется, все в порядке. Однако полученный URL-адрес всегда дает мне IllegalLocationConstraintException, и я считаю, что boto3 генерирует неправильное доменное имя в URL-адресе.

Ошибка указывает, что запрос отправлен на us-east-1. Я знаю, что вы должны указать регион, у нас есть 8-10 регионов, которые мы используем, и они все в порядке до этого.

URL-адрес, сгенерированный boto3.client('s3', ...).generate_presigned_url(), кажется, дает URL для востока США S3. Учитывая что-то вроде этого:

region: me-south-1
bucket: bucket-name
key: full/path/to/file.txt

Вы ожидаете что-то вроде этого для подписанного URL:

https://bucket-name.s3.me-south-1.amazonaws.com/full/path/to/file.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AZIAJ4252S33LNN3Y14Q/20100504/me-south-1/s3/aws4_request&X-Amz-Date=20200504TA22522Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=1717275aff4af5fcff2f44f74615fadb5ba448eb83219c88f59d0792d4e44b8f

Обратите внимание на домен: bucket-name.s3.me-south-1.amazonaws.com

Но что мы получаем из boto3.client('s3', ...).generate_presigned_url():

https://bucket-name.s3.amazonaws.com/full/path/to/file.txt?X-Amz-Algorithm=...

Обратите внимание, что этот результирующий домен: s3.amazonaws.com

Были ли у кого-нибудь проблемы с новыми местоположениями s3, подобными этому?

Если это поможет, мы получаем полное сообщение об ошибке:

<?xml version="1.0" encoding="UTF-8"?>
<Error>
   <Code>IllegalLocationConstraintException</Code>
   <Message>
   The me-south-1 location constraint is incompatible for the region specific endpoint this request was sent to.
   </Message>
</Error>

1 Ответ

3 голосов
/ 05 мая 2020

Попробуйте указать endpoint_url в клиенте S3:

boto3.client('s3', endpoint_url='https://s3.me-south-1.amazonaws.com', region_name='me-south-1')

Если вы получите следующую ошибку

The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.

укажите также signature_version:

from botocore.client import Config
boto3.client('s3', config=Config(signature_version='s3v4'), endpoint_url='https://s3.me-south-1.amazonaws.com', region_name='me-south-1')

Я пробовал, и у меня работает ◡̈

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...