보안 비밀 관리자로 환경 구성

이 페이지에서는 보안 비밀 관리자를 사용하여 Airflow 연결 및 보안 비밀을 안전하게 저장하는 방법을 보여줍니다.

기본 요건

보안 비밀 관리자를 사용하려면 Cloud Composer 환경에서 Airflow 1.10.10 이상과 Python 3.6 이상을 사용해야 합니다(Python 2는 지원되지 않음).

보안 비밀 관리자로 환경 구성

  1. Secret Manager API를 사용 설정합니다.

    Secret Manager API

  2. 보안 비밀 관리자에서 연결 및 변수 추가(자세한 내용은 보안 비밀 및 버전 만들기 참조)

    보안 비밀은 다음 형식을 따라야 합니다.

    • 변수: [variable_prefix][sep][variable_name]

      • [variable_prefix]의 기본값은 airflow-variables입니다.
      • 기본 구분자 [sep]-입니다.
      • 예를 들어 변수 이름 my-var의 경우 보안 비밀 이름은 airflow-variables-my-var입니다.
    • 연결: [connection_prefix][sep][connection_name]

      • [connection_prefix]의 기본값은 airflow-connections입니다.
      • 기본 구분자 [sep]-입니다.
      • 예를 들어 my-connection 연결의 경우 보안 비밀 이름은 airflow-connections-my-connection입니다.
      • 연결 값은 URI 표현(예: mysql://myhost:9000)을 사용해야 합니다. URI는 URL 인코딩(퍼센트 인코딩)되어야 합니다. 예를 들어 Some Page 링크는 [https://myhost:9000/Some%20Page](https://myhost:9000/Some%20Page)이어야 합니다. Airflow에는 연결 URI를 생성하는 편의 메서드가 있습니다. JSON Extras를 사용하여 복잡한 URL을 인코딩하는 방법의 예시는 Airflow 문서에서 볼 수 있습니다.

    [variable_prefix], [connection_prefix] 또는 [sep]에 다른 값을 사용하려면 보안 비밀 관리자 백엔드 사용 설정 및 구성 섹션에서 선택적 설정을 사용하세요.

  3. 액세스 제어 구성

    Airflow는 보안 비밀 관리자에 저장된 보안 비밀에 대한 액세스 권한을 부여받아야 합니다. Cloud Composer 환경에서 보안 비밀 관리자에 액세스할 서비스 계정에 secretmanager.versions.access 권한(예: 보안 비밀 관리자 보안 비밀 접근자)이 포함된 역할을 부여합니다. 이 역할은 보안 비밀, 프로젝트, 폴더 또는 조직 수준에서 부여할 수 있습니다.

    기본적으로 이 계정은 Compute Engine 기본 서비스 계정이지만 환경 생성 중에 커스텀 서비스 계정을 지정할 수 있습니다. secrets.backend_kwargs Airflow 설정의 gcp_key_path 매개변수가 서비스 계정의 사용자 인증 정보로 JSON 파일을 가리키도록 Airflow가 보안 비밀 관리자에 액세스하는 서비스 계정을 재정의할 수도 있습니다. 이 메서드는 서비스 계정 사용자 인증 정보를 파일에 저장해야 하므로 보안 침해 위험이 높아져 권장하지 않습니다.

    액세스 제어

  4. DAG 직렬화 사용 설정

    일반적으로 연산자의 execute() 메서드 내에서 또는 Airflow 매크로JINJA 템플릿으로만 보안 비밀 백엔드를 사용해야 합니다. 예를 들어 var.value.my_var을 사용하여 변수를 검색할 수 있습니다. Airflow 웹 서버는 권한이 제한된 다른 서비스 계정으로 실행되며 보안 비밀 관리자의 보안 비밀에 액세스할 수 없습니다.

    DAG 코드가 작업에서가 아니라 처리 중에 보안 비밀에 액세스하고 위의 권장사항에 따라 조정할 수 없는 경우 Airflow 웹 서버를 사용하려면 DAG 직렬화를 사용 설정해야 합니다.

  5. 보안 비밀 관리자 백엔드 사용 설정 및 구성

    1. 환경 페이지에서 환경을 선택하여 환경 세부정보 페이지에 액세스합니다.
    2. Airflow 구성 재정의를 클릭합니다.
    3. 구성을 추가합니다.

      • 섹션 = secrets
      • 키 = backend
      • 값 = airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend

      보안 비밀 관리자 백엔드 구성

    4. 설정(선택사항)을 추가합니다.

      • 섹션 = secrets
      • 키 = backend_kwargs
      • 값: 다음 필드가 포함된 객체의 JSON 표현:(소스)

        • connections_prefix: 연결을 가져오기 위해 읽을 보안 비밀의 프리픽스를 지정합니다. 기본값: airflow-connections
        • variables_prefix: 변수를 가져오기 위해 읽을 보안 비밀의 프리픽스를 지정합니다. 기본값: airflow-variables
        • gcp_key_path: Google Cloud 사용자 인증 정보 JSON 파일의 경로입니다(입력하지 않은 경우 기본 서비스 계정 사용).
        • gcp_keyfile_dict: Google Cloud 사용자 인증 정보 JSON 사전입니다. gcp_key_path와 상호 배타적
        • sep: connections_prefix와 conn_id를 연결하는 데 사용되는 구분자입니다. 기본값: -
        • project_id: 보안 비밀에 액세스할 Google Cloud 프로젝트 ID입니다.
      • 예: Value = {"connections_prefix":"my-connections","variables_prefix"="my-variables", "sep": "-"}

보안 비밀 관리자 사용

변수 및 연결을 가져올 때 Cloud Composer는 먼저 보안 비밀 관리자를 확인합니다. 요청된 변수 또는 연결이 없으면 Cloud Composer는 환경/메타스토어 데이터베이스를 확인합니다. 참고: 보안상의 이유로 보안 비밀 관리자의 변수 및 연결은 Airflow 웹 서버 UI에 표시되지 않습니다.

변수 읽기

JINJA 템플릿

보안 비밀 관리자를 사용하면 JINJA 템플릿으로 실행 시간에 확인된 템플릿 연산자 필드를 읽을 수 있습니다.

airflow-variables-secret_filename 변수에는 다음을 사용합니다.

file_name = 'var.value.secret_filename'

커스텀 연산자 및 콜백

또한 커스텀 연산자 또는 연산자의 콜백 메서드에서 변수를 읽는 데 사용할 수 있습니다. DAG 내에서 변수를 읽는 것은 성능에 부정적인 영향을 줄 수 있으므로 DAG에서 변수를 사용하려는 경우 JINJA 템플릿을 사용하는 것이 좋습니다.

airflow-variables-myVariable 변수에는 다음을 사용합니다.

from airflow.models.variable import Variable
myValue = Variable.get('myVariable')

연결 읽기

커스텀 연산자를 작성하는 것이 아니라면 연결에 직접 액세스할 필요가 거의 없습니다. 대부분의 후크는 인스턴스화 매개변수로 연결 이름을 가져오고 작업이 실행될 때 보안 비밀 백엔드에서 연결을 자동으로 가져와야 합니다.

직접 후크를 작성할 때는 연결을 직접 읽는 것이 도움이 될 수 있습니다.

airflow-variables-myConnection 연결의 경우 다음을 사용합니다.

from airflow.hooks.base_hook import BaseHook
myConnection = BaseHook.get_connection('myConnection')
를 사용해 URI 문자열 표현을 얻을 수 있습니다.