Как получить доступ к локальным службам 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. Таблица маршрутизации для этой частной подсети направила поток моего трафика на виртуальный частный шлюз, и таким образом я смог получить доступ к локальным компьютерам.

Резюме

  1. Создайте частную подсеть в вашем VPC (не связывайте ее с лямбдой)
  2. Создайте частный шлюз NAT и свяжите его с новой подсетью.
  3. В таблице маршрутов, которая управляет подсетями, связанными с лямбдой, направьте запросы к локальным компьютерам на частный шлюз NAT, созданный на шаге 2.
  4. В таблице маршрутизации частного NAT направьте запросы на ваш виртуальный частный шлюз, связанный с вашей VPN.

И готово, вы должны иметь возможность отправлять HTTP-запросы с вашей лямбды на ваши локальные серверы.

Другие вопросы по тегам