Как распаковать zip архив в Yandex Cloud Object Storage
· 2 мин. чтения
Для этого нам понадобится serverless функция.
При создании не забудь те указать переменные окружения AWS_ACCESS_KEY_ID
и AWS_SECRET_ACCESS_KEY
. А также понадобится файл с описанием зависимостей requirements.txt. Полный код тут.
import os
import re
import zipfile
from io import BytesIO
import boto3 as boto3
import pydash as pydash
AWS_ACCESS_KEY_ID = os.environ.get("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.environ.get("AWS_SECRET_ACCESS_KEY")
def handler(event: dict, context):
session = boto3.session.Session()
client = session.client(
service_name="s3",
endpoint_url="https://storage.yandexcloud.net",
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
)
bucket_id = pydash.get(event, 'messages[0].details.bucket_id')
object_id = pydash.get(event, 'messages[0].details.object_id')
if not re.search(r'\.zip$', object_id):
print('Doesnt match')
return
zip_obj = client.get_object(Bucket=bucket_id, Key=object_id)
buffer = BytesIO(zip_obj["Body"].read())
z = zipfile.ZipFile(buffer)
for filename in z.namelist():
file_info = z.getinfo(filename)
print(file_info)
client.upload_fileobj(
z.open(filename),
Bucket=bucket_id,
Key=f'{filename}'
)
Далее нужно настроить триггер, который будет ее дергать, срабатывая на загрузку новых архивов.
форма создания триггера
В остальном все просто.
- Указываем наш бакет.
- В поле префикс указано куда в бакете нужно загрузить архив, чтобы триггер сработал.
- В суффиксе мы фильтруем объекты, тк нам интересны только архивы, считаем, что их ключи кончаются на
.zip
. - Сервисный аккаунт, указанный при создании триггера, имеет роль
serverless.functions.invoker
.
Всё. Теперь когда в бакет по пути начинающемуся на archives/
будет загружен архив, он автоматически распакуется в тот же бакет.