#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 в серверной части.