Apache Airflow 2.x에서 3.x로 변경되는 시점, 기여하기 위한 Breeze 세팅 법

Apache Airflow에 기여하고자 할 때 익히면 매우 편한 것이 Breeze입니다.

하지만 Airflow 2.x에서 3.0으로 올라가며 많은 구조적 변화가 있어, 기존에 사용하던 방식으로는 기여 환경을 쉽게 꾸리기 어려웠습니다.

특히 인증 방식이 FastAPI 기반으로 전환되거나, Breeze 명령어 체계가 달라지는 등 문서로는 파악하기 힘든 변화들이 계속 일어났었는데요.

저희 운영진 내부로 진행하고 있는 Airflow 기여 스터디에서도 환경 설정 단계에서 많은 시행착오를 겪고 있습니다. :face_with_crossed_out_eyes:

이 글에서는 Airflow 3.x 기준 Breeze 설치부터 테스트, 그리고 PR을 위한 사전 작업까지의 전반적인 흐름을 정리해보았습니다.

Breeze 설치

uv tool install -e dev\breeze

Breeze 업그레이드

breeze setup self-upgrade

Breeze 실행

breeze --python 3.10 --backend postgres start-airflow --dev-mode
  • Python은 3.10
  • backend는 postgres
  • --dev-mode 옵션을 통해 코드 수정을 핫 로드 가능하도록 합니다.

※ 위 옵션들은 필요에 따라 수정 가능합니다.

http://localhost:28080 으로 Airflow UI에 들어가서 admin, admin으로 로그인 해줍니다.
그리고 API 부분을 기여한다면 http://localhost:28080/docs로 Open API에 접근할 수 있습니다.

현재 Airflow의 OpenAPI는 기본적으로 인증이 필요한 상태이며, 대부분 API가 잠겨 있습니다.

인증 없이 요청할 경우 다음과 같은 401 에러가 발생합니다:

{
  "detail": "Not authenticated"
}

기존에 FAB 시스템에서는 User를 만들어주고 열어주는 것이 가능했으나, Airflow 3.x부터 인증 방식이 FastAPI 기반으로 변경되었기 때문입니다.

FastAPI 시스템으로 변경되고서는 User를 만들어주는 명령어가 Breeze 내에 없습니다.

AuthManager 확인

Airflow 2.x까지는 Flask AppBuilder(FAB)를 사용했지만, 3.x부터는 FastAPI 기반으로 변경되었습니다. 따라서 현재 AuthManager 설정을 확인하고 필요 시 수정해야 합니다.

airflow config get-value core auth_manager
root@ca1bedaaf611:/opt/airflow# airflow config get-value core auth_manager
airflow.api_fastapi.auth.managers.simple.simple_auth_manager.SimpleAuthManager

그리고 API 부분을 개발할 때, Auth를 패스하고 싶다면 아래의 부분이 기본 값으로는 False로 되어있을 것인데, 인증 우회를 하기 위해 True로 변경해주어야합니다.(권장하는 방식은 아니지만, 개발 중에 인증 방식이 변경되는 부분이 있어서 인증 우회를 해두고 개발하는 편했습니다.)

# airflow-core/src/airflow/config_templates/config.yml
    simple_auth_manager_all_admins:
      description: |
        Whether to disable authentication and allow everyone as admin in the environment.
      version_added: 3.0.0
      type: string
      example: ~
      default: "True"
airflow config get-value core simple_auth_manager_all_admins
root@721cd2acc183:/opt/airflow# airflow config get-value core simple_auth_manager_all_admins
False

이 값들은 airflow-core/src/airflow/config_templates/config.yml에서 변경이 가능합니다. (Breeze환경은 이 파일을 이용해 세팅됩니다.)
※ 이 파일의 변경사항은 Git Commit 대상에서 제외합니다.

값을 수정 후 stop_airflow 명령어로 Breeze를 중지해줍니다. 그리고 다시 Breeze를 실행해주는데
만약 수정 후에도 그대로 남아있다면 Breeze 캐시가 남아있는 것일 수 있습니다.
아래의 명령어로 캐시를 제거하고 작업을 진행하시면 됩니다.

breeze doctor

수정 후에 Breeze 환경에서 아래의 값이 True로 변경되었는지 확인합니다.

airflow config get-value core simple_auth_manager_all_admins
root@721cd2acc183:/opt/airflow# airflow config get-value core simple_auth_manager_all_admins
True

