Jak określić poświadczenia podczas łączenia się z boto3 S3?

109

Na boto określałem swoje dane uwierzytelniające podczas łączenia się z S3 w następujący sposób:

import boto
from boto.s3.connection import Key, S3Connection
S3 = S3Connection( settings.AWS_SERVER_PUBLIC_KEY, settings.AWS_SERVER_SECRET_KEY )

Mógłbym wtedy użyć S3 do wykonania moich operacji (w moim przypadku usunięcia obiektu z zasobnika).

W przypadku boto3 wszystkie znalezione przykłady są takie:

import boto3
S3 = boto3.resource( 's3' )
S3.Object( bucket_name, key_name ).delete()

Nie mogłem określić moich poświadczeń i dlatego wszystkie próby kończą się InvalidAccessKeyIdbłędem.

Jak mogę określić poświadczenia w boto3?

Robert Brax
źródło
Ta odpowiedź może ci pomóc: stackoverflow.com/a/36913771/2681632
Ilja Everilä
2
Zobacz sekcję „Konfigurowanie poświadczeń” w oficjalnej dokumentacji: boto3.readthedocs.io/en/latest/guide/configuration.html
Mark B

Odpowiedzi:

169

Możesz utworzyć sesję :

import boto3
session = boto3.Session(
    aws_access_key_id=settings.AWS_SERVER_PUBLIC_KEY,
    aws_secret_access_key=settings.AWS_SERVER_SECRET_KEY,
)

Następnie użyj tej sesji, aby uzyskać zasób S3:

s3 = session.resource('s3')
Alasdair
źródło
25
działa, przyjmuję to jako odpowiedź. Dlaczego do diabła nie udokumentują tego jako oczywisty sposób na zrobienie tego? !!
Robert Brax
3
Jak wspomniano w komentarzu powyżej, jest to w rzeczywistości w dokumentacji .
Moot
74

Możesz uzyskać clientnową sesję bezpośrednio, jak poniżej.

 s3_client = boto3.client('s3', 
                      aws_access_key_id=settings.AWS_SERVER_PUBLIC_KEY, 
                      aws_secret_access_key=settings.AWS_SERVER_SECRET_KEY, 
                      region_name=REGION_NAME
                      )
Rajez
źródło
10
Działa to w przypadku uzyskania klienta s3 , ale OP chciał zamiast tego zasób s3 .
Alasdair
Zgadzam się z @Alasdair. Dokumenty nie pokazują, jak cokolwiek zrobić z klientem, podobnie jak ty, więc nie widzę, jakie znaczenie ma ta odpowiedź.
Cerin
Próbowałem tego, ale pojawia się błąd „Nie można zlokalizować poświadczeń”. Wcześniej usunąłem folder ~ / .aws, aby to przetestować, ponieważ wiem, że boto będzie domyślnie szukał kredytów ...
Prathamesh dhanawade
8

To jest starsze, ale umieszczam to również tutaj w celach informacyjnych. boto3.resource po prostu implementuje domyślną sesję, możesz przekazać szczegóły sesji boto3.resource.

Help on function resource in module boto3:

resource(*args, **kwargs)
    Create a resource service client by name using the default session.

    See :py:meth:`boto3.session.Session.resource`.

https://github.com/boto/boto3/blob/86392b5ca26da57ce6a776365a52d3cab8487d60/boto3/session.py#L265

widać, że przyjmuje te same argumenty, co Boto3.Session

import boto3
S3 = boto3.resource('s3', region_name='us-west-2', aws_access_key_id=settings.AWS_SERVER_PUBLIC_KEY, aws_secret_access_key=settings.AWS_SERVER_SECRET_KEY)
S3.Object( bucket_name, key_name ).delete()
DataDecay
źródło
5

Chciałbym rozwinąć odpowiedź @ JustAGuy. Preferowaną przeze mnie metodą jest AWS CLIutworzenie pliku konfiguracyjnego. Powodem jest to, że w pliku konfiguracyjnym rozszerzenieCLI lub SDKautomatycznie szuka poświadczeń w ~/.awsfolderze. A dobrą rzeczą jest to, że AWS CLIjest napisane w Pythonie.

Możesz pobrać cli z pypi, jeśli jeszcze go nie masz. Oto kroki, aby skonfigurować cli z terminala

$> pip install awscli  #can add user flag 
$> aws configure
AWS Access Key ID [****************ABCD]:[enter your key here]
AWS Secret Access Key [****************xyz]:[enter your secret key here]
Default region name [us-west-2]:[enter your region here]
Default output format [None]:

Po tym możesz uzyskać dostęp botodo dowolnego interfejsu API bez konieczności określania kluczy (chyba że chcesz użyć innych poświadczeń).

x85ms16
źródło