У меня есть набор лямбда-функций, которые обрабатывают сообщения в стеке 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
Я дважды проверил строку подключения и учетные записи пользователей, они верны / работают локально.
Если бы кто-то мог указать мне правильное направление, я был бы благодарен!