관리 메뉴

A seeker after truth

13주차 Airflow 고급 1,2일차 본문

Data/데엔 데브코스 TIL

13주차 Airflow 고급 1,2일차

dr.meteor 2024. 1. 2. 17:22

7: 이 도커 컴포즈 파일 해석을 좀 듣고 싶어서 찾아 봤음.

_PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:- yfinance pandas numpy oauth2client gspread} 이거 해석: _PIP_ADDITIONAL_REQUIREMENTS란 환경 변수가 존재하면 그 값 읽어다 _PIP_ADDITIONAL_REQUIREMENTS 변수값(: $~ 이하의 _PIP_ADDITIONAL_REQUIREMENTS 말고 맨 왼쪽에 표기된 것이 여기서 지칭하는 '변수'에 해당)으로 세팅하고, 만약 _PIP_ADDITIONAL_REQUIREMENTS라는 이름의 환경변수가 호스트 OS에 세팅 안돼있으면  5개의 모듈을 에어플로 컨테이너가 실행될 떄 환경 변수로 쓰라는 말. 다시 말해 if문 같은 거임.

 

이번 강의에선 dag 처리 위한 임시 파일들 만드는 부분 있을 건데, 이를 위치시키는 별도 폴더 만들 것. 컨테이너 상에선 /opt/airflow/data가 된단 말이고, 이렇게 배우는 중엔 임시 파일들이 어떻게 생겼는지 체크해 보는게 도움이 많이 되기 떄문에 도커 볼륨으로도 만들어 볼건데  그게 volumes 이하에 적힌 값. 도커 에어플로 실행되는 폴더 밑의 이 경로에다가 두겠다는 말이다.

 

모든 것을 자동화한단 측면에선 환경 변수화하는게 더 유리한 측면 있다.

 

 

9: 빨간 박스 2개 쳐져 있는 명령어는 뭐냐면, DATA_DIR를 설정했음에도 불구하고 웹 UI에서 이 값이 보이지 않을 거다. 근데 이 빨간박스 2개 있는 줄의 명령어를 입력하면 보이게 됨. 빨간 박스 첫번째는 모듈인데, 알다시피 스케줄러 말고도 서버 등 다양한 모듈 많잖아 이 도커 컴포즈 안에? 그래서 그 모듈 중 뭐든 올 수 있다는 말임. get 뒤에는 변수명 뭐든 올 수 ㅇ.

그럼 이런게 앞으로 계속 생길텐데 이걸 어찌관리하면 좋나? 젤 좋은 방법은 앞에서 말한 것처럼 도커 컴포즈 airflow-common 섹션 밑에 환경변수로 유지해주는게 모든 게 자동화 되고, 실행한 뒤에도 웹ui에서 별도 세팅하지 않아도 되어 더 선호하는 방식이다.

 

 

10: 에어플로에서 관리 대상 첫번째, 에어플로 버전. 이에 따라 어떤 내용들로 에어플로 환경 설정 할지가 결정되기 때문. 두번째는 에어플로 위에서 돌아가는 dag들. 보통 깃헙 레포로 존재. 세번째가 에어플로랑 관계된 환경설정 변수들.대ㅑ표적인게 Variables, Connections. 이는 도커컴포즈에서 관리하는 게 제일 좋. 그치만 이를 어디 저장하느냐 따라 관리 포인트 다르게 되는데, 적어도 첨엔 깃헙레포에서 야믈파일을 같이 관리하는 게 젤 좋고, 데브옵스 팀이 제대로 만들어진 상황이라면 같이 얘기해서 이를어케 관리, 사용할지 논의해보는게 좋을 것. 그들은 다양한 환경 설정을 다루는 일을 하기 때문. 소스코드는 데엔 팀, 설정과 서비스운영은 데봅스 팀. 데봅스 팀 없으면 그냥 다 깃헙 레포에 넣고 관리하면 된다. 그치만 이보다 더 안전하고 좋은 방법은 'secrets 백엔드'라고, 링크 걸어둔 거.

 

 

11~12: 도커 이미지로 에어플로를 어느 정도 커스텀 할 것인지 생각. 일반적으로 dags를 도커 이미지 안에 넣어 에어플로로 만들고, 그 이미지를 도커컴포즈 안에서 사용하는 게 좋다. 프로덕션 세팅의 도커이미지라면 그렇다. 그러나 그게 아니라면 매번 도커 이미지 새로 만들면서 거기에 내가 만든 소스코드 복사해 넣는게 번거로우므로 호스트 볼륨 만들어 dags 코드가 아직 안들어가고, 레지스트리에서 구할 수 있는 에어플로 이미지를 베이스로 쓰고, dags는 로컬에서 내가개발 중인 걸 호스트 볼륨 형태로 마운트 해 사용하는 게 일반적이다.

 

정리하자면 환경설정은 도커컴포즈에서 관리하거나 도커파일(이미지)에 넣을 수 있고.

dags 소스코드는 프로덕션 환경이면 그냥 이미지를 직접새로 만들면서 dags 폴더 내용을 복사해버리는 게 젤 깔끔. 그러나 개발 및 테스트 시 번거로운 방법이므로 도커에 호스트 볼륨 형태로 쉽게 바꿔보고 테스트 해보는 걸 반복. 그렇게 하기 편하게 만드는게 더 좋은 방법일 수있다.

 

 

