Отправка HTTP-запроса AWS Lambda

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

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

Вопрос:

Скорее всего, это вопрос с простым ответом, но, похоже, я не могу в нем разобраться.

Справочная информация: у меня есть лямбда-функция python для сбора изменений в БД, а затем с помощью 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 кажутся правильными. [Редактировать] — VPC, примененный к этой лямбде, действительно имеет доступ в Интернет, и применяемые группы безопасности, по-видимому, разрешают доступ в Интернет. [/Править]

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

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

Редактировать:

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

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

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

1. Ваша лямбда-функция настроена для запуска внутри вашего VPC? Настроен ли он для выполнения внутри общедоступной подсети или частной подсети?

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

3. Являются ли все 4 подсети общедоступными подсетями? Или какой-либо из них является частным?

4. Они являются частными, но я настроил шлюз для доступа к ним (у меня есть другие компьютеры EC2 в подсети, которые имеют доступ к Интернету нормально)

5. Есть ли у вас группа безопасности в вашем NAT, которая, возможно, блокирует доступ к вашим функциям Lambda?

Ответ №1:

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

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

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

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

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

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

4. Я сделал то же самое, Стив, создал кучу частных подсетей с помощью /x, а затем неправильно настроил маршрут.

Ответ №2:

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

 import boto3

client = boto3.client('lambda')

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

Но убедитесь, что вы установили политику IAM для роли lambda (в исходной учетной записи AWS) для вызова этого другого lambda.

В дополнение к вышесказанному, boto3 использует HTTP в серверной части.