Назад | Перейти на главную страницу

Подключите функцию AWS Lambda, запускаемую API Gateway, к базе данных Aurora Serverless MySQL.

У меня есть функция AWS Lambda, которая успешно запускается через HTTP-запрос к шлюзу API. Он возвращает ответ JSON, который я вижу в своем локальном веб-браузере.

Теперь я хочу, чтобы он собирал данные из базы данных MySQL Aurora Serverless, которую я настроил. Я могу получить доступ к этой базе данных из среды Cloud 9. Я могу импортировать свою лямбда-функцию в Cloud 9 и выбрать «запускать локально», и она успешно подключается к базе данных и выполняет SQL-запросы.

Однако, когда я запускаю функцию Lambda из шлюза API, pymysql.connect завершается с ошибкой, вызывая OperationalError с сообщением «Не удается подключиться к серверу MySQL на 'testdb.cluster-xxxxx.us-east-1.rds.amazonaws. com ".

Я следил Учебное пособие: настройка лямбда-функции для доступа к Amazon RDS в Amazon VPC и выполнил эти шаги:

  1. В консоли IAM создайте роль с именем lambda-vpc-role с разрешениями AWSLambdaVPCAccessExecutionRole.
  2. В консоли Lambda для функции установите для параметра Execution Role / Existing Role значение lambda-vpc-role.

я прочитал Использование Amazon Aurora Serverless в котором говорится, что «Вы можете получить доступ к кластеру БД Aurora без сервера из AWS Lambda», и направляет меня на Настройка лямбда-функции для доступа к ресурсам в Amazon VPC. После этого я выполнил следующие шаги:

  1. В консоли Lambda для функции в поле Сеть установите для VPC значение VPC, в котором работает бессерверный кластер Aurora.

В этом документе также говорится: «Когда вы добавляете конфигурацию VPC в функцию Lambda, она может получить доступ только к ресурсам в этом VPC. Если функции Lambda требуется доступ как к ресурсам VPC, так и к общедоступному Интернету, VPC должен иметь преобразование сетевых адресов ( NAT) внутри VPC ". Поэтому я прочитал Как я могу предоставить доступ в Интернет для моей функции VPC Lambda? и выполнил эти шаги:

  1. В консоли VPC / шлюзах NAT создайте новый шлюз NAT в существующей общедоступной подсети, то есть с таблицей маршрутов с маршрутом по умолчанию, указывающим на igw- *
  2. В консоли VPC / Таблицах маршрутов создайте новую таблицу маршрутов с маршрутом по умолчанию, указывающим на мой новый шлюз NAT, nat- *
  3. В консоли VPC / Подсети создайте новую частную подсеть, связанную с новой таблицей маршрутов, маршрут которой по умолчанию указывает на шлюз NAT.
  4. В лямбда-консоли для функции в поле «Сеть» установите для «Подсети» только новую частную подсеть.

Теперь я считаю, что моя функция Lambda работает в VPC, и я могу успешно запустить ее с помощью шлюза API и увидеть ее ответ JSON. Однако он по-прежнему не может подключиться к базе данных MySQL.

Какие дальнейшие шаги необходимы, чтобы функция Lambda могла подключиться к базе данных?

Недостающий шаг:

  1. В консоли VPC / Группы безопасности выберите группу rds-launch-wizard (группа безопасности, созданная при создании бессерверного кластера Aurora), выберите вкладку «Правила для входящих подключений» и нажмите «Изменить». Добавьте правило. В качестве типа выберите MYSQL / Aurora (который выбирает TCP-порт 3306). В качестве источника введите CIDR для частной подсети, созданной на шаге 6 и для которой настроена функция Lambda.

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

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