AWS Lambda (Python) - загрузка файлов из Интернета и загрузка непосредственно в AWS S3 - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь загрузить файл из API для загрузки (потока) непосредственно в S3.

Мой код для локальных загрузок (который отлично работает):

import requests
import datetime
import os

headers = {'Authorization': 'apikey THISISHIDDEN'}
baseURL = 'https://api.test.au/busschedule/'
target_path = datetime.datetime.now().strftime('%Y-%m-%d schedule') + '.zip'

response = requests.get(baseURL, stream=True, headers=headers)
handle = open(target_path, "wb")
for chunk in response.iter_content(chunk_size=512):
    if chunk:  # filter out keep-alive new chunks
        handle.write(chunk)
handle.close()

Моя попытка загрузки и потоковой передачи на S3 (которая не сработала):

# import requests
import datetime
import os
import boto3
import botocore.vendored.requests.packages.urllib3 as urllib3

# Get environment variables from serverless.yml
bucket = "bucket"  
s3folder = "schedules"

# Set standard script parameters
headers = {'Authorization': 'apikey THISISHIDDEN'}
baseURL = 'https://api.test.au/busschedule/'


def run(event, context):
    s3 = boto3.client('s3')
    datetimestamp = datetime.datetime.today().strftime('%Y%m%dT%H%M%S')
    filename = datetimestamp + " bus schedule.zip"
    key = s3folder + '/' + filename  # your desired s3 path or filename
    http = urllib3.PoolManager()
    s3.upload_fileobj(http.request('GET', baseURL,
                                   headers=headers, preload_content=False),
                                   bucket, key)


def main():
  run({},{})


if __name__ == "__main__":
        exit(main())

Ошибка, которую мне возвращает CloudWatch:

InsecureRequestWarning: Unverified HTTPS request is being made.  Timeout after 300.10s.

РЕДАКТИРОВАТЬ: лямбда-функция имеет время ожидания 300 секунд; но это должно быть более чем достаточно долго, чтобы загрузить файл (6 МБ). Локальная загрузка выполняется в течение примерно 10 секунд. У кого-нибудь есть лучший подход к этому?

1 Ответ

0 голосов
/ 02 апреля 2019

Решена эта проблема с помощью библиотеки «smart_open»:

response = requests.get(baseURL, stream=True, headers=headers)
s3url = 's3://' + bucket + '/' + key
with smart_open(s3url, 'wb') as fout:
    fout.write(response.content)

У меня есть еще одна проблема, которую нужно разрешить (лямбда-разрешения), но это будет отдельный вопрос. Запуск этого локально сработал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...