이제 Open API로 테스트하면 Auth를 패스하고 정상적으로 잘되는 것을 확인할 수 있습니다.

코드 기여

이제 자신이 작업하고 싶은 부분에서 코드 기여를 진행해줍니다.
저는 API부분을 수정해줬습니다.

기여 후 테스트 코드 작성

airflow-core/tests폴더 안에 테스트 코드가 있습니다. 이곳에서 unit 테스트 코드를 작성합니다.

저는 DAG의 DetailResponse API를 수정했기 때문에 airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dags.pyTestDagDetails 클래스를 수정해주었습니다.

테스트하기

Breeze 안에서 pytest가 가능합니다.

pytest airflow-core/tests/

내가 수정한 파일 정적 체크

breeze static-checks --only-my-changes

Breeze 테스트 관련 내용은 아래의 링크에서 확인가능합니다.

PR을 하기 전 Pre-commit

PR 전에 pre-commit을 반드시 실행해 체크를 통과시켜야 합니다:

pre-commit run --all-files

pre-commit에서 통과되지 못한 항목들이 좀 있을 것인데, 이는 기존 시스템과 충돌 문제 혹은 dependaBot으로 관리되는 것이나 빌드 결과물이 껴있는 경우가 있습니다. 따라서 자신이 수정한 부분에서 잘못된 것이 있는지 로그 확인 및 커밋 전 수정이 필요합니다.

마치며

Airflow 3.x 로의 변경에서 Breeze 세팅 팁이 있다면, 댓글로 알려주세요 :wink:

1개의 좋아요

breeze에서 testing 명령어 사용 방법이 변경된 것 같습니다. breeze testing core-test와 같이 breeze testing의 서브영역까지 지정을 해줘야 하는 것 같은데 혹시 비슷한 케이스 있으셨는지 궁금합니다.

breeze --backend postgres --postgres-version 15 --python 3.9 --db-reset testing core-tests --test-type All

breeze --python 3.10 --backend postgres start-airflow --dev-mode 이 명령어를 사용하면
뭔가 breeze down을 하고 다시 시작했을 때에도 breeze-postgres-1 이 정상으로 켜지지 않는것 같습니다.
dependency failed to start: container breeze-postgres-1 is unhealthy

Error 1 returned

이런 상황이라면 breeze doctor --answer y 명령으로 breeze 환경을 정리하고 해보실 수 있으실까요?

cache 랑 이미지를 한번 다 지우고 다시 build 하겠네요. 분명 어제 breeze start-airflow로 해서 어느정도 되었는데 다음날이 되니 안되니 참 신기하네요~ 다시 해보고 결과 알려드릴게요.

1개의 좋아요

다 지우고 다시 image build를 했는데 잘 되네요, 차이는 어제는 python 3.9와 Postgres 15 였는데, 이번에 python 3.10을 적용하면서 postgres 13으로 바뀌었다는 점이에요. 여기서 뭔가 꼬였지 않았나 생각이 드네요! 감사합니다.

네 testing breeze환경이랑 start-airflow 환경이랑 충돌한 것 같네요 :wink:
해결하셨다니 다행입니다 ㅎㅎ

인증을 False에서 True로 바꿔주는 부분은 breeze 환경 안에서만 바꿔주면 되나요? breeze를 나와서 바꿔주는 것은 아니겠지요? breeze 환경에서 vim 으로 바꿔주고 저장후 stop_airflow를 하고 나왔는데 다시 breeze들어가려고 하니 에러가 발생했습니다.

airflow-core/src/airflow/config_templates/config.yml

FileNotFoundError: [Errno 2] No such file or directory: ‘/Users/yong/contribute/airflow/airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/node_modules/.pnpm/happy-dom@18.0.1/node_modules/happy-dom_tmp_7092/src/nodes/html-script-element’

dev-mode 라서 로컬에도 그대로 반영이 되어있긴 하네요.. 갑자기 위에 auth 관련 파일이 에러난건 일단 doctor 커맨드로 다시 해봐야겠습니다~

흠 이 문제는 정확하게 잘 모르겠네요..ㅠㅠ

1개의 좋아요

docker환경에서 변경해주지 않아도 로컬 저 파일 위치에서 변경하고 breeze 환경 세팅하시면 적용되여

1개의 좋아요

일단, 다시 doctor 로 지우고 다시 하니 잘 됬습니다.

2개의 좋아요