역방향 프록시 뒤에서 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-headersCLI 플래그를 사용해 애플리케이션 서버가 이 헤더를 존중하도록 지시해요:airflow api-server --proxy-headers -
프록시 서버가 Airflow와 같은 호스트(또는 같은 docker 컨테이너)에 있지 않다면,
FORWARDED_ALLOW_IPS환경 변수를 설정해서 애플리케이션 서버가 이 헤더를 누구로부터 신뢰할지 알게 해야 해요. 여기에 전달할 수 있는 전체 옵션은 Uvicorn 문서를 참고하세요. (참고:--forwarded-allow-ipsCLI 옵션은 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