Соединение, используемое в Airflow DAG, не предоставляет _расшифрованный_ пароль или дополнительный — проблема создания DAG

Я расширяю образ Airflow:2.2.0 и пытаюсь использовать Connection в DAG, чтобы делать запросы GET с помощью специального хука. Однако, независимо от того, что я пытаюсь сделать, и следуя любым найденным предложениям, DAG, похоже, не получает расшифрованную версию пароля и дополнительного поля.

Выходные данные DAG правильно отображают информацию о подключении (логически отредактированную, как указывает исходный код при печати), но попытка использовать ее или распечатать ее не приводит к расшифровке паролей.

Я редактирую всю конфиденциальную/личную информацию с помощью [var_name]ниже

Я попытался получить подробности непосредственно в PythonOperatorDAG:

      conn = BaseHook.get_connection(conn_id=[conn_id])
print(conn.password)
print(conn.extra)

и из пользовательского хука, который импортируется

      # inside the PythonOperator
with JwtHook(conn_id=[conn_id]) as api:
    result = api.get_metadata()
    print(result)


# with JwtHook partially doing (again, redacted majority of code):
...
def get_conn(self):
    """
    Returns the connection used by the hook for querying data.
    Should in principle not be used directly.
    """

    # Return existing session if initiated
    if self._session is None:
        # Fetch config for the given connection (host, login, etc).
        config = self.get_connection(self._conn_id)
        print(config.extra)        
        print(config.extra_dejson)

        if not config.host or not self._extras.get("token_host"):
            raise ValueError(
                f"No (token)host specified in connection {self._conn_id}"
            )

        self._login = (config.login, config.password)
        print(self._login)

       ...

...

      {base.py:79} INFO - Using connection to: id: [conn_id]. Host: [url], Port: None, Schema: None, Login: [username], Password: ***, extra: {'token_host': '***', 'user_id': ''}
{logging_mixin.py:109} INFO - {"token_host": "***","user_id": ""}
{logging_mixin.py:109} INFO - {'token_host': '***', 'user_id': ''}
{logging_mixin.py:109} INFO - ([username], '***')

Вещи, которые я пробовал, следовал и реализовывал после истощения интернета:

  • настроить общий ключ Fernet для контейнеров
            # set up for all containers in docker-compose
    environment:
      &airflow-common-env
      AIRFLOW__CORE__FERNET_KEY: ${_AIRFLOW__CORE__FERNET_KEY}
    
    Совместное использование подтверждается после запуска
            docker-compose run airflow-[containername] airflow config get-value core fernet_key
    
    для всех контейнеров.
  • Я создал соединение через веб-интерфейс и через командную строку. В любом случае веб-интерфейс хорошо показывает соединение со всеми подробностями, команда connections get [conn_id]выведите его идентично со всеми расшифрованными секретами.
            id | conn_id   | conn_type | description             | host  | schema | login      | password   | port | is_encrypted | is_extra_encrypted | extra_dejson                           | get_uri
    
    1  | [conn_id] | HTTP      | Custom API connection   | [url] | None   | [username] | [password] | None | True         | True               | {'token_host': [url], 'user_id': [id]} | [uri]
    

Любая помощь в сортировке этого будет здорово. Я просто не могу определить проблему — и, возможно, я неправильно использую Airflow. Интересно, что я не получаю никаких ошибок (как здесь). Мне было интересно, имеет ли исполнитель DAG те же права, что и создатель Connection, но я не могу найти/увидеть, как подтвердить это подозрение.

Буду признателен за любую оказанную помощь. Спасибо за чтение заранее!

[EDIT] Итак, я не пытался бежать testзапустите DAG из CLI - и что вы знаете - это работает! Вместо этого я запускал DAG вручную из пользовательского интерфейса, но поскольку у меня есть только один пользователь (администратор), я не подозревал, что это не сработает. Так что мне ясно, что это какая-то авторская проблема. У кого-нибудь есть какие-либо указатели на то, как настроить это правильно? Спасибо!

1 ответ

Это ожидаемо. *** в журналах — это просто признак того, что ваш секрет соединения был правильно получен. Airflow поддерживает автоматическую маскировку секретов — если вы случайно напечатаете такой секрет в журнале, он будет автоматически заменен на «***». То, что вы видите в логах, означает, что вы правильно его расшифровали.

См. https://airflow.apache.org/docs/apache-airflow/stable/security/secrets/mask-sensitive-values.html .

Другие вопросы по тегам