컨테이너·워크플로우 자동화/Airflow로 워크플로우 자동화하기

Airflow X Postgres 연동 학습 — Provider 기반 실습 튜토리얼

Data Jun 2025. 10. 14. 22:57

Apache Airflow는 다양한 시스템과의 연동을 위해 Provider 패키지(공급자 모듈) 개념을 사용합니다.
이번 글에서는  Provider의 구성, 동작 원리, 확장 방식을 자세히 살펴봅니다.

 

Airflow에서 Postgres를 연결할 때,
가장 중요한 포인트는 Provider 설치 → Connection 등록 → Operator 실행 흐름입니다.
이 글에서는 직접 Docker Compose로 Postgres를 띄우고,
Airflow에서 PostgresOperator로 SQL을 실행하는 과정을 정리했습니다.

 

Airflow Provider란?

Airflow Provider는 Airflow와 외부 서비스 간의 연결을 담당하는 플러그인 세트입니다.
각 Provider는 특정 기술 스택(PostgreSQL, AWS, GCP, Slack 등)과 상호작용하기 위한
Hook, Operator, Sensor, Connection 정의를 포함합니다.

 

쉽게 말해, Airflow의 Provider는 “Airflow가 세상과 대화하는 언어 팩”입니다.

 

예시:

  • apache-airflow-providers-postgres
  • apache-airflow-providers-google
  • apache-airflow-providers-amazon

이러한 Provider는 Airflow 설치 시 pip install apache-airflow-providers-xxx 형태로 추가할 수 있습니다.

 

Postgres 컨테이너 실행하기

먼저 Postgres를 Docker로 띄워 Airflow가 접근할 수 있는 환경을 만듭니다.

version: "3.9"
services:
  db:
    image: postgres:13.6
    restart: always
    environment:
      POSTGRES_DATABASE: postgres
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password1234
    ports:
      - "5432:5432"

이후 터미널에서 실행합니다.

$ docker compose up

이제 Postgres 서버가 5432 포트에서 대기 중입니다.

 

✅ 주의: Airflow와 Postgres를 서로 다른 docker-compose 파일에서 띄웠다면,
기본적으로 네트워크가 분리되어 있기 때문에
127.0.0.1이나 db로는 접근할 수 없습니다.

이 경우에는 아래 두 가지 중 하나로 설정해야 합니다:


1️⃣ 두 compose 파일이 같은 external network를 공유하도록 설정하고 Host=db 사용
2️⃣ 또는 docker inspect로 Postgres 컨테이너의 IP 주소를 확인해 Host=172.xx.x.x 형태로 입력

 

Airflow Provider 설치

Airflow는 기본적으로 데이터베이스에 직접 접근하지 않습니다.
이를 가능하게 해주는 게 바로 Airflow Provider입니다.

 

Postgres를 사용하기 위해 다음 명령을 실행합니다.

pip install apache-airflow-providers-postgres

이 패키지가 설치되면 PostgresHook, PostgresOperator, PostgresSensor 등이 자동 등록됩니다.

 

Airflow Connection 설정

이제 Airflow 웹 UI에서 Connection을 등록합니다.
Admin → Connections → + 버튼을 클릭하세요.

 필드
Connection Id my_postgres_connection 
Connection Type postgres
Host db
Schema postgres
Login postgres
Password password1234
port 5432:5432

Host를 0.0.0.0이나 127.0.0.1로 입력하면 연결이 거절됩니다.
Airflow와 Postgres는 Docker 네트워크에서 별도 컨테이너로 동작하므로
docker inspect로 Postgres 컨테이너의 IP 주소를 확인해 Host=172.xx.x.x 형태로 입력

 

DAG 작성 — PostgresOperator

이제 실제 DAG 코드에서 PostgresOperator를 이용해 SQL을 실행해봅시다.

from airflow import DAG
from airflow.providers.postgres.operators.postgres import PostgresOperator
from datetime import datetime

default_args = {"start_date": datetime(2025, 10, 14)}

with DAG(
    'postgres_loader',
    description='PostgreSQL Loader Example',
    default_args=default_args,
    schedule_interval='0 0 * * *',
    catchup=False
) as dag:

    sql_query = """
        INSERT INTO sample_table (key, value)
        VALUES ('hello', 'world');
    """

    postgres_task = PostgresOperator(
        task_id='execute_sql_query',
        postgres_conn_id='my_postgres_connection',
        sql=sql_query,
        dag=dag
    )

이 DAG는 PostgresOperator를 통해
앞서 등록한 Connection(my_postgres_connection)을 참조하여
Postgres DB에 SQL을 실행합니다.

 

실행 결과 & 트러블슈팅

이제 DAG를 트리거하면, Airflow가 다음 순서로 동작합니다.

  1. PostgresOperator → 내부적으로 PostgresHook 호출
  2. Hook이 my_postgres_connection 정보를 불러옴
  3. psycopg2를 이용해 DB 연결
  4. SQL 실행 (INSERT INTO sample_table ...)

 

전체 흐름 정리

단계 구성 요소 설명
1 docker-compose-yaml Postgres 컨테이너 실행
2 Provider 설치 apache-airflow-providers-potgres 패키지 설치
3 Connection 등록 Airflow UI에서 DB 연결 정보 설정
4 Operator 실행 DAG 내 PostgresOperator로 SQL로 실

 

 

정리하면

 

이 과정을 통해 Airflow가 단순 스케줄러가 아니라
데이터 파이프라인 오케스트레이터로서
DB 작업을 자동화하는 방법을 직접 확인했습니다.