2016-04-08 3 views
6

Я пытаюсь сделать http-запрос от моей AWS Lambda, но это время.Запрос на Python в AWS Lambda time out

Мой код выглядит похож на это:

import requests 

def lambda_handler(event, context): 
    print('Im making the request') 
    request.get('http://www.google.com') 
    print('I recieved the response') 

Но когда я проверить это, я получаю тайм-аут.

Выход

Im making the request 
END RequestId: id 
REPORT RequestId: id Duration: 15003.25 ms Billed Duration: 15000 ms Memory Size: 128 MB Max Memory Used: 18 MB 
2016-04-08T20:33:49.951Z id Task timed out after 15.00 seconds 

Так что я знаю, этот вопрос не так, не найдя пакет запроса, и он работает мой питон код. Я просто выясняю, почему это истекает по этой просьбе.

+0

Включили ли вы доступ VPC для вашей функции лямбда? –

+0

Да, доступ VPC включен. – user2734679

ответ

3

Я столкнулся с таким же timeout problem, причина ниже.

AWS document:

При добавлении конфигурации VPC к функции лямбда, он может только доступ к ресурсам в этой VPC. Если функции Lambda необходимо получить доступ к ресурсам VPC и общедоступному Интернету, VPC должен иметь экземпляр преобразования сетевых адресов (NAT) внутри VPC.

Возможно, есть некоторая ошибка при настройке VPC. Я советую вам следовать за этим blog, чтобы построить NAT.

4

Функция Lambda с доступом VPC не будет иметь доступ к Интернету, если вы не добавите шлюз NAT к VPC. Вы должны прочитать раздел «Что нужно знать» в Lambda VPC support announcement.

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

+2

Добавлен NAT-шлюз к VPC и маршрут для 0.0.0.0 через этот NAT, но все еще что-то отсутствует. Тайм-ауты все еще происходят. – user2734679

+0

Интересно, требуется ли NAT, если указан публичный подсеть? –

+0

Да, это все еще требуется, потому что функция Lambda не получает общедоступный IP-адрес. –

1

Вы можете увеличить период ожидания для запроса, выполнив следующие действия:

response = requests.get(url, timeout=60) 

Кроме того, вам нужно будет увеличить время ожидания для вашего лямбда-функции. Для этого:

  • Откройте функцию лямбда в AWS
  • Выберите «Configuration», а затем «Дополнительные настройки»
  • Увеличьте тайм-аут период (до 5 минут)
  • Выберите «Сохранить»

Кроме того, я считаю, что request.get должен быть «request.get».

0

Значение по умолчанию для тайм-аута в лямбде составляет 3 секунды = 3000 микросекунд. Перейдите в раздел «Дополнительные настройки» и добавьте 5 минут. Это может быть единственная проблема, если таймаут происходит ровно через 3 секунды. Все другие ошибки занимают нечто большее или меньшее.

+0

Добро пожаловать в StackOverflow и спасибо за вашу помощь. Возможно, вы захотите сделать свой ответ еще лучше, добавив некоторые объяснения. –

0

По умолчанию AWS Lambda имеет 3 секунды таймаута, поэтому, если ваш код работает более 3 секунд, он автоматически отключит эту ошибку.

Вы можете увеличить время ожидания для вашей лямбда-функции до 5 минут (300 секунд - AWS может увеличить этот предел в будущем), и это должно позаботиться о проблеме.

Плюс ваш код должен отражать requests.get вместо request.GET