Скачивание файлов с s3 в лямбду - PullRequest
0 голосов
/ 31 марта 2019

Пытаюсь скачать файлы с s3 в лямбду AWS.

Существует веб-служба, которая отправляет метаданные s3 (ключ, сегмент) в SQS. У меня есть лямбда, которая загружает файл и передает его содержимое вasticsearch. Вот мой код:

import config

def push_data(event, context):
    try:
        _push_data(event, context)
    except Exception as e:
        print("Exception raised %s" % e)


def _push_data(event, context):
    files_data = get_files_data(event)
    for file_data in files_data:
        is_success, data = push_file(
            index=file_data["index"], file_bucket=file_data["file_bucket"],
            file_key=file_data["file_key"]
        )
        if is_success:
            call_post_push(file_data[0], data)


def push_file(index, file_bucket, file_key):
    start_time = datetime.datetime.now()
    print("I have started downloading %s" % start_time)

    file_path = '/tmp/a.xlsx'
    # download file from s3
    client = boto3.client(
        's3',
        aws_access_key_id=config.AWS_ACCESS_KEY_ID,
        aws_secret_access_key=config.AWS_SECRET_ACCESS_KEY,
    )
    client.download_file(Bucket=file_bucket, Key=file_key, Filename=file_path)
    #

    # contains code to push file contents to s3
    print("Finished")

Когда исполняется лямбда, после печати I have started downloading .. истекает время ожидания.

  1. Лямбда находится внутри виртуального виртуального процессора, для которого настроен шлюз NAT.
  2. Лямбда имеет разрешение на доступ к s3.
  3. Ведро s3, из которого я загружаю файл, находится в другом регионе, чем лямбда. Однако я не думаю, что это должно вызывать какие-либо проблемы.
  4. Я увеличил время ожидания до 5 минут. для функции, так что в случае, если файл огромен, я не получаю никаких проблем
  5. Сначала я загрузил небольшой файл, чтобы убедиться, что время загрузки невелико.
  6. Я запустил тот же код на своей локальной машине, чтобы проверить, нет ли проблем с загрузкой. Получается, что загрузка файла, который я тестирую с помощью Lambda, занимает не более 1 секунды.

Выполнение всего вышеперечисленного не помогло. Пожалуйста, дайте мне знать, как решить эту проблему, или если есть что-то, что мне нужно проверить.

1 Ответ

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

Проблема заключается в том, что лямбда-функция не может получить доступ к общедоступному Интернету и не может достичь конечной точки API S3.Скорее всего, шлюз Nat не находится в общедоступной подсети, то есть шлюз nat не находится в подсети с интернет-шлюзом в качестве маршрута по умолчанию.

Чтобы это исправить, создайте шлюз nat в общедоступной подсети и используйте его в качестве маршрута по умолчанию для лямбда-функции или добавьте конечную точку VPC для S3.Используйте этот VPCE в качестве следующего маршрута в таблице маршрутов для подсети, содержащей функцию лямбда-выражения.

https://docs.aws.amazon.com/vpc/latest/userguide/vpce-gateway.html

...