역방향 프록시 뒤에서 Airflow 실행하기

역방향 프록시 뒤에서 Airflow 실행하기 (Running Airflow behind a reverse proxy)

Airflow를 역방향 프록시(예: nginx) 뒤에 배치하고 엔드포인트를 유연하게 설정하는 방법을 설명하는 문서예요. base_url 설정, 프록시 헤더 전달, iframe 렌더링을 위한 CSP 설정, API 서버의 --proxy-headers 플래그, Helm Chart 구성까지 살펴볼게요.

출처: 문서

본문

Airflow는 역방향 프록시 뒤에 설정할 수 있으며, 엔드포인트를 매우 유연하게 지정할 수 있어요.

예를 들어 역방향 프록시를 구성해서 다음과 같은 URL을 얻을 수 있어요:

https://lab.mycompany.com/myorg/airflow/

그렇게 하려면 airflow.cfg에 다음 설정을 지정해야 해요:

base_url = http://my_host/myorg/airflow
  • 역방향 프록시(예: nginx)를 구성해 URL과 http 헤더를 rewrite 없이 Airflow 웹서버로 그대로 전달하게 해요. 예를 들어:
server {
  listen 80;
  server_name lab.mycompany.com;

  location /myorg/airflow/ {
      proxy_pass http://localhost:8080;
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
      proxy_redirect off;
      proxy_http_version 1.1;
  }
}
  • UI의 일부 부분은 iframe 안에서 렌더링돼요(예: Auth managers 보안 링크). frame-ancestors 'none' 같은 iframe 렌더링을 제한하는 CSP를 설정하지 않도록 주의하세요. 역방향 프록시 구성에서 CSP 헤더를 설정할 수 있어요. 예를 들어:
add_header Content-Security-Policy "frame-ancestors 'self';";
  • API 서버는 [api] server_type 옵션으로 선택되는 두 애플리케이션 서버 중 하나에서 실행돼요: 기본값인 Uvicorn 또는 Uvicorn 워커를 사용하는 Gunicorn이에요. 둘 다 아래 설정을 읽어요.

  • --proxy-headers CLI 플래그를 사용해 애플리케이션 서버가 이 헤더를 존중하도록 지시해요: airflow api-server --proxy-headers

  • 프록시 서버가 Airflow와 같은 호스트(또는 같은 docker 컨테이너)에 있지 않다면, FORWARDED_ALLOW_IPS 환경 변수를 설정해서 애플리케이션 서버가 이 헤더를 누구로부터 신뢰할지 알게 해야 해요. 여기에 전달할 수 있는 전체 옵션은 Uvicorn 문서를 참고하세요. (참고: --forwarded-allow-ips CLI 옵션은 Airflow에 존재하지 않아요.)

  • 프록시가 Set-Cookie 헤더에 http-only 상태를 강제하지 않도록 확인하세요. Airflow 프론트엔드는 javascript를 통해 쿠키에 접근해야 하는데, http-only 플래그는 이 기능을 방해해요.

Helm Chart 설정 (Helm Chart Configuration)

Helm chart를 사용해 Airflow를 역방향 프록시(예: nginx ingress) 뒤에 배포할 때는 API 서버가 프록시 헤더를 존중하도록 구성해야 해요.

--proxy-headers 플래그를 포함하도록 API 서버 인자를 구성해요:

apiServer:
  args: ["bash", "-c", "exec airflow api-server --proxy-headers"]

프록시 서버가 Airflow와 같은 호스트에 없다면 FORWARDED_ALLOW_IPS 환경 변수를 설정해요:

apiServer:
  args: ["bash", "-c", "exec airflow api-server --proxy-headers"]
  env:
    - name: FORWARDED_ALLOW_IPS
      value: "*"  # Use "*" for trusted environments, or specify proxy IP ranges for production

추가로, 필요한 헤더를 전달하도록 ingress 어노테이션을 구성해요. nginx ingress의 경우 다음 어노테이션을 추가해요:

ingress:
  apiServer:
    enabled: true
    annotations:
      nginx.ingress.kubernetes.io/proxy-http-version: "1.1"
      nginx.ingress.kubernetes.io/proxy-redirect-off: "true"
      nginx.ingress.kubernetes.io/configuration-snippet: |
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    hosts:
      - name: airflow.example.com
        tls:
          enabled: true
          secretName: airflow-tls

Airflow 구성에서도 base_url을 설정해야 해요:

config:
  api:
    base_url: https://airflow.example.com

더 알아보기 (Learn more)