Полная документация – тут>>>.
Основные способы авторизации, по очереди их выполнения:
- передача данных доступа методу
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]
Готово.