Airflow 2.2.4邮件告警失败:无法识别SMTP连接信息
问题描述
在AWS EKS中部署了Airflow 2.2.4(使用官方Helm chart 1.6.0),尝试配置DAG失败时的邮件通知,遇到以下异常:
- 已在Helm values文件中配置SMTP基础参数:
config: smtp: smtp_host: "smtp.gmail.com" smtp_starttls: "True" smtp_ssl: "False" smtp_mail_from: "my.address@gmail.com" smtp_port: 587
- 配置Airflow使用AWS Secrets Manager作为密钥后端,前缀
airflow/connections的密钥会转为Airflow连接。创建了名为airflow/connections/smtp_default的密钥,内容为:
{ "login": "my.address@gmail.com", "password": "blahblahblah" }
- 通过
kubectl exec进入调度器Pod执行airflow connections get smtp_default能确认Airflow识别该连接,但日志提示找不到smtp/smtp_user,邮件告警多次失败。进一步测试发现:- 连接的
login和password字段为None schema字段存储了密钥的部分JSON内容
- 连接的
- 该现象与AWS Secrets Manager后端文档示例矛盾,询问是否误解源码或存在其他可能原因。
解决方案与排查方向
1. 修正AWS Secrets Manager密钥格式
Airflow的AWS Secrets Manager后端对连接类密钥有严格格式要求,不能仅用JSON键值对存储login/password,必须包含必填的conn_type字段,正确格式如下:
{ "conn_type": "smtp", "login": "my.address@gmail.com", "password": "blahblahblah", "host": "smtp.gmail.com", "port": 587 }
或者直接存储Airflow连接URI字符串:
smtp://my.address@gmail.com:blahblahblah@smtp.gmail.com:587
注:Airflow 2.x的Secrets Manager后端会优先解析
conn_type字段,如果缺失,会将整个JSON内容当作URI字符串处理,导致schema字段被错误填充,login/password无法正确提取。
2. 统一SMTP配置优先级
Airflow的SMTP配置存在优先级冲突风险:
- 建议将所有SMTP参数统一放到
smtp_default连接中,去掉values中的config.smtp配置,避免混合配置导致解析异常 - 若保留values中的基础配置,需确保连接中的参数能覆盖全局配置项
3. 验证Secrets Manager后端配置
确认Helm values中Secrets Manager的配置格式正确,特别是backend_kwargs需为JSON字符串:
airflow: config: secrets: backend: airflow.providers.amazon.aws.secrets.secrets_manager.SecretsManagerBackend backend_kwargs: '{"connections_prefix": "airflow/connections"}'
4. 检查Gmail SMTP特殊要求
若使用Gmail SMTP,需确认:
- 未启用2FA时,已开启“低安全性应用访问”;启用2FA时,需使用应用专用密码而非账户密码
- Secrets Manager中存储的密码为正确的应用专用密码
5. 查看调度器详细日志
通过kubectl logs <scheduler-pod-name>搜索smtp_default或SecretsManagerBackend相关日志,确认密钥加载、解析过程是否有格式错误或权限报错。
内容的提问来源于stack exchange,提问作者user4601931
相关产品推荐
相关产品推荐

