#amazon-web-services #aws-lambda #amazon-vpc
Вопрос:
У меня есть лямбда-функция, к которой подключен шлюз API. Он имеет общедоступный IP-адрес и доменное имя (созданное бессерверной платформой). Я могу получить доступ к нему из широкого Интернета, из моего собственного браузера (и других устройств).
Проблема в том, что он, похоже, недоступен для других служб в моей учетной записи, например, для экземпляра EC2. Из упомянутого экземпляра curl google.com
работает и возвращает ответ, но mylink.com
время ожидания свертывания истекает.
Я думаю, что это как-то связано с настройкой VPC, но я не могу понять, в чем дело. В чем здесь может быть проблема?
Обновление: Используя curl --verbose
, я обнаружил, что при доступе из любого другого места IP-адрес, к которому ведет шлюз API, отличается от того, к которому осуществляется доступ из моей учетной записи AWS. VPC, похоже, не имеет значения, я создал новый VPC, экземпляр EC2 внутри него, и он все равно сделал то же самое.
Комментарии:
1. Есть ли у вас конечная точка интерфейса VPC для шлюза api?
2. Можете ли вы показать таблицу маршрутов для этого VPC?
3. Поэтому ссылки запрещены, поэтому я опишу: 172.31.0.0/16 локально активен, 0.0.0.0/0 igw-69***** активный
4. Вы вносили какие-либо изменения в VPC по умолчанию?
5. @Marcin Итак, это сработало. Не могли бы вы, пожалуйста, написать ответ, объясняющий, как и почему это работает, и я назначу вам награду?
Ответ №1:
Основываясь на комментариях.
Проблема была вызвана наличием конечной точки интерфейса VPC для шлюза API в VPC по умолчанию. Конечная точка интерфейса VPC для шлюза API используется для частного API, а не для общедоступных API, как это используется в OP. Впоследствии вызовы общедоступных конечных точек API завершаются неудачно, как объясняется в блоге AWS:
Когда они настроены как частные, общедоступные сети недоступны для маршрутизации вашего API. Вместо этого доступ к вашему API можно получить только с помощью настроенных вами конечных точек интерфейса.
Есть два способа борьбы с этой проблемой:
- отключите опцию частного DNS — имени для конечной точки или
- удалите конечную точку.
В случае с операцией для решения проблемы был использован второй вариант.
Комментарии:
1. Как же тогда оператору удалось получить доступ к функции Lambda через шлюз API из Интернета? Кстати, спасибо за хорошее объяснение.
2. @СтефанН, Спасибо. Вопрос был прямо противоположным. Как получить доступ к общедоступному шлюзу API из lambda в VPC.
3. ОК. Но в первоначальном описании вопроса (первый абзац) ОП утверждает, что он может получить доступ к функции Lambda из Интернета. Почему это так, если «общедоступные сети недоступны»?
4. @StefanN Лямбда была снабжена общедоступным API. Не было доступа к API из экземпляра ec2. Это может произойти из-за конечной точки интерфейса шлюза api, которая может скрывать общедоступные dns-имена шлюза api.
Ответ №2:
Экземпляр EC2, скорее всего, находится внутри VPC, у которого нет общедоступного доступа в Интернет (или может быть, но через балансировщик нагрузки, хост бастиона или множество других опций).
Вам нужно будет выяснить, в каком VPC находится экземпляр EC2, и убедиться, что ваша функция lambda имеет к нему доступ. Вы можете добавить функцию в VPC, следуя документации
Комментарии:
1. Он находится внутри VPC по умолчанию, и у него есть доступ в Интернет. Просто, как ни странно, нет доступа к этой конкретной лямбде. Что еще более интересно, у него был доступ к нему всего несколько дней назад. Не он просто перестал работать вместе с другой машиной EC2 в том же VPC.