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?


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')

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
                      )

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()

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).


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.