Python: boto3 – примеры аутентификации и авторизации

Автор: | 02/01/2018

PythonПолная документация – тут>>>.

Основные способы авторизации, по очереди их выполнения:

  1. передача данных доступа методу boto.client()
  2. передача данных доступа параметрами при создании объекта Session()
  3. переменные окружения
  4. файл данных CLI ~/.aws/credentials
  5. файлы /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]

Готово.