Подтвердить что ты не робот

AWS Lambda: невозможно получить доступ к очереди SQS из функции Lambda с доступом VPC

У меня есть функция Lambda, которая должна читать сообщения из очереди SQS с использованием URL-адреса. Затем необходимо вставить эти данные в Cassandra, работающую на сервере внутри VPC.

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

Однако я не могу читать сообщения из очереди SQS. Когда я меняю конфигурацию функции Lambda на No VPC, я могу читать сообщения из очереди SQS. Однако, с настройками VPC, это просто время.

Как я могу это преодолеть? Я проверил, что группа безопасности моей функции Lambda имеет полный исходящий доступ ко всем IP-адресам.

4b9b3361

Ответ 1

Некоторые службы (например, S3) предлагают конечные точки VPC для решения этой конкретной проблемы, но SQS не является одним из них. Я думаю, что единственным реальным решением этой проблемы является запуск NAT внутри вашего VPC, поэтому сетевой трафик от функции Lambda может быть перенаправлен во внешний мир.

Ответ 2

Я столкнулся с такой же проблемой, когда я работал с лямбда-функцией с доступом к эластичной пачке на VPC. Хотя функция была сконфигурирована для запуска в VPC, я не смог поговорить с какой-либо другой службой (в частности, codedeploy для меня).

Как отметил @garnaat, NAT является единственным способом решения этой проблемы для служб без конечных точек VPC.

И, как вы указали, я также столкнулся с той же проблемой, когда я не мог использовать SSH в машине (машинах), как только я заменил запись IGW в таблице маршрутов. Похоже, что отключение IGW голодает VPC либо входящего трафика (в основном), либо исходящего трафика из или в Интернет соответственно. Итак, вот что я сделал, и это сработало для меня:

Создайте новую подсеть в VPC Теперь, когда лямбда работает, убедитесь, что лямбда работает из этой подсети. Вы можете сделать это, используя aws-cli так:


 aws lambda update-function-configuration --function-name your-function-name --vpc-config SubnetIds="subnet-id-of-created-subnet",SecurityGroupIds="sg-1","sg-2"

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

Затем перейдите в Таблицы маршрутов в консоли VPC и создайте новую таблицу маршрутов.

введите описание изображения здесь

Здесь вы добавляете шлюз NAT к цели.

наконец, перейдите на вкладку "Объединения подсети" в новой таблице маршрутов и добавьте вновь созданную подсеть.

Все это должно заставить его работать. Имейте в виду, пожалуйста, рассматривайте это как обходной путь. Я не очень много копал, и у меня есть очень ограниченная идея о том, как все решается внутри, делая это. Это может быть не идеальное решение.

Идеальное решение, похоже, заключается в разработке VPC перед началом работы. Используйте подсети, чтобы изолировать ресурсы/экземпляры, которым нужен доступ в Интернет, и не использовать (частные и общедоступные подсети) и размещать соответствующие шлюзы там, где это необходимо (так что вам может не понадобиться создавать отдельную подсеть для этой цели позже). Благодаря

Ответ 3

Мне не удалось получить ни один из других двух ответов на этот вопрос. Возможно, это связано с одной или несколькими ошибками с моей стороны. Независимо от того, я нашел обходное решение, которое я хотел бы разделить, на случай, если я не одинок с этой проблемой.

Решение: Я создал две функции лямбда. Первая функция Lambda работает внутри моего VPC и выполняет требуемую работу (в случае mandeep_m91, что вставка данных в Cassandra, в моем случае это доступ к экземпляру RDS). Вторая функция лямбда живет вне VPC, поэтому я могу подключить ее к очереди SQS. Затем я получил вторую функцию Lambda, используя информацию, найденную в этом fooobar.com/questions/48851/.... Обратите внимание: связанный вопрос содержит ответы node.js и Python в ответах.

Это позволит удвоить стоимость вызова функции, поскольку каждый вызов приводит к выполнению двух функций. Однако, для моей ситуации, объем настолько низок, что это не будет иметь особого значения.

Ответ 4

В конце 2018 года AWS объявил о поддержке конечных точек SQS, которые обеспечивают

подключение к Amazon SQS без необходимости использования интернет-шлюза, экземпляра преобразования сетевых адресов (NAT) или VPN-подключения.

Существует руководство для отправки сообщения в очередь Amazon SQS из виртуального частного облака Amazon.

См. Также документацию по конечным точкам SQS VPC для получения дополнительной информации.

Важно отметить, что если вы хотите получить доступ к SQS в Lambda VPC, вам нужно сделать еще пару вещей:

  • Обязательно укажите регион SQS в вашем коде. Например, мне пришлось установить свой endpoint_url на " https://sqs.us-west-2.amazonaws.com "
  • Убедитесь, что вы подключили "широко открытую" группу безопасности к интерфейсу SQS VPC, иначе SQS не будет работать.
  • Убедитесь, что ваши подсети в вашем Lambda VPC совпадают с настройками интерфейса SQS VPC.