«Недействительные учетные данные аутентификации» при настройке SMTP-сервера GCP Composer (Airflow)

avatar
Jinyu
8 августа 2021 в 22:28
427
1
0

Я использую GCP Composer (Airflow) для запуска некоторых запланированных задач. И использовать SMTP-сервер AWS SES для отправки уведомления по электронной почте.

Согласно документу GCP Composer Настройка среды с помощью Secret Manager и Настройка пароля SMTP для стороннего SMTP-сервиса, я установил переопределение конфигурации Airflow245191939199

secrets
    backend airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend

smtp
    smtp_port 587
    smtp_mail_from ...
    smtp_host email-smtp.us-west-1.amazonaws.com
    smtp_starttls True
    smtp_password_secret smtp-password
    smtp_ssl False
    smtp_user ...
email
    email_backend airflow.utils.email.send_email_smtp

И добавьте секретную запись airflow-variables-smtp-password в Secret Manager.

В Airflow возникла ошибка при отправке электронного письма:

...
Authentication Credentials Invalid

Источник

Ответы (1)

avatar
Jinyu
8 августа 2021 в 22:28
3

TL;DR Это ошибка в документе GCP Настройка вашей среды с помощью Secret Manager. Префиксы различаются в этих двух бэкендах. Вам нужно использовать префикс airflow-config для серверной части airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend и airflow-variables для серверной части airflow.contrib.secrets.gcp_secrets_manager.CloudSecretsManagerBackend для доступа к секрету в SecretManager. Так что мое секретное имя в SecretManager должно быть airflow-config-smtp-password вместо airflow-variables-smtp-password.

Согласно документу Настройка среды с помощью Secret Manager, рекомендуется использовать секретный сервер airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend.

И особенно в документе есть предупреждение

Внимание! Не используйте airflow.contrib.secrets.gcp_secrets_manager.CloudSecretsManagerBackend, поскольку это значение не позволяет просматривать журналы в пользовательском интерфейсе веб-сервера Airflow.

А в документе Настройка пароля SMTP для сторонней службы SMTP приводится пример того, как хранить пароль SMTP в Secret Manager:

echo -n "SMTP_PASSWORD" | gcloud beta secrets create \
  airflow-variables-smtp-password \
  --data-file=- \
  --replication-policy=automatic

В качестве префикса секретной переменной используется airflow-variables.

Но проблема в том, что серверная часть airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend использует префикс airflow-config для секретных конфигураций

в исходном коде /opt/python3.6/lib/python3.6/site-packages/airflow/providers/google/cloud/secrets/secret_manager.py

    def __init__(
        ...
        variables_prefix: str = "airflow-variables",
        config_prefix: str = "airflow-config",
        ...
    ) -> None:
        ...

    def get_variable(self, key: str) -> Optional[str]:
        ...
        return self._get_secret(self.variables_prefix, key)

    def get_config(self, key: str) -> Optional[str]:
        ...
        return self._get_secret(self.config_prefix, key)

А серверная часть airflow.contrib.secrets.gcp_secrets_manager.CloudSecretsManagerBackend использует префикс airflow-variables как для переменных, так и для секретных конфигураций

в исходном коде /usr/local/lib/airflow/airflow/contrib/secrets/gcp_secrets_manager.py

    def __init__(
        ...
        variables_prefix="airflow-variables",  # type: str
        ...
    ):
        ...

    def get_variable(self, key):
        ...
        return self._get_secret(self.variables_prefix, key)

Поэтому, если вы следуете предложенному бэкенду, вам следует использовать airflow-config в качестве префикса секретной переменной. В моем случае это должно быть airflow-config-smtp-password в секретном менеджере.