Лямбда потеряла связь с RDS в 01:00 2019-01-12 (ЕС / Лондон) - PullRequest
0 голосов
/ 12 января 2019

У меня есть набор лямбда-функций, которые обрабатывают сообщения в стеке SQS. Они принимают наборы данных, обрабатывают их и сохраняют результаты в базе данных RDS MySQL, к которой он подключается через VPC. Функции Lambda и база данных RDS находятся в одной зоне доступности.

Это работало последние пару месяцев без каких-либо проблем, но сегодня рано утром (2019-01-12) в 01:00 я начал видеть лямбда-таймауты и сообщения, перемещаемые в очередь недоставленных сообщений.

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

Сервер RDS является общедоступным, но заблокирован, чтобы разрешить доступ только через VPC и 2 общедоступных IP-адреса.

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

  • С учетом административных прав на роль лямбда-службы для исключения проблем IAM
  • Неназначенный VPC из лямбда-функций и открыт входящий доступ к RDC с 0.0.0.0/0 для исключения проблем с VPC.
  • Перезапустил хосты RDS, добрый день снова.
  • Используется без сервера для локального вызова лямбда-функций с тестовыми данными (работает). Моя локальная машина подключается к общедоступному IP-адресу RDS, а не через VPC.
  • Изменена среда выполнения с 3,6 до 3,7

Кажется, это не проблема кода, так как он работал безупречно в течение последних нескольких месяцев, и я могу вызывать локально без проблем, и мой экземпляр Elastic Beanstalk, который находится в той же подсети VPC, продолжает подключаться через VPC без вопроса.

Вот код, который я использую для подключения:

connectionString = 'mysql+pymysql://{0}:{1}@{2}/{3}'.format(os.environ['DB_USER'], os.environ['DB_PASSWORD'], os.environ['DB_HOST'], os.environ['DB_SCHEMA'])
        engine = create_engine(connectionString, poolclass=NullPool)
        with engine.connect() as con: <--- breaking here
            meta = MetaData(engine, reflect=True) <-- never gets to here

Я дважды проверил строку подключения и учетные записи пользователей, они верны / работают локально.

Если бы кто-то мог указать мне правильное направление, я был бы благодарен!

Ответы [ 2 ]

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

Итак ...

Я менял группы безопасности, и это никак не влияло на хост RDS, в какой-то момент я удалил весь доступ и все еще мог подключиться, что безумие. В этот момент я начал думать, что сбой в пятницу вечером поставил базовый хост RDS в странное состояние. Я вернул группы безопасности обратно в исходное состояние, остановил и запустил (перезапуск не дал эффекта) на хост RDS, и все снова заработало.

Очень расстраивает, но рад, что наконец-то решен.

0 голосов
/ 12 января 2019

Мое первое предположение состоит в том, что вы достигли лимита подключения в базе данных RDS. Поскольку Lambdas может выполняться одновременно (это может быть легко, если в вашей очереди SQS внезапно появилось много сообщений), и каждое выполнение открывает новое соединение с вашей БД, пул соединений может быть насыщен.

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

Дополнительное примечание - не рекомендуется использовать базу данных с постоянным соединением в архитектуре без сервера именно по этой причине. AFAIK, AWS работает над лучшим решением для использования RDS от Lambda, но оно пока недоступно.

...