13: 그냥봐선 dag인지 아닌지 모르니까 한번씩 실행해보고 dag인걸 판별하는 패턴을 갖다보니 이게 종종 사고로 이어진다. 대그는 실행 안될지 모르지만, 대그 메인 엔트리포인트로 테스트 코드 남겨둔 게 있으면 그건 실행됨. 5분 마다 론칭하지도 않은 테스트 코드가 실행됨. 이걸 막고 싶을 때 사용하는 게 .airflowignore 파일. 그 예로 파일 안에 project_a, tenant_[\d] 2줄을 적었으면 정규식으로 이와 매칭되는 파일들은 다 인식 안하는 거. 이로써 아주 우연히 실행됨으로써 생길 수 있는 사고 예방

 

 

16: ETL은 데이터 시스템 바깥에 있는 데이터를 안쪽으로 갖고 오는 거고, 보통 데엔이 하는 것. ELT는 da, ds가 많이 한다.

시타스는 원본 테이블이 삭제 돼야만 가능한데, 시타스에 버그가 있다? 그럼 이를 삭제한 상태서, 이게 실패하면 안되니까 트잭으로 묶어서 하는 것도 방법인데 여기서 쓰는 방법은 임시 ㅌ[ㅔ이블에 시타스 적용 후 이에 맞는 레코드 하나라도 없는 경우 ,임시 테이블을 바꿔치기 함. 정확하겐 원본 테이블 삭제하고 

 

 

18: 17페이지처럼 하면 파썬오퍼레이터 반복 사요하니까 그거 뗴내서 이거 해보자는.

 

 

21: "::float*100/COUNT(1), 2" 에서 COUNT(1) 부분은 분모라고 함. 총 설문 횟수를 의미

 

 

51: 에어플로 api 활성화 방법부터 재리뷰.

첫번쨰 항목 나온 것처럼 basic_auth 세팅하는 게 젤 쉬운 방법. 글고 셋업 마친 후 기본으로 설정되는 에어플로 기본 아디비번은 너무 위험하잖아 (쉬워서)? 그래서 비번 바꾸거나, api 전용으로 사용할 수 있는 유저 아디 따로 만들어 그걸 사용하는 게 더 좋은 방법일 수 있다. 에어플로는 어드민인데, 뭐든 볼 수 있기 떔에 이보다 낮은 유저 레벨 정도로 만드는 게 좋을 거다. 또한 이런 에어플로 ui, api 등은 VPN 뒤에 숨겨놓고 이를 통과하지 못하면 액세스 못하게 하는 게 젤 좋다. 따라서 api 노출 시키더라도 같은 넽웤 내 내부 서비스들만 접근 가능하게 하자는 것.

두번쨰 항목: 도커 컴포즈에서 이 auth_backend값 바꾸는 게 얼마나 힘든가. AIRFLOW__API__AUTH_BACKENDS 이런 식으로 언더 스코어 2개 있는 변수 같은 패턴 따르는 변수의 경우, airflow. cfg의 AIRFLOW__SECTION__KEY를 오버라이드하는 것. 언더스코어 2개마다 잘ㄹ라 읽으면 됨. AIRFLOW__API__AUTH_BACKENDS는 다수의 값을 세팅하는 거고, 그 다수의 값들을 콤마를 사이에 두고 적어주면 된다. 단수형으로 세팅하는 경우는 첫번째 항목에 나온 것처럼 세팅할 수 있음. 

세번째 항목 첫번째 줄 명령어 실행 시 두번쨰 줄의 2개 값이 출력됨

이 auth 값은 api 호출 가능한 사람인지를 검증하는 데 쓰는 값.

 

 

53: api 활성화 여부와 상관 없이 쓸 수 있는게 health 엔드포인트. 첫번째 항목과 같이 명령 보냈을 떄 응답 없으면 서버 죽은.

2번째에 나온 제이쓴에서 latest_scheduler_heartbeat는, 만약 5~10분 간격 체크라면 이 타임스탬프가 3~4시간 전에 찍힌 값이다 하면 문제 있는 것임.

 

 

 

get할 땐 헤더도, -d 옵션도 필요없어 저렇게만 보냄. 위와 같이 명령 보내면 모든 대그들 나타나는데, 한 대그가 저렇게 만ㅇ흔 정보 갖고 있따.

주기적으로 실행되는 대ㅡㄱ 아니고 외부 조건에 의해 트리거되는 대그들 같은 경우 스케줄을 at once (저기 value: @once로 나와있는 부분)로 설정하는게 일반적.

활성화된 대그만 출력할 수 있게 하면 좋은데 아직 그런 기능 없어서, 위의 명령어 통해 모든 대그 출력한 뒤 "is_paused" : false인 것들만 수집하게 코드 짜줘야 함. 이게 숙제임.

 

엔드포인트가 잘못 오픈되면 중요한 크리덴셜 등이 노출되므로 위험.

또 어드민 액세스 했는데도 위와 같은 에러 뜸. config란 api 엔드포인트는 기본으론 막혀있어서, 이걸 풀어줄 수 있는 키가 어디 있음. 이를 찾아 오버라이드 해 풀어줘야 함.

 

이 명령은 스케줄러가 아닌 웹 서버 안에서 실행해 줘야 한다!

 

아래는 get_dags.py