如何将Airflow Scheduler部署至AWS EC2?寻求部署相关实操建议
我来分享下把Airflow调度器部署到EC2的实操建议,刚好我之前帮团队做过类似的迁移,结合你的S3数据抓取+EMR Spark处理的场景,给你梳理清楚各个环节的要点:
一、EC2实例规格选型建议
针对你当前的简单数据管道场景,不用一开始就选高配实例,按需起步后续扩容即可:
- 基础起步款:推荐
t3.medium(2核vCPU + 4GB内存),足够支撑每日少量DAG的调度需求,性价比很高。 - 扩容方向:如果后续DAG数量增加、任务并行度提高,可以升级到
t3.large(2核+8GB)或者m5.xlarge(4核+16GB),这类通用型实例对Airflow的调度和Web服务负载适配性很好。 - 存储配置:根卷选
gp3类型,至少分配30GB空间(Airflow会存储日志、临时文件,后续扩容也方便);如果日志存本地的话可以再加大,但更推荐把日志存到S3,这样本地存储压力小。 - IAM角色配置:必须给EC2实例绑定一个具备以下权限的IAM角色,避免硬编码密钥:
- S3读写权限(对应你的数据存储桶)
- EMR集群操作权限(创建/提交Spark任务、监控集群状态)
- CloudWatch日志写入权限(如果把Airflow日志同步到CloudWatch)
- RDS访问权限(如果用外部数据库替代默认的SQLite)
二、分步部署流程
我以Amazon Linux 2为例(Ubuntu流程类似,只是包管理命令换成apt):
- 初始化EC2实例
- 选择Amazon Linux 2 AMI,绑定上面提到的IAM角色
- 安全组配置:只开放SSH(22端口,限制你的IP访问)、Airflow Webserver(8080端口,同样限制可信IP或者通过VPN访问)
- 安装依赖环境
# 更新系统包 sudo yum update -y # 安装Python3和pip sudo yum install python3 python3-pip -y # 安装Airflow依赖的系统库(比如Postgres驱动、编译工具) sudo yum install gcc postgresql-devel -y - 创建虚拟环境并安装Airflow
强烈建议用虚拟环境隔离依赖,避免系统包冲突:# 创建虚拟环境 python3 -m venv airflow-env # 激活虚拟环境 source airflow-env/bin/activate # 设置Airflow版本(推荐2.x稳定版,比如2.8.x) AIRFLOW_VERSION=2.8.3 PYTHON_VERSION="$(python --version | cut -d " " -f 2 | cut -d "." -f 1-2)" CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt" # 安装Airflow核心包+必要provider(比如S3、EMR) pip install "apache-airflow==${AIRFLOW_VERSION}" --constraint "${CONSTRAINT_URL}" pip install apache-airflow-providers-amazon - 配置Airflow核心参数
- 先设置
AIRFLOW_HOME环境变量(比如export AIRFLOW_HOME=~/airflow),然后编辑$AIRFLOW_HOME/airflow.cfg:- 替换默认的SQLite数据库:把
sql_alchemy_conn改成RDS Postgres/MySQL的连接字符串(比如postgresql+psycopg2://username:password@rds-endpoint:5432/airflow_db) - 配置日志存储:开启远程日志,设置
remote_logging = True,remote_log_conn_id = aws_default,remote_base_log_folder = s3://your-bucket/airflow-logs/ - 设置Executor:如果是简单场景,先用
SequentialExecutor;如果后续需要并行任务,换成CeleryExecutor(需要额外配置Redis/RabbitMQ作为消息队列)
- 替换默认的SQLite数据库:把
- 先设置
- 初始化Airflow并启动服务
为了让服务稳定运行,推荐用# 初始化数据库 airflow db init # 创建管理员用户(用于登录Web UI) airflow users create --username admin --firstname Admin --lastname User --role Admin --email your-email@example.com # 启动调度器(后台运行可以加&或者用systemd管理) airflow scheduler & # 启动Webserver airflow webserver -p 8080 &systemd配置成守护进程:- 创建
/etc/systemd/system/airflow-scheduler.service和/etc/systemd/system/airflow-webserver.service,配置好虚拟环境路径和启动命令,然后执行sudo systemctl daemon-reload && sudo systemctl enable --now airflow-scheduler airflow-webserver
- 创建
- 迁移DAG文件
把本地的DAG文件复制到EC2的$AIRFLOW_HOME/dags目录下,Airflow会自动扫描加载,大概1-2分钟后就能在Web UI看到。
三、生产环境实用优化建议
- 数据库必换:绝对不要用默认的SQLite,它不支持多进程并发,调度器处理并行任务时会出现锁表、任务延迟的问题,一定要换成RDS的Postgres或者MySQL,数据持久化也更可靠。
- 日志托管到S3/CloudWatch:不要把日志存在EC2本地,一旦实例损坏日志就丢了,配置远程日志后,所有任务日志都会同步到S3,方便排查问题。
- 监控告警:用CloudWatch监控EC2的CPU、内存使用率,设置告警阈值(比如CPU超过80%告警);同时把Airflow的metrics推到CloudWatch,可以通过
airflow metrics配置,实时掌握调度器状态。 - 安全加固:
- 不要把Airflow Webserver的8080端口开放到公网,用VPN、AWS Systems Manager Session Manager或者ALB+Cognito认证来访问UI
- 安全组严格限制入站规则,只允许可信IP访问SSH和8080端口
- 定期更新Airflow版本和系统包,修复安全漏洞
- 自动化部署:把DAG文件、Airflow配置放到Git仓库,用AWS CodePipeline+CodeBuild做CI/CD,每次提交代码自动同步到EC2的dags目录,避免手动操作出错。
内容的提问来源于stack exchange,提问作者Alessandro Messori
相关产品推荐
相关产品推荐

