만약 하나의 Apache Airflow에서 다양한 조직의 사용자가 존재하며, DAG의 종류 또는 개별 접근 제어(Access Control)를 구현해야한다면 어떻게 해야할까?
Airflow는 Resource 및 DAG-level 기반의 권한을 Role을 통해 권한을 정의한 후, 이를 사용자 계정에 할당함으로써 사용자별 접근 제어를 구현할 수 있다.
Resource-base permission (2.0+)
자원 기반 권한은 Airflow 내 다음 객체를 대상으로 지정할 수 있다.
Dag
DagRun
Task
Connection
또한 상기 자원에 대해 CRUD Action을 제어할 수 있다.
can_create
can_read
can_edit
can_delete
DAG-level permission
DAG 단계에서의 권한은 Role 내에서 전체 DAG(DAGs.[action]
) 또는 특정 DAG(DAG:[dag_id].[action]
)을 지정하여 설정할 수 있으며, DAG를 정의할 때 airflow.DAG
객체 내 access_control
속성을 통해 Role별로 Action을 지정할 수 있다.
from airflow import DAG
from airflow.utils.dates import days_ago
DAG(dag_id="permission_example_dag",
start_date=days_ago(1),
access_control={
"Viewer": {"can_edit", "can_read", "can_delete"},
# access_control 속성은 {”role_name”: {”action_1”, “action_2”}, …}와 같은 형식의 dict형으로 입력
},
)
실험에 사용할 Airflow 사용자 계정 및 Role 생성
taylor_role
) 생성 및 Airflow Webserver에 로그인할 수 있도록 Website에 대한 읽기 권한 부여airflow roles create taylor_role
airflow roles add-perms taylor_role -r Website -a can_read
taylor
(user), trey
(admin)airflow users create --username taylor --password taylor --role taylor_role --email taylor@example.com --firstname taylor --lastname kim
airflow users create --username trey --password trey --role Admin --email trey@example.com --firstname trey --lastname yi
실험에 사용할 DAG를 Airflow의 DAG 경로(일반적으로 $AIRFLOW_HOME/dags
)에 생성
from airflow import DAG
from airflow.operators.dummy_operator import DummyOperator
from airflow.utils.dates import days_ago
with DAG(
dag_id='test_role_dag',
tags=['test'],
start_date=days_ago(1),
schedule_interval=None,
default_args={
'owner': 'airflow',
'retries': 0
},
catchup=False,
is_paused_upon_creation=False
) as dag:
task_for_user1 = DummyOperator(task_id='task')
taylor
로 로그인하여 생성한 예시 DAG(test_role_dag
)가 Airflow Webserver에서 보이는지 확인
taylor
계정에는 어떠한 읽기 권한이 없기 때문에 해당 계정에서는 아무런 DAG도 보이지 않는다.
taylor
와 비교하기 위해 Admin
role을 가진 trey
로 로그인
trey
계정은 Apache Airflow에서 기본 제공되는Admin
Role의 권한 내 DAGs(DAG 전체)에 대한can_read
권한을 가지고 있으므로 별도의 설정 없이 모든 DAG를 확인할 수 있음.
taylor
에 특정(또는 모든) DAG(DAG(s)
)에 대한 읽기 권한(can_read
)을 부여
airflow roles add-perms taylor_role -r DAGs -a can_read
# or
airflow roles add-perms taylor_role -r DAG:test_role_dag -a can_read
test_role_dag
DAG 내 access_control
속성에 권한을 지정해보기
(글 순서대로 진행했을 경우)
taylor_role
에DAG:test_role_dag
또는 DAGs에 대한can_read
권한이 있을 경우 제거 필요
from airflow import DAG
from airflow.operators.dummy_operator import DummyOperator
from airflow.utils.dates import days_ago
with DAG(
dag_id='test_role_dag',
tags=['test'],
start_date=days_ago(1),
schedule_interval=None,
default_args={
'owner': 'airflow',
'retries': 0
},
catchup=False,
is_paused_upon_creation=False
) as dag:
task_for_user1 = DummyOperator(task_id='task')
Role에 지정된 권한이 없어도 DAG에서 지정된 권한을 통해
taylor
계정에서 정상적으로 표시됨.
테스트에 사용한 계정 및 Role 정리
airflow users delete --username trey
airflow users delete --username taylor
airflow roles delete taylor_role
access_control
속성에 Role에 대한 권한을 명시하고 관리하는 것이 관리적인 측면에서 효율적일 것이다.