Лямбда-функция в VPC не имеет доступа к общедоступному Интернету. - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь отправить исходящий запрос API стороннему сервису из функции Lambda, но функция всегда отключается без ошибок.

Ранее это происходило при попытке выполнить операцию s3.putObject в другой функции (все еще в той же VPC / подсетях), и мне удалось обойти это, добавив конечную точку с именем службы com.amazonaws.us-east-1.s3 и подключив ее к таблице маршрутизации, связанной с VPC, в котором находится эта лямбда-функция.

На панели «Лямбда» внутри поля «Сеть» -> раздел «Группы безопасности» я вижу следующее предупреждение:

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

Я считаю, что эта группа безопасности разрешает исходящие соединения, основываясь на таблице исходящих правил, прямо под ней:

enter image description here

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

Я следовал руководству по созданию Flow Log для мониторинга трафика в и из VPC, надеясь увидеть, что эти исходящие запросы действительно отклоняются. Однако после этого и проверки журналов CloudWatch все записи заканчиваются на ACCEPT OK или NODATA.

Как я могу предоставить доступ в Интернет для моей функции VPC Lambda? - это руководство, которому я изначально пытался следовать, но я застрял на шаге 4 в разделе To create a public or private subnet:

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

    Пункт назначения: 0.0.0.0/0 Цель: nat-… (или eni-…) Для публичной подсети маршрут по умолчанию должен указывать на интернет-шлюз:

    Пункт назначения: 0.0.0.0/0 Цель: igw-…

Для всех четырех подсетей в этом VPC, щелкнув раскрывающийся список справа от Change to:, отобразился только один вариант, уже выбранный, rtb-xxxxxxxx. После нажатия на ссылку на эту таблицу маршрутов и перехода на вкладку Маршруты рядом с Сводкой я вижу следующее:

enter image description here

Что я могу делать неправильно, блокируя доступ функции Lambda к Интернету?

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Настройка доступа AWS Lambda к Интернету в режиме VPC является сложной задачей, поскольку на стороне AWS нет надлежащей документации AWS, я много раз читал эту статью https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/, но не смотрел видео YouTube.После стольких исследований и разработок я могу подвести итог, так как необходимы следующие шаги для настройки AWS Lambda в режиме VPC

- Route Tables two router
    - One for EC2 - EC2_ROUTER
    - Another for AWS Lambda - AWS_Lambda_ROUTER
- Create an Internet Gateway
    - Add 0.0.0.0/0 rule in EC2_ROUTER for target igw-xxxxx
    - This will create public subnet and give INTERNET access for EC2

- Create a NATGateway with public subnet which has igw-xxxxx as target
- Create a private subnet which and attach to AWS_Lambda_ROUTER, with target 0.0.0.0/0 as nat-xxxxxxx
- Select VPC for AWS Lambda
- Select a/all private subnet which is private having NAT Gateway for all traffic 0.0.0.0/0

all done, go ahead and enjoy

Примечание

  • NATGateway требуется, когда доступ к общедоступному API, отличному от AWS
  • , есть конечные точки AWS для внутренних сервисов AWS, и можно подключить конечные точки AWS в AWS_Lambda_ROUTER, создав

Доступ в Интернет в AWS Lambda -> Частная подсеть с NATGateway -> NATGateway находится в общедоступной подсети с Интернет-шлюзом, который имеет доступ к AWS Lambda.

PS

Понятия не имею, почему AWS Lambda не может иметь доступ в Интернет через InternetGateway, зачем ему нужен NATGateway

0 голосов
/ 17 марта 2019

Эй, ребята, я разработал пошаговое руководство с явными снимками экрана:

Часть I

  1. Создание лямбда-функции в AWS
  2. Создайте API-шлюз для перенаправления всех запросов в вашу лямбда-функцию AWS

https://medium.com/@shontauro/how-can-i-turn-my-restful-api-into-a-serverless-application-and-deploy-it-to-aws-lambda-step-by-ec7ce38e18be

Часть II

  1. Настройка VPC для вашей лямбда-функции
  2. Предоставить доступ к лямбда-функции через Интернет безопасным способом
  3. Развертывание API-интерфейса Node.js Restful в функции Lambda

https://medium.com/@shontauro/how-can-i-turn-my-restful-api-into-a-serverless-application-and-deploy-it-to-aws-lambda-step-by-8ff6cc97780f

0 голосов
/ 10 мая 2018

Чтобы Lambda имел доступ к Интернету через VPC, он должен быть в Private Subnet с NAT Gateway.

Согласно вашим скриншотам, к таблице маршрутов, прикрепленной к подсети, прикреплено igw-xxxxxxx, что делает вашу текущую подсеть public subnet.

Итак, чтобы все заработало, вы можете сделать следующее:

  • Прикрепите NAT Gateway вместо igw-xxxxxx в таблице маршрутов вашего текущего subnet

OR

  • Найдите ENI, подключенный к вашей лямбде, и прикрепите Elastic IP, если вы хотите иметь доступ в Интернет.

OR

В соответствии с @John Rotenstein, если вашей Lambda не нужны ресурсы VPC, вы можете переместить Lambda из VPC

...