Подключите функцию AWS Lambda, запускаемую шлюзом API, к базе данных MySQL Aurora Serverless
У меня есть функция AWS Lambda, которая успешно выполняется через HTTP-запрос к API-шлюзу. Он возвращает ответ JSON, который я вижу в своем локальном веб-браузере.
Теперь я хочу собрать данные из базы данных MySQL Aurora Serverless, которую я настроил. Я могу получить доступ к этой базе данных из среды Cloud 9. Я могу импортировать свою функцию Lambda в Cloud 9 и выбрать "запустить локально", и она успешно подключится к базе данных и выполнит SQL-запросы.
Однако, когда я запускаю функцию Lambda из шлюза API, происходит сбой pymysql.connect, в результате чего выдается сообщение OperationalError с сообщением "Не удается подключиться к серверу MySQL" testdb.cluster-xxxxx.us-east-1.rds.amazonaws. ком".
Я ознакомился с руководством: настройка лямбда-функции для доступа к Amazon RDS в Amazon VPC и выполнил следующие действия:
- В консоли IAM создайте роль с именем lambda-vpc-role с разрешениями AWSLambdaVPCAccessExecutionRole.
- В консоли лямбда-функции для функции установите роль выполнения / существующую роль в значение lambda-vpc-role
Я прочитал " Использование Amazon Aurora Serverless", в котором говорится, что "Вы можете получить доступ к кластеру Aurora Serverless DB из AWS Lambda", и я рекомендую настроить лямбда-функцию для доступа к ресурсам в Amazon VPC. После этого я выполнил следующие действия:
- В лямбда-консоли для функции в поле Сеть установите VPC для VPC, в котором работает кластер Aurora Serverless.
В этом документе также говорится: "Когда вы добавляете конфигурацию VPC к лямбда-функции, она может получить доступ только к ресурсам в этом VPC. Если лямбда-функции требуется доступ как к ресурсам VPC, так и к общедоступному Интернету, то VPC должен иметь преобразование сетевых адресов (NAT) экземпляр внутри VPC." Поэтому я читаю Как я могу предоставить доступ в Интернет для моей функции VPC Lambda? и выполнил эти шаги:
- В консоли VPC / шлюзах NAT создайте новый шлюз NAT в существующей общедоступной подсети, то есть с таблицей маршрутов с маршрутом по умолчанию, указывающим на igw-*
- В консоли VPC / таблицах маршрутов создайте новую таблицу маршрутов с маршрутом по умолчанию, указывающим на мой новый шлюз NAT, nat-*
- В консоли / подсетях VPC создайте новую частную подсеть, связанную с новой таблицей маршрутов, маршрут по умолчанию которой указывает на шлюз NAT.
- В лямбда-консоли для функции в поле "Сеть" задайте "Подсети", чтобы они содержали только новую частную подсеть.
Теперь я считаю, что моя лямбда-функция работает внутри VPC, и я могу успешно запустить ее с помощью шлюза API и увидеть ее ответ JSON. Однако он все еще не может подключиться к базе данных MySQL.
Какие дальнейшие шаги необходимы, чтобы позволить функции Lambda подключаться к базе данных?
1 ответ
Недостающий шаг:
- В консоли VPC / Группы безопасности выберите группу rds-launch-wizard (группа безопасности, созданная при создании кластера Aurora Serverless), выберите вкладку "Входящие правила" и нажмите "Изменить". Добавьте правило. Для типа выберите MYSQL/Aurora (который выбирает TCP-порт 3306). В качестве источника введите CIDR для частной подсети, созданной на шаге 6 и настроенной для использования лямбда-функции.
Поскольку функция Lambda запускается на компьютере в другой подсети, чем кластер базы данных, хотя она находится в том же VPC, группу безопасности все еще необходимо настроить, чтобы разрешить входящее соединение с базой данных из этого источника.
Я думаю, что вопрос и этот ответ теперь обеспечивают полные шаги для настройки общедоступной лямбда-функции с доступом к кластеру базы данных Aurora Serverless, но, возможно, другие ответы могли бы улучшить эти инструкции. Может быть более краткий способ описания конфигурации или более легко воспроизводимый метод, например, использование инструментов командной строки вместо веб-консолей.