Не удается подключиться к redshift через лямбда-процедуру, используя определенное расписание cron

#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 отключен.