2016-10-19 2 views
3

Это, вероятно, вопрос с легким ответом, но я не могу понять, как это понять.AWS Лямбда-передача HTTP-запроса

Фон: У меня есть функция Lambda на питоне, чтобы подбирать изменения в БД, а затем используя HTTP-сообщение об изменениях в json для URL-адреса. Я использую urllib2 вроде этого:

# this runs inside a loop, in reality my error handling is much better 
request = urllib2.Request(url) 
request.add_header('Content-type', 'application/json') 
try: 
    response = urllib2.urlopen(request, json_message) 
except: 
    response = "Failed!" 

кажется из бревен либо вызова для отправки сообщения пропускается полностью или раз-аут во время ожидания ответа.

Есть ли настройка разрешения, которую мне не хватает, исходящие правила в AWS кажутся правильными. [Edit] - VPC, примененный к этой лямбде, имеет доступ в Интернет, и применяемые группы безопасности разрешают доступ в Интернет. [/ Edit]

Я тестировал код локально (подключен к одному источнику данных), и он работает безупречно.

Похоже, что другие вопросы, связанные с проводкой из лямбда, связаны с node.js и обычно потому, что URL-адрес неверен. В этом случае я использую url requestb.in, который, как я знаю, работает так, как работает при запуске локально.

Edit:

я установки мой шлюз NAT, и он должен работать, я даже зашел так далеко, как идти к другой учетной записи AWS, повторное создание условий, и она отлично работает. Я не вижу никаких групп безопасности, которые будут блокировать доступ в любом месте. Он продолжает тайм-аут.

Edit: Оказывается, я был просто идиотом, когда я настроить мой маршрут по умолчанию к шлюзу NAT, по привычке я написал 0.0.0.0/24 вместо 0.0.0.0/0

+1

Ваша функция Lambda сконфигурирована для работы внутри вашего VPC? Он настроен для выполнения внутри общей подсети или частной подсети? –

+0

У меня есть 4 подсети, которые имеют доступ в Интернет. Он может получить доступ к другим ресурсам в тонкостях VPC/subnet, так как это DB. –

+0

Все 4 подсети публичные подсети? Или кто-то из них частный? –

ответ

6

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

Пообщаться общедоступным Интернет, Лямбда функции, развернутая внутри VPC должна быть сделана так, в частной подсети, которая имеет route либо к NAT Gateway или самоуправляемые NAT instance.

+0

Я установил NAT-шлюз, и он по-прежнему не может получить доступ к Интернету.Теперь у меня это работает в частной подсети, которая имеет маршрут к nat-шлюзу в общей подсети (маршрутизируется с помощью igw). –

+0

Какой тип VPC вы используете: один, созданный с помощью VPC WIzard от Management Console (например, «VPC с публичными и частными подсетями») или пользовательский? Вы настроили его или кого-то еще? Единственной другой частью VPC, которая может блокировать доступ, который еще не упоминался, является сетевой ACL (NACL). По умолчанию они обычно являются полностью разрешительными, но если это уже существовавший или пользовательский VPC, возможно, потребуется также изменить NACL. – Fishizzle

+0

Это была глупая проблема маршрута с моей стороны, мышечная память набрав/24 после того, как IP-адреса заставили мой маршрут по умолчанию сломаться, полностью мое плохое. –

0

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

import boto3 

client = boto3.client('lambda',aws_access_key_id=Target_ACCESS_KEY,aws_secret_access_key=Target_SECRET_KEY) 

response = client.invoke(
    FunctionName='string', 
    InvocationType='Event'|'RequestResponse'|'DryRun', 
    LogType='None'|'Tail', 
    ClientContext='string', 
    Payload=b'bytes'|file, 
    Qualifier='string' 
) 

Но убедитесь, что вы установили IAM политику для пользователя IAM (в счет Источник AWS) для вызова лямбда.

При добавлении к выше, boto3 использует HTTP на сервере.

Смежные вопросы