Как получить доступ к локальным службам HTTP из моей функции Lambda?
Я создал лямбда-функцию javascript, которая запускается запросом шлюза API. Я протестировал его из своего внешнего интерфейса, и он отлично работает (размещен за пределами AWS).
Однако из моей функции мне нужно вызвать службу HTTP из моей локальной сети как вызов API. Я протестировал сервис через локальное VPN-соединение на своем компьютере, и он работает как часы. Прочитав документацию AWS, я пришел к выводу, что мне нужно настроить свою лямбду для работы внутри VPC и подключить этот VPC к VPN типа «сеть-сеть».
Я создал межсайтовую VPN, и туннели работают без проблем. Я создал клиентский шлюз для своей локальной сети, а также виртуальный частный шлюз для своей сети AWS. Я установил флажок, чтобы передать в таблицу маршрутизации локальные префиксы IP, которые я объявил при создании VPN. (Я понимаю, что префиксы IP — это локальные конечные точки IP, которых мне нужно достичь. Например, предположим, что мои службы размещены на 172.31.0.2 и 172.31.15.22, поэтому я объявил их как /32, поскольку они представляют собой один IP-адрес. и AWS попросил меня предоставить CIDR.)
Я также создал свой VPC, связал его с VPN и объявил подсеть. Сетевой администратор дал мне диапазон CIDR в качестве варианта маршрутизации для наших сервисов AWS (скажем, 172.31.50.160/29), поэтому я объявил CIDR VPC как 172.21.0.0/16, а подсеть — как 172.31.50.160/28. Я также убедился, что в конфигурациях лямбда указаны мой только что созданный VPC и подсеть, а также группа безопасности.
Хотя мой внешний интерфейс все еще может без проблем вызывать лямбду, я не могу подключиться к локальной сети. Я всегда получаю ошибку ENOTFOUND, поэтому я предполагаю, что это означает, что вызов API не проходит через туннель VPN, поскольку служба доступна только через туннель. Так что я предполагаю, что это, скорее всего, ошибка маршрутизации. Однако я не уверен, как это решить.
В моей таблице маршрутизации показаны распространяемые IP-адреса и виртуальный частный шлюз в качестве пункта назначения, а также 172.31.0.0/16 с пунктом назначения в качестве локального. Я предполагаю, что это может быть ошибка маршрутизации, возможно, я допустил ошибку, установив этот диапазон CIDR в качестве диапазона VPC.
Я также пытался добавить ведение журнала cloudwatch в VPC для проверки трафика, но ничего не регистрируется, оно всегда пустое. Я убедился, что у роли IAM, которую я использовал для этого, есть разрешения для наблюдения за облаком, думая, что это может быть проблемой, но даже после этого журналы пусты.
Как видите, у меня есть только самые базовые знания о сетях, поэтому любая помощь приветствуется!
TL;DR
Цель: разрешить моей лямбда-функции доступ к локальной службе на локальном компьютере.
Ожидаемые результаты: после подключения лямбды к VPC, связанному с работающей VPN, моя лямбда сможет получить доступ к локальному компьютеру.
Фактические результаты: лямбда не может найти локальный компьютер (ошибка getaddrinfo ENOTFOUND), кажется, что трафик не проходит через туннель VPN.
1 ответ
Оказывается, так же, как лямбда не может получить прямой доступ к Интернету без общедоступного шлюза NAT и правильной маршрутизации, лямбда не может получить доступ к локальным машинам через VPN без частного шлюза NAT.
Поэтому я создал частную подсеть в своем VPC, используя диапазон CIDR, предоставленный мне администратором локальной сети. Затем я перенаправил свои запросы на локальные машины на частный шлюз NAT. Таблица маршрутизации для этой частной подсети направила поток моего трафика на виртуальный частный шлюз, и таким образом я смог получить доступ к локальным компьютерам.
Резюме
- Создайте частную подсеть в вашем VPC (не связывайте ее с лямбдой)
- Создайте частный шлюз NAT и свяжите его с новой подсетью.
- В таблице маршрутов, которая управляет подсетями, связанными с лямбдой, направьте запросы к локальным компьютерам на частный шлюз NAT, созданный на шаге 2.
- В таблице маршрутизации частного NAT направьте запросы на ваш виртуальный частный шлюз, связанный с вашей VPN.
И готово, вы должны иметь возможность отправлять HTTP-запросы с вашей лямбды на ваши локальные серверы.