#python #amazon-web-services #aws-lambda #cron #psycopg2
#python #amazon-веб-сервисы #aws-lambda #cron #psycopg2
Вопрос:
У меня есть лямбда-функция, которая подключается к redshift с помощью библиотеки python psycopg2. Если я использую следующее выражение расписания через EventBridge, everiting выполняется нормально:
cron(0/5 * * * ? *)
Но, если я использую выражение расписания, подобное следующему, оно выдает ошибку:
cron(0 7 ? * MON-FRI *)
Ошибка:
could not connect to server: Connection timed out
Is the server running on host "<HOST>" (...) and accepting
TCP/IP connections on port 5439?
: OperationalError
Traceback (most recent call last):
File "/var/task/redshiftETL/lambda_function.py", line 29, in lambda_handler
raise e
File "/var/task/redshiftETL/lambda_function.py", line 22, in lambda_handler
host=db_host)
File "/var/task/psycopg2/__init__.py", line 127, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not connect to server: Connection timed out
Is the server running on host "<HOST>" (...) and accepting
TCP/IP connections on port 5439?
Одна важная информация заключается в том, что redshift настроен на запуск с 6 утра до 8 вечера, поэтому выражение cron находится в пределах этого периода, а функция lambda имеет правильное подключение к VPC, где расположен кластер redshift.
Следующий код — это фрагмент кода, в котором я подключаюсь к redshift. Как вы можете видеть, ничего особенного:
# redshift connection
db_database = '...'
db_user = '...'
db_password = '...'
db_port = '...'
db_host = '...'
try:
conn = psycopg2.connect(
database=db_database,
user=db_user,
password=db_password,
port=db_port,
host=db_host)
conn.autocommit = True
cur = conn.cursor()
except Exception as e:
<DO STUFF>
raise e
Я схожу с ума, потому что не понимаю, какое отношение выражение cron имеет к соединению psycopg2.
Есть какие-либо подсказки о том, что происходит?
Комментарии:
1. Вероятно, проблема группы безопасности. В начале скрипта попробуйте добавить проверку общедоступных и частных IP-адресов.
2. Выражения cron в лямбда-языке находятся в часовом поясе UTC. Вы уверены, что это соответствует периоду, в течение которого активен ваш кластер Redshift?
3. @MarkB, это может быть, поскольку я запускаю lambda в Северной Вирджинии (UTC -4), и я пытался запустить его 7, 8 и 9 часов, но не 10:00, что соответствует 6 утра UTC — 4… Я попробую запланировать до 10 и посмотрю, что произойдет завтра … tnx.
4. Это сбой только иногда или каждый раз? Возможно, он пытается запуститься в то время, когда Redshift отключен.