Полная документация — тут>>>.
Основные способы авторизации, по очереди их выполнения:
- передача данных доступа методу
boto.client() - передача данных доступа параметрами при создании объекта
Session() - переменные окружения
- файл данных CLI
~/.aws/credentials - файлы
/etc/boto.cfgи~/.boto
Пишу скрипт бекапа (очередной 🙂 ), и очень хочется избежать передачи данных через файл настроек скрипта, поэтому основным вариантом для домашней машины я выберу файл ~/.aws/credentials, т.к. тут есть AWS CLI со всеми профилями, а для других — используем переменные окружения и уже на крайний случай — файл настроек самого скрипта.
Собственно, ниже три примера такой авторизации.
Содержание
boto3 авторизация из ~/.aws/credentials
Предполагается, что именованные профили для AWS CLI настроены, теперь используем их для авторизации в AWS.
Сам профиль без ключей выглядит так:
[simterm]
$ cat .aws/credentials | grep -A2 '^\[rtfm\]$' | cut -d" " -f1,2 [rtfm] aws_access_key_id = aws_secret_access_key =
[/simterm]
Теперь cоздадим функцию create_conn(), которая аргументом будет принимать имя профиля:
... def create_conn(profile_name):
В нём создадим объект класса Session():
... session = boto3.Session(profile_name=profile_name) ...
В котором создадим s3-клиент:
...
s3_client = session.client('s3')
...
Теперь полностью функция выглядит так:
...
def create_client(profile_name):
session = boto3.Session(profile_name=profile_name)
s3_client = session.client('s3')
return s3_client
...
Добавляем её вызов, скрипт полностью:
#!/usr/bin/env python
import boto3
import configparser
def create_client(profile_name):
session = boto3.Session(profile_name=profile_name)
s3_client = session.client('s3')
return s3_client
if __name__ == '__main__':
s3 = create_client('rtfm')
print(type(s3))
Запускаем:
[simterm]
$ ./s3sync.py <class 'botocore.client.S3'>
[/simterm]
ОК, добавим действия — с помощью метода upload_file() скопируем файл test.txt в корзину setevoy-example-bucket и следующим шагом — отобразим её содержимое:
...
if __name__ == '__main__':
s3 = create_client('rtfm')
print(type(s3))
s3.upload_file('test.txt', 'setevoy-example-bucket', Key='test.txt')
response = s3.list_objects(Bucket='setevoy-example-bucket')
for file in response['Contents']:
print(file['Key'])
Запускаем:
[simterm]
$ touch test.txt $ ./s3sync.py <class 'botocore.client.S3'> test.txt
[/simterm]
Авторизация через переменные
Тут всё ещё проще — boto3 сам попробует их получить при создании сессии.
Задаём переменные:
[simterm]
$ export AWS_ACCESS_KEY_ID=AKI***E7A $ export AWS_SECRET_ACCESS_KEY=S/7***YPP
[/simterm]
Обновляем функцию create_client() — убираем параметр profile_name:
...
def create_client():
session = boto3.Session()
s3_client = session.client('s3')
return s3_client
...
Остальное без изменений, запускаем:
[simterm]
$ ./s3sync.py <class 'botocore.client.S3'> test.txt
[/simterm]
Авторизация через параметры boto3.client()
Снова обновим функцию и добавим два аргумента — access_key и secret_key:
...
def create_client(access_key, secret_key):
#session = boto3.Session()
#s3_client = session.client('s3')
s3_client = boto3.client('s3',
aws_access_key_id=access_key,
aws_secret_access_key=secret_key,)
return s3_client
...
Перед вызовом функции — используем ConfigParser, что бы получить ключи из файла '../conf/simple-site-backup.ini' и записать их в переменные access_key и secret_key, которые потом будут переданы в create_client():.
Сам файл выглядит так:
[simterm]
$ cat ../conf/simple-site-backup.ini | grep -A5 defaults | tail -2 aws_access_key = AKI***E7A aws_secret_key = S/7***YPP
[/simterm]
Код:
...
if __name__ == '__main__':
parser = configparser.ConfigParser()
parser.read('../conf/simple-site-backup.ini')
access_key = parser.get('defaults', 'aws_access_key')
secret_key = parser.get('defaults', 'aws_secret_key')
s3 = create_client(access_key, secret_key)
print(type(s3))
s3.upload_file('test.txt', 'setevoy-example-bucket', Key='test.txt')
response = s3.list_objects(Bucket='setevoy-example-bucket')
for file in response['Contents']:
print(file['Key'])
Вызываем скрипт:
[simterm]
$ ./s3sync.py <class 'botocore.client.S3'> test.txt
[/simterm]
Готово.