Как указать учетные данные при подключении к boto3 S3?

105

В boto я указывал свои учетные данные при подключении к S3 таким образом:

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

Затем я мог бы использовать S3 для выполнения своих операций (в моем случае удаления объекта из ведра).

С boto3 все примеры, которые я нашел, таковы:

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

Я не смог указать свои учетные данные, поэтому все попытки заканчиваются InvalidAccessKeyIdошибкой.

Как я могу указать учетные данные с помощью boto3?

Роберт Бракс
источник
Этот ответ может вам помочь: stackoverflow.com/a/36913771/2681632
Илья Эвериля
1
См. Раздел «Настройка учетных данных» в официальной документации: boto3.readthedocs.io/en/latest/guide/configuration.html
Mark B,

Ответы:

162

Вы можете создать сеанс :

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

Затем используйте этот сеанс для получения ресурса S3:

s3 = session.resource('s3')
Alasdair
источник
24
работает, приму это как ответ. Почему они не документируют это как очевидный способ сделать это? !!
Роберт Бракс,
3
Как уже упоминалось выше , в комментарии, это является на самом деле в документации .
Moot
71

Вы можете получить clientновый сеанс прямо, как показано ниже.

 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
источник
9
Это работает для получения клиента s3 , но OP вместо этого хотел ресурс s3 .
Alasdair
Я согласен с @Alasdair. В документации не показано, как что-либо делать с клиентом, и вы тоже, поэтому я не понимаю, насколько этот ответ актуален.
Cerin
Я пробовал это, но это дает мне ошибку «Невозможно найти учетные данные». Я ранее удалил папку ~ / .aws, чтобы проверить это, поскольку я знаю, что бото по умолчанию будет искать там кредиты ...
Пратхамеш Дханаваде
6

Это старше, но я тоже помещаю это сюда для справки. boto3.resource просто реализует сеанс по умолчанию, вы можете передать сведения о сеансе 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

вы можете видеть, что он просто принимает те же аргументы, что и 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
источник
5

Я хотел бы расширить ответ @ JustAGuy. Я предпочитаю использовать AWS CLIдля создания файла конфигурации. Причина в том, что с файлом конфигурации CLIили SDKавтоматически ищет учетные данные в ~/.awsпапке. И хорошо то, что AWS CLIон написан на питоне.

Вы можете получить cli из pypi, если у вас его еще нет. Вот шаги, чтобы настроить cli с терминала

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

После этого вы можете получить доступ к botoлюбому из API без необходимости указывать ключи (если вы не хотите использовать другие учетные данные).

x85ms16
источник