Secrets Backend
Secrets Backend
Airflow는 환경 변수나 metastore 데이터베이스 외에도, 대체 secrets backend를 활성화해 connection과 variable을 조회할 수 있어요. 이 문서는 secrets backend의 검색 경로, 설정 방법, 직접 구현하는 방법을 설명해 드려요.
출처: 문서
본문
버전 1.10.10에 추가됨.
환경 변수나 metastore 데이터베이스에서 connection과 variable을 가져오는 것 외에도, 대체 secrets backend를 활성화해 Apache Airflow Community 제공 백엔드를 통해 Airflow connection 또는 Airflow variable을 조회할 수 있어요. 자세한 내용은 Secret backends를 참고하세요.
Note
Airflow UI는 Metadata DB에 저장된 connection과 variable만 보여주며 다른 방식으로 저장된 것은 보여주지 않아요. 대체 secrets backend를 사용한다면 variable과 connection의 값을 보기 위해 backend 내부를 확인해야 해요.
민감한 데이터를 담은 Airflow 구성도 Secrets Backend에서 가져올 수 있어요. 자세한 내용은 설정 옵션 설정하기를 참고하세요.
검색 경로 (Search path)
connection/variable을 조회할 때 기본적으로 Airflow는 먼저 환경 변수, 두 번째로 metastore 데이터베이스를 검색해요.
대체 secrets backend를 활성화하면 그것이 먼저 검색되고, 그 다음 환경 변수, 그 다음 metastore 순이에요. 이 검색 순서는 구성할 수 없어요. 다만 일부 대체 secrets backend에서는 secret backend에서 검색할 connection/variable/config을 필터링하는 옵션이 있을 수 있어요. 사용 중인 secret backend의 문서에서 그런 옵션이 있는지 확인해 보세요.
한편, 워커의 secrets backend가 정의되어 있다면 조회 순서는 워커의 secrets backend가 더 높은 우선순위를 갖고, 그 다음 secrets backend 순이에요.
Warning
환경 변수나 대체 secrets backend를 사용해 secrets나 variable을 저장할 때 키 충돌이 발생할 수 있어요. backend 간에 키가 중복되면 모든 쓰기 연산은 metastore의 값을 업데이트하지만, 모든 읽기 연산은 커스텀 backend부터 시작해 환경 변수, 마지막으로 metastore 순서로 요청된 키의 첫 번째 일치 항목을 반환해요.
설정 (Configuration)
[secrets] 섹션에는 다음 옵션이 있어요:
[secrets]
backend =
backend_kwargs =
활성화하려는 backend의 정규화된 클래스 이름(full qualified class name)을 backend에 설정해요.
backend_kwargs에 json을 제공할 수 있으며, 이 값은 secrets backend의 __init__ 메서드에 kwargs로 전달돼요.
현재 설정된 secret backend를 확인하려면 아래 예처럼 airflow config get-value secrets backend 명령을 사용하면 돼요.
$ airflow config get-value secrets backend
airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend
개별 backend kwargs 설정하기 (Setting individual backend kwargs)
모든 kwargs를 JSON blob으로 인코딩하는 대신, AIRFLOW__SECRETS__BACKEND_KWARG__<KEY> 접두어를 사용해 각각을 별도의 환경 변수로 설정할 수 있어요:
# These two are equivalent:
export AIRFLOW__SECRETS__BACKEND_KWARGS='{"role_id": "abc", "secret_id": "xyz"}'
# or individually (useful for K8s Secrets):
export AIRFLOW__SECRETS__BACKEND_KWARG__ROLE_ID=abc
export AIRFLOW__SECRETS__BACKEND_KWARG__SECRET_ID=xyz
키별 변수는 BACKEND_KWARGS의 같은 키를 덮어써요. 값은 원시 문자열이에요(JSON 파싱되지 않음). 워커의 경우 AIRFLOW__WORKERS__SECRETS_BACKEND_KWARG__<KEY> 접두어를 사용해요.
Note
이러한 환경 변수는
BACKEND_KWARGS와 같은 방식으로 시작 시 로그에서 마스킹돼요.
워커별 설정 (Worker Specific Configuration)
위 섹션은 모든 Airflow 컴포넌트에 대한 일반적인 구성 옵션을 다뤄요. 하지만 Airflow 3에서는 워커에 대해 별도의 secrets backend를 구성하고 싶다면 다음을 사용하면 돼요:
[workers]
secrets_backend =
secrets_backend_kwargs =
활성화하려는 backend의 정규화된 클래스 이름을 secrets_backend에 설정해요.
secrets_backend_kwargs에 json을 제공할 수 있으며, 이 값은 워커의 secrets backend __init__ 메서드에 kwargs로 전달돼요.
현재 설정된 secret backend를 확인하려면 아래 예처럼 airflow config get-value workers secrets_backend 명령을 사용하면 돼요.
$ airflow config get-value workers secrets_backend
airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend
지원되는 core 백엔드
Apache Airflow Community 제공 secret backends
Apache Airflow Community는 커뮤니티 개발 provider(Providers)도 배포하며, 그중 일부는 Apache Airflow의 secret backends 기능을 확장하는 핸들러를 제공해요. 그런 모든 provider는 Secret backends에서 볼 수 있어요.
나만의 secrets backend 만들기
secrets backend는 airflow.secrets.base_secrets.BaseSecretsBackend의 하위 클래스이며, connection 조회를 위해 get_connection() 또는 get_conn_value(), variable 조회를 위해 get_variable(), Airflow 구성 조회를 위해 get_config()를 구현해야 해요.
backend 클래스를 작성한 뒤 airflow.cfg의 [secrets] 섹션 backend 키에 정규화된 클래스 이름을 제공해 주세요.
SecretsBackend에 대한 추가 인자는 backend_kwargs에 JSON 문자열을 제공해 airflow.cfg에서 구성할 수 있으며, 이 값은 SecretsBackend의 __init__에 전달돼요. 자세한 내용은 설정을 참고하고, 예시는 SSM Parameter Store를 참고하세요.
connection에 대한 비 Airflow 호환 secret 형식 적응하기
Secret backend의 기본 구현은 connection에 대한 secret 저장에 Airflow 전용 형식을 요구해요. 현재 대부분의 커뮤니티 제공 구현은 connection을 JSON이나 Airflow Connection URI 형식으로 저장해야 해요(Secret backends 참고). 하지만 일부 조직은 자격 증명(비밀번호/토큰 등)을 다른 방식으로 저장해야 할 수도 있어요. 예를 들어, 같은 자격 증명 저장소를 여러 데이터 플랫폼에서 사용해야 하거나, Airflow 전용 형식과 호환되지 않는 자격 증명 회전의 내장 메커니즘이 있는 서비스를 사용하는 경우예요. 이 경우 이전 장에서 설명한 대로 나만의 secret backend를 직접 만들고, 기존 secrets backend를 확장해 조직의 체계에 맞게 적응시켜야 해요.