Наиболее экономически эффективным вариантом будет тот, который вы описываете:
создайте лямбда-функцию, которая загружает ваш контент, архивирует его и загружает на S3.
Лямбда-функции имеют доступ к файловой системе хоста (500 МБ в /tmp
) и не забывают впоследствии удалить файл. Контейнер будет повторно использован (в вашем аккаунте)
запланировать событие CloudWatch для запуска лямбда-функции через регулярный интервал времени.
настроить лямбда-функцию для авторизации CloudWatch Event для вызова вашей функции
aws lambda add-permission --function-name my-function\
--action 'lambda:InvokeFunction' --principal events.amazonaws.com
--statement-id events-access \
--source-arn arn:aws:events:*:123456789012:rule/*
[ОБНОВЛЕНИЕ]: что делать, если размер файла для загрузки составляет 4 ГБ?
В этом случае у вас будет два варианта. Один с большей работой, но более экономически эффективным. Один проще реализовать, но это может стоить немного больше.
Вариант 1: полностью без сервера
Вы можете создать свою функцию AWS Lambda для загрузки содержимого 4 ГБ и передавать его на S3 с помощью фрагментов по 5 МБ и сжимать фрагменты с помощью фрагментов. Я не эксперт по сжатию, но я уверен, что, возможно, найдется библиотека, которая справится с этим.
Недостатком является то, что вам нужно написать определенный код, это будет не так просто, как объединение инструментов командной строки AWS CLI и GZIP.
Вариант 2: запустить экземпляр EC2 на время выполнения задания
Запланированная лямбда-функция может использовать API EC2 для запуска экземпляра. Сценарий задания можно передать экземпляру с помощью userdata
( сценарий, который экземпляр будет выполнять во время загрузки ). Этот сценарий может вызвать TerminateInstance
, когда задание выполнено, чтобы убить себя и перестать платить за это.
Недостатком является то, что вам придется платить за время работы этого экземпляра (вы можете иметь 750 часов в месяц бесплатно из t2.micro
экземпляров)
Положительным моментом является то, что вы можете использовать стандартные инструменты командной строки, такие как AWS CLI и GZIP, и у вас будет достаточно локального хранилища для вашей задачи.
Вот как запустить экземпляр из Python: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#EC2.Client.start_instances