Что такое Connections в Apache Airflow и для чего они используются

Ответ

В Apache Airflow Connections — это централизованный и безопасный способ хранения учетных данных (логинов, паролей, токенов, хостов) для подключения к внешним системам, таким как базы данных, облачные сервисы или API.

Они хранятся в зашифрованном виде в метабазе Airflow и управляются через UI, CLI или переменные окружения, что позволяет избежать жесткого кодирования секретов в коде DAG.

Ключевые преимущества

  • Безопасность: Секреты не хранятся в коде и не попадают в системы контроля версий.
  • Централизованное управление: Все подключения настраиваются в одном месте, что упрощает их обновление и аудит.
  • Переиспользование: Одно и то же подключение может использоваться в множестве DAG.
  • Абстракция: Разработчикам DAG не нужно знать конкретные учетные данные; они просто ссылаются на соединение по его Conn Id.

Пример использования в DAG

Сначала подключение создается в UI Airflow (Admin -> Connections) с Conn Id = my_postgres_db.

Затем в коде DAG оно используется для выполнения запроса с помощью хука:

from airflow.providers.postgres.hooks.postgres import PostgresHook
from airflow.decorators import task

@task
def get_data_from_postgres():
    """Извлекает данные из PostgreSQL, используя предопределенное подключение."""
    # Хук автоматически подтягивает креды из Connection с ID 'my_postgres_db'
    postgres_hook = PostgresHook(postgres_conn_id="my_postgres_db")
    connection = postgres_hook.get_conn()
    cursor = connection.cursor()
    cursor.execute("SELECT * FROM users LIMIT 10;")
    records = cursor.fetchall()
    for record in records:
        print(record)

Ответ 18+ 🔞

А, слушай, про эти ваши коннекшены в Airflow! Это ж, блядь, просто гениальная штука, чтобы не выносить себе мозг и не серить секретами по всему коду. Представь: у тебя куча DAG'ов, и каждому надо в базу данных ткнуться. И что, ты в каждый скрипт пароль впишешь? Да ты ж потом, когда его менять надо будет, обосрёшься, блядь, с этими поисками! А если в гит зальёшь — вообще писец, тебя хакеры разденут как липку.

Вот для этого и придумали Connections. Это такая, понимаешь, центральная сберкасса для твоих логинов, паролей, токенов и прочей конфиденциальной хуйни. Всё это дело шифруется и прячется в метабазу Airflow. Управлять можно через веб-морду, через командную строку или даже переменными окружения. Главное — в коде DAG'а этой ерунды уже нет!

Ну и в чём, блядь, профит?

  • Не спалишься: Секреты не болтаются в коде, который ты потом в гит суёшь. Никаких password = 'qwerty123' на всеобщее обозрение, ёпта!
  • Всё в одном месте: Не надо бегать по ста DAG'ам, когда сменился пароль от продовой базы. Зашёл в админку, ткнул пару раз — и все твои задачи уже используют новые данные. Красота, блядь!
  • Одна настройка — много пользы: Создал подключение к своей PostgreSQL раз — и двадцать разных DAG'ов могут на него ссылаться. Не нужно двадцать раз одно и то же вбивать.
  • Абстракция, мать её: Разработчик пишет DAG и думает: "Мне надо в базу my_postgres_db". А какая там база, на каком хосте и под каким юзером — его вообще не ебёт! Это уже забота админа или девопса. Идеальное разделение труда, в рот меня чих-пых!

Как этим пользоваться, на живом примере

Допустим, ты в интерфейсе Airflow (Admin -> Connections) создал подключение. Дал ему Conn Id = my_postgres_db и забил туда хост, порт, логин и пароль.

А теперь в коде DAG'а ты просто на это подключение ссылаешься, и всё работает, блядь!

from airflow.providers.postgres.hooks.postgres import PostgresHook
from airflow.decorators import task

@task
def get_data_from_postgres():
    """Вытаскивает данные из PostgreSQL, используя предопределённое подключение."""
    # Вот тут магия! Хук сам подтянет все настройки из Connection с ID 'my_postgres_db'
    postgres_hook = PostgresHook(postgres_conn_id="my_postgres_db")
    connection = postgres_hook.get_conn()
    cursor = connection.cursor()
    cursor.execute("SELECT * FROM users LIMIT 10;")
    records = cursor.fetchall()
    for record in records:
        print(record)

Видишь? Никаких паролей в коде! Только этот самый conn_id. Всё чисто, безопасно и удобно. Вообще, ебать, как же это упрощает жизнь, когда проектов много. Раньше бы в каждом скрипте конфиги правил, а теперь — раз и готово. Умные люди придумали, чёрт возьми!