Как правильно подключить AWS Lambda к RDS в VPC?
Я пытаюсь построить API GraphQL с Serverless Framework на AWS-Lambda, используя Apollo-Server-Lambda и т. Д. Мне нужно использовать не публично доступный экземпляр PostgreSQL RDS.
Я могу получить и запустить лямбды и отправлять обратно запросы, когда не в VPC. Я могу запустить и запустить базу данных Postgres RDS и подключиться к PgAdmin (в общедоступном режиме).
Проблема в том, что когда я делаю RDS Postgres "не публичной" и пытаюсь собрать все эти кусочки воедино, у меня не получается.
Я перепробовал множество разных подходов.
Это регулярно изображается как волшебство. Это прекрасно написано https://gist.github.com/reggi/dc5f2620b7b4f515e68e46255ac042a7
Я не мог получить доступ к Postgres с моими лямбдами, используя это. Итак, мой первый вопрос.
Нужен ли мне шлюз NAT для входящих (входящих) вызовов API в lambdas в VPC? В настоящее время я понимаю, что, возможно, мне нужен только NAT-шлюз, чтобы мои лямбды могли совершать исходящие вызовы на другие API из aws или таких вещей, как S3. Это правильно?
Следующий. Я создал группу безопасности для своих лямбд и добавил эту группу безопасности во входящий список для группы безопасности, которая была создана для RDS. Насколько я понимаю, именно так лямбды должны получить доступ к RDS. У меня не было такой удачи. Может быть, это связано с общедоступными или непубличными подсетями? Может быть, это связано с моим пониманием необходимости NAT?
По сути, единственное, что мне удалось получить - это время ожидания Lambdas через 20 или 30 секунд, в зависимости от моего лимита, когда они пытаются подключиться к postgres конфиденциально. Логи Cloudwatch больше ничего не показывают.
Наконец, на данный момент, как лучше всего подключить мою машину разработчика к Postgres, если она "не публична"? У меня есть IP-адрес компьютеров для входящего TCP/IP на порт 5432 для postgres в группе безопасности RDS, но это не дает мне доступ, на который я надеялся. Мне действительно нужен VPN, подключенный к VPC? Какой самый простой способ?
Я сделал это руководство с основными изменениями для Postgres https://docs.aws.amazon.com/lambda/latest/dg/vpc-rds.html
Я прочитал и обдумал ответы на этот вопрос и многое другое. Разрешить AWS Lambda доступ к базе данных RDS.
У меня было много успешных развертываний с безсерверной средой со многими вариантами конфигурации serverless.yml, чтобы попробовать эти варианты, иначе я бы показал конкретный вариант, который, как мне показалось, не удался, но в более широком смысле я не могу понять, как именно все эти VPC, группы безопасности, таблицы маршрутизации и т. Д. Должны взаимодействовать.
Любая помощь с благодарностью!
2 ответа
Очевидно, что Lambda должна быть настроена для работы в том же VPC, но я предполагаю, что вы уже получили это.
Вам нужно:
- Создайте группу безопасности (SG) и свяжите ее с функцией Lambda.
- Теперь откройте SG, связанный с экземпляром RDS (а не тот, который вы создали выше).
- Внутри RDS SG перейдите на вкладку "Входящие" и нажмите "Изменить"
- Выберите "PostgreSQL" в столбце "Тип". В столбце "Источник" выберите "Пользовательский" в выпадающем списке и введите Lambda SG ID в тексте ввода (если вы начнете вводить "sg-", он покажет вам все ваши SG).
Это работает?
Убедитесь, что ваша функция Lambda находится в VPC, а группа безопасности разрешает подключения с IP-адресов в подсети VPC. Количество доступных IP-адресов будет влиять на то, сколько лямбда-функций может быть запущено одновременно. Также убедитесь, что роль функции Lambda имеет возможность описывать VPC (политика AWSLambdaVPCAccessExecutionRole должна выполнить эту работу за вас).