boto3 и boto
boto3
Подготовка к работе
-
Назначьте сервисному аккаунту роли, которые нужны для вашего проекта, например storage.editor на бакет — для работы с конкретным бакетом, или на каталог — для работы со всеми бакетами в каталоге. Подробнее о ролях см. на странице Управление доступом с помощью Yandex Identity and Access Management.
Чтобы работать с объектами в зашифрованном бакете, у пользователя или сервисного аккаунта вместе с ролью
storage.configurer
должны быть следующие роли на ключ шифрования:kms.keys.encrypter
— для чтения ключа, шифрования и загрузки объектов;kms.keys.decrypter
— для чтения ключа, расшифровки и скачивания объектов;kms.keys.encrypterDecrypter
— включает разрешения, предоставляемые ролямиkms.keys.encrypter
иkms.keys.decrypter
.
Подробнее см. Сервисные роли Key Management Service.
-
Создайте статический ключ доступа.
В результате вы получите данные статического ключа доступа. Для аутентификации в Object Storage вам понадобятся:
key_id
— идентификатор статического ключа доступа;secret
— секретный ключ.
Сохраните
key_id
иsecret
, так как повторное получение значения ключа будет невозможно.
Примечание
Сервисный аккаунт может просматривать список бакетов только в том каталоге, в котором он был создан.
Сервисный аккаунт может выполнять действия с объектами в бакетах, которые созданы в каталогах, отличных от каталога сервисного аккаунта. Для этого назначьте сервисному аккаунту роли на нужный каталог или бакет в нем.
Установка
Для установки boto воспользуйтесь инструкциями в репозитории разработчика: boto3
Настройка
-
Создайте директорию для хранения аутентификационных данных и перейдите в нее:
Для macOS и Linux:
mkdir ~/.aws/
Для Windows:
mkdir C:\Users\<имя_пользователя>\.aws\
-
В директории
.aws
создайте файлcredentials
и скопируйте в него аутентификационные данные, полученные ранее:[default] aws_access_key_id = <идентификатор_статического_ключа> aws_secret_access_key = <секретный_ключ>
-
Создайте файл
config
с параметрами региона по умолчанию и скопируйте в него следующую информацию:[default] region = ru-central1 endpoint_url = https://storage.yandexcloud.net
Примечание
Некоторые приложения, предназначенные для работы с Amazon S3, не позволяют указывать регион, поэтому Object Storage принимает также значение
us-east-1
.
Для доступа к Object Storage используйте эндпоинт https://storage.yandexcloud.net
.
В функцию Cloud Functions добавьте переменные окружения:
AWS_ACCESS_KEY_ID
— идентификатор статического ключа сервисного аккаунта.AWS_SECRET_ACCESS_KEY
— секретный ключ.AWS_DEFAULT_REGION
— идентификатор региона.
Для доступа к Object Storage используйте адрес storage.yandexcloud.net
.
Пример
boto3:
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import boto3
session = boto3.session.Session()
s3 = session.client(
service_name='s3',
endpoint_url='https://storage.yandexcloud.net'
)
# Создать новый бакет
s3.create_bucket(Bucket='bucket-name')
# Загрузить объекты в бакет
## Из строки
s3.put_object(Bucket='bucket-name', Key='object_name', Body='TEST', StorageClass='COLD')
## Из файла
s3.upload_file('this_script.py', 'bucket-name', 'py_script.py')
s3.upload_file('this_script.py', 'bucket-name', 'script/py_script.py')
# Получить список объектов в бакете
for key in s3.list_objects(Bucket='bucket-name')['Contents']:
print(key['Key'])
# Удалить несколько объектов
forDeletion = [{'Key':'object_name'}, {'Key':'script/py_script.py'}]
response = s3.delete_objects(Bucket='bucket-name', Delete={'Objects': forDeletion})
# Получить объект
get_object_response = s3.get_object(Bucket='bucket-name',Key='py_script.py')
print(get_object_response['Body'].read())
Boto3 по умолчанию использует аутентификационные данные из директории ~/.aws
, но вы можете указать переменные AWS_ACCESS_KEY_ID
и AWS_SECRET_ACCESS_KEY
явно:
...
session = boto3.session.Session()
s3 = session.client(
service_name='s3',
endpoint_url='https://storage.yandexcloud.net'
aws_access_key_id='<идентификатор_статического_ключа>',
aws_secret_access_key='<секретный_ключ>'
)
Примечание
Данный метод считается небезопасным, так как существует риск утечки ключей.
boto
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import os
from boto.s3.key import Key
from boto.s3.connection import S3Connection
os.environ['S3_USE_SIGV4'] = 'True'
conn = S3Connection(
host='storage.yandexcloud.net'
)
conn.auth_region_name = 'ru-central1'
# Создать новый бакет
conn.create_bucket('bucket-name')
bucket = conn.get_bucket('bucket-name')
# Загрузить объекты в бакет
## Из строки
bucket.new_key('test-string').set_contents_from_string('TEST')
## Из файла
file_key_1 = Key(bucket)
file_key_1.key = 'py_script.py'
file_key_1.set_contents_from_filename('this_script.py')
file_key_2 = Key(bucket)
file_key_2.key = 'script/py_script.py'
file_key_2.set_contents_from_filename('this_script.py')
# Получить список объектов в бакете
keys_list=bucket.list()
for key in keys_list:
print (key.key)
# Удалить несколько объектов
response = bucket.delete_keys(['test-string', 'py_script.py'])
# Получить объект
key = bucket.get_key('script/py_script.py')
print (key.get_contents_as_string())
См. пример в руководстве по конвертации видео.