本文主要介绍Airflow的Web认证和邮件发送服务的相关配置。

认证(Authentication)

Airflow默认安装好后,是没有认证的,所有功能都是开放的。

Airflow提供了多种用户认证方式,有Password, OAuth, LDAP等方式。

初期使用的话,使用Password认证方式就满足需求了,所以这里只介绍Password认证的配置。

配置前,先确保一下模块已经安装: pip install apache-airflow[password]

然后修改配置文件airflow.cfg中的webserver节开启密码验证功能。

[webserver]
authenticate = true
# 以下配置如果没有,请增加
auth_backend = airflow.contrib.auth.backends.password_auth

紧接着在Airflow的虚拟环境下用Python REPL运行以下代码,将初始用户帐号和密码信息写入DB。

import airflow
from airflow import models, settings
from airflow.contrib.auth.backends.password_auth import PasswordUser
user = PasswordUser(models.User())
user.username = 'admin'
user.email = 'admin@example.com'
user.password = 'passwd1'
session = settings.Session()
session.add(user)
session.commit()
session.close()
exit()

上面执行user.password = 'passwd1'时,如果遇到报错AttributeError: can't set attribute,而且SQLAlchemy是1.2.0版本,则是由于SQLAlchemy版本与Airflow代码不兼容引起的。 解决方法是将SQLAlchemy降级到1.1.15版本就可以修复。

可以执行pip install 'sqlalchemy<1.2',就可以安装1.1版本。

最后,重启webserver即可看见登录页面。

SMTP邮件发送服务配置

SMTP服务的配置比较简单,修改airflow.cfg

[smtp]
smtp_host = smtp.163.com
smtp_starttls = True
smtp_ssl = False
smtp_user = someone@163.com
smtp_password = 123
smtp_port = 25
smtp_mail_from = someone@163.com

需要注意的是如果配置有问题,需要DEBUG SMTP服务的话,最好自己写个Python程序来测试。

我在使用163或者Outlook邮箱时,都遇到了一些问题:163的是把我发送的邮件当作垃圾邮件而拒绝,Outlook则是认证总是失败。

最后使用了SendCloud的邮件服务才可以在Amazon EC2的实例上正常的发送邮件。

附上测试SMTP服务的Python代码:

from smtplib import SMTP
from email.mime.text import MIMEText
from email.header import Header

def send_email(SMTP_host, user, password, from_addr, to_addrs, subject, content):
    email_client = SMTP(SMTP_host)
    # 开启SMTP会话详细日志
    email_client.set_debuglevel(1)
    email_client.ehlo()
    email_client.starttls()
    email_client.ehlo()
    email_client.login(user, password)
    # create msg
    msg = MIMEText(content,'plain','utf-8')
    msg['Subject'] = Header(subject, 'utf-8')#subject
    msg['From'] = from_addr
    msg['To'] = to_addrs
    email_client.sendmail(from_addr, to_addrs, msg.as_string())

    email_client.quit()

if __name__ == "__main__":
   send_email("smtp.sendcloud.net", "api-user", "api-key", "no-reply@sc-mail.magicwind.top", "feng@oriente.com", "Notice", "ETL Start")

配置完SMTP服务后,重启Web Server服务即可生效。