Как загрузить файлы объемом 6 ГБ — 500 ГБ с помощью python в lambda

#python #amazon-web-services #amazon-s3 #aws-lambda

#python #amazon-веб-сервисы #amazon-s3 #aws-lambda

Вопрос:

Ежечасно мне приходится загружать файлы объемом от 6 до 10 ГБ, а ежедневно мне приходится загружать файл объемом от 25 до 45 ГБ, а ежемесячно — от 400 до 500 ГБ. В настоящее время все это делается с использованием perl, и это отлично работает, но теперь мы переходим на AWS и Lambda, и при максимальном времени обработки Lambda 15 минут время ожидания моего кода истекает. Если у меня есть файлы размером менее 5,5 Гб, функция lambda python, которую я написал, работает просто отлично. Поэтому я надеюсь, что кому-то приходилось решать подобные проблемы, и он может мне помочь. Вот урезанная версия функции в том виде, в каком она находится сейчас.

 import boto3
from botocore.exceptions import ClientError
import datetime
from datetime import datetime, timedelta
import dateutil.tz
import urllib3
import time

def lambda_handler(event, context):
    http = urllib3.PoolManager()
    s3 = boto3.client('s3') 
    s3object = boto3.resource('s3')

    bucketName = "test-bucket"
    checkDir = "check"

    fileURL = 'https://export.dnsdb.info/dnsdb-export/mtbl/dns.20200930.0700.H.mtbl'
    # Check to see if the file exists in S3 bucket
    fileExists = True
    
    try:
        s3.head_object(Bucket=bucketName, Key=checkDir   '/'   file)
    except ClientError as e:
        fileExists = False

    # If the file doesn't exist, download it
    if not fileExists:
        http = urllib3.PoolManager()
        hdr={'X-API-Key' : 'api-key'}
        response = http.request('GET', fileURL, preload_content=False, headers=hdr)
        s3.upload_fileobj(response, bucketName, checkDir   '/'   file)
        response = s3.head_object(Bucket=bucketName, Key=checkDir   '/'   file)
  

Комментарии:

1. Обязательно ли это должно быть с Lambda? Может быть, EC2 будет более подходящим для этого?

2. Больше похоже на задание для AWS Batch

3. Почему в комментарии написано «загрузить», но в коде указано upload_fileobj() ? Как вы загружаете такие большие файлы, учитывая, что Lambda имеет ограничение в 512 /tmp/ МБ дискового пространства? Этот вариант использования, похоже, не подходит для использования AWS Lambda.

Ответ №1:

AWS Lambda можно использовать только в течение 15 минут за выполнение. Это означает, что если ваша загрузка займет больше времени, вы получите тайм-аут, как вы описываете. По сути, вы ограничены скоростью загрузки, но получение файла объемом 500 ГБ менее чем за 15 минут означает загрузку со скоростью> 560 МБ / с, что нереально в большинстве сценариев. Возможно, стоит рассмотреть возможность использования EC2 вместо Lambda.

Комментарии:

1. Я все знаю о 15-минутном ограничении. В настоящее время он работает на экземпляре EC2, поэтому, если нам нужно оставить там ежемесячный, это нормально. Я надеялся, что кто-нибудь использовал многопоточность для разделения почасовых и ежедневных файлов, чтобы я мог, по крайней мере, сохранить части в корзину s3, чтобы я мог собрать их вместе в другой функции.

2. @TerryJensen было бы возможно выполнить многопоточное разделение, но это не то, над чем люди здесь будут работать за вас, если вы не показали, что вы пробовали или исследовали.

3. Если он работает на EC2, тогда используйте это! Вы можете сэкономить деньги, отключив экземпляр, когда он не используется. См.: Автоматическая остановка экземпляров EC2 при завершении задачи — Сообщество разработчиков

Ответ №2:

Вот несколько идей: