Como especificar credenciais ao se conectar ao boto3 S3?

98

No boto eu costumava especificar minhas credenciais ao me conectar ao S3 da seguinte maneira:

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

Eu poderia então usar o S3 para realizar minhas operações (no meu caso, excluir um objeto de um balde).

Com boto3 todos os exemplos que encontrei são:

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

Não consegui especificar minhas credenciais e, portanto, todas as tentativas falharam com InvalidAccessKeyIderro.

Como posso especificar credenciais com boto3?

Robert Brax
fonte
Esta resposta pode ajudá-lo: stackoverflow.com/a/36913771/2681632
Ilja Everilä
1
Consulte a seção "Configurando credenciais" na documentação oficial: boto3.readthedocs.io/en/latest/guide/configuration.html
Marcos B

Respostas:

150

Você pode criar uma sessão :

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

Em seguida, use essa sessão para obter um recurso S3:

s3 = session.resource('s3')
Alasdair
fonte
22
funciona, vou tomar isso como a resposta. Por que diabos eles não documentam isso como a maneira óbvia de fazer isso? !!
Robert Brax
2
Conforme mencionado em um comentário acima, isso está de fato na documentação .
Moot de
67

Você pode obter uma clientcom nova sessão diretamente como abaixo.

 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
fonte
9
Isso funciona para obter um cliente s3 , mas o OP queria um recurso s3 .
Alasdair de
Eu concordo com @Alasdair. Os documentos não mostram como fazer nada com o cliente, e nem você, então não vejo como essa resposta seja relevante.
Cerin de
Eu tentei fazer isso, mas me deu o erro "Não foi possível localizar credenciais" .. Eu havia removido anteriormente a pasta ~ / .aws para testar isso, pois sei que o boto irá, por padrão, procurar creds lá ...
Prathamesh dhanawade
6

Isso é mais antigo, mas coloquei aqui para minha referência também. boto3.resource está apenas implementando a Sessão padrão, você pode passar pelos detalhes da sessão de 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

você pode ver que leva apenas os mesmos argumentos que 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
fonte
5

Eu gostaria de expandir a resposta de @JustAGuy. O método que prefiro é usar AWS CLIpara criar um arquivo de configuração. O motivo é que, com o arquivo de configuração, o CLIou o SDKprocurará automaticamente por credenciais na ~/.awspasta. E o bom é que AWS CLIestá escrito em python.

Você pode obter cli de pypi se ainda não o tiver feito. Aqui estão as etapas para configurar o CLI no terminal

$> 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]:

Depois disso, você pode acessar botoe qualquer uma das APIs sem precisar especificar chaves (a menos que você queira usar uma credencial diferente).

x85ms16
fonte