2014-12-10 21 views
9

Mam problem z używaniem Python-Boto SDK dla S3 Buckets dla regionu Frankfurt. Według Amazon link region ten obsługuje tylko V4. W tym dokumencie wyjaśnia się, jak dodać obsługę V4 do Boto SDK. Dodałem nowy dział:Używanie boto do AWS S3 Wiadra do Signature V4

if not boto.config.get('s3', 'use-sigv4'): 
    boto.config.add_section('s3') 
    boto.config.set('s3', 'use-sigv4', 'True') 

a potem stworzyły nowe połączenie i dostał wszystkie chwytaki:

connection = S3Connection(accesskey, secretkey, host=S3Connection.DefaultHost) 
buckets = connection.get_all_buckets() 

to działa dobrze, ale potem starałem się uzyskać wszystkie klucze do mojego wiadra:

for bucket in buckets: 
    bucket.get_all_keys() 

i mam następujące:

S3ResponseError: 400 Bad Request 
<?xml version="1.0" encoding="UTF-8"?> 
<Error><Code>AuthorizationHeaderMalformed</Code><Message>The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'eu-central-1'</Message><Region>eu-central-1</Region> 

Dlaczego to się stało? Potem podłączony do regionu i mam wszystkie potrzebne dane:

region_con = boto.s3.connect_to_region('eu-central-1', aws_access_key_id=accesskey, aws_secret_access_key=secretkey) 
bucket = region_con.get_bucket(bucket.name) 
bucket.get_all_keys() 

Jak mogę naprawić to poprawnie?

+0

Co stanie się, jeśli faktycznie dokonasz zmiany w pliku konfiguracyjnym boto zamiast próbować zrobić to programowo? – garnaat

+0

Tak, próbowałem już wcześniej, ale otrzymałem ten sam rezultat. Jaką różnicę powinno przyjąć Twoje podejście? – Oleg

+0

Prawdopodobnie tylko zmieniasz wartość konfiguracji w pamięci w swoim środowisku. Jeśli inna konfiguracja była tworzona gdzie indziej, to nie otrzymywałaby aktualizacji, ponieważ odczytałaby config bezpośrednio z pliku konfiguracyjnego. Zastanawiałem się, czy to by coś zmieniło. – garnaat

Odpowiedz

6

Miałem ten sam problem przy użyciu Boto. Regionem był Frankfurt i dostał błędów o złych regionach. Rozwiązaniem dla mnie było po prostu wskazać szereg (URI dostał od tej strony http://docs.aws.amazon.com/general/latest/gr/rande.html) do „s3.eu-central-1.amazonaws.com” zamiast domyślnie „s3.amazonaws.com”

s3 = boto.s3.connect_to_region('eu-central-1', 
           aws_access_key_id=accesskey, 
           aws_secret_access_key=secretkey, 
           host='s3.eu-central-1.amazonaws.com') 
2

spróbuj usunąć z s3 boto config, następujący kod działa dla mnie

if 's3' in boto.config.sections(): boto.config.remove_section('s3')

-1

odpowiedź hsrv w powyższym pracach dla boto 2. dla boto3, co następuje zasadniczo równoważne:

s3 = boto3.client('s3', region_name='eu-central-1') 

Alternatywnie, można ustawić pole region w .aws/config:

[default] 
output = json 
region = eu-central-1 

To ustawia domyślny region; nadal możesz wybrać konkretny region w Pythonie, jak wyżej.

Znaczenie regionu różni się w zależności od usługi (na przykład zakładając, że nie siedzisz w VPC, możesz uzyskać dostęp do wiadra S3 z dowolnego miejsca). W tym przypadku ważne jest jednak to, że nowsze regiony (np. Frankfurt) obsługują tylko nowszy schemat uwierzytelniania (AWS4-HMAC-SHA256). Boto boryka się z problemami, jeśli spróbujesz połączyć się z czymkolwiek w takim regionie z regionu, który wciąż używa starego schematu (takiego jak Dublin).

+0

To nie jest odpowiedź. Wyjeżdżasz z Frankfurtu zamiast sugerować sposób na włączenie V4. –

+0

Pytanie dotyczyło dostępu do wiader S3 we Frankfurcie za pomocą boto. Jednoznaczne określenie regionu Frankfurtu jest jednym ze sposobów, aby to zrobić (umożliwiając uwierzytelnianie w wersji V4). –

Powiązane problemy