Airflow Variables加密
外观
Airflow Variables加密[编辑 | 编辑源代码]
介绍[编辑 | 编辑源代码]
Airflow Variables加密是Apache Airflow中保护敏感配置数据的重要机制,通过加密技术确保数据库存储的变量内容(如API密钥、数据库密码等)不被明文暴露。该功能基于Fernet对称加密实现,要求用户配置加密密钥后自动生效。
工作原理[编辑 | 编辑源代码]
Airflow使用以下流程处理变量加密:
数学表达式表示加密过程:
配置方法[编辑 | 编辑源代码]
生成加密密钥[编辑 | 编辑源代码]
使用以下命令生成Fernet密钥(需Python环境):
from cryptography.fernet import Fernet
fernet_key = Fernet.generate_key()
print(fernet_key.decode()) # 输出示例:'hTj2vJ3nP5sR8uVxYzA0bC1dE4fG7iK9l'
修改Airflow配置[编辑 | 编辑源代码]
在`airflow.cfg`中设置:
[core]
fernet_key = hTj2vJ3nP5sR8uVxYzA0bC1dE4fG7iK9l
或通过环境变量:
export AIRFLOW__CORE__FERNET_KEY="hTj2vJ3nP5sR8uVxYzA0bC1dE4fG7iK9l"
使用示例[编辑 | 编辑源代码]
加密存储变量[编辑 | 编辑源代码]
from airflow.models import Variable
Variable.set("my_secret", "s3cr3t_p@ssw0rd") # 自动加密
解密读取变量[编辑 | 编辑源代码]
secret = Variable.get("my_secret") # 自动解密
print(secret) # 输出: 's3cr3t_p@ssw0rd'
高级用法[编辑 | 编辑源代码]
密钥轮换[编辑 | 编辑源代码]
支持多密钥配置(按优先级尝试解密):
[core]
fernet_key =
current_key:hTj2vJ3nP5sR8uVxYzA0bC1dE4fG7iK9l,
old_key:qWeRtYuIoPaSdFgHjKlZxCvBnM1kL9p8
加密验证[编辑 | 编辑源代码]
检查变量是否已加密:
from airflow.settings import Session
from airflow.models import Variable
var = Session.query(Variable).filter_by(key="my_secret").first()
print(var.is_encrypted()) # 返回True/False
实际案例[编辑 | 编辑源代码]
场景:保护数据库连接[编辑 | 编辑源代码]
1. 加密存储生产环境数据库密码:
Variable.set("prod_db_pass", "DB@1234!") # 加密存储
2. 在DAG中使用:
from airflow import DAG
from airflow.providers.postgres.operators.postgres import PostgresOperator
with DAG('secure_etl', schedule_interval=None) as dag:
PostgresOperator(
task_id='load_data',
postgres_conn_id='prod_connection',
sql='SELECT * FROM users',
password=Variable.get("prod_db_pass") # 自动解密
)
注意事项[编辑 | 编辑源代码]
- 密钥保管:丢失加密密钥将导致已加密变量永久不可读
- 性能影响:加解密操作会增加约10-15%的I/O开销
- 版本兼容:Airflow 2.0+ 默认启用变量加密
- 审计日志:建议记录密钥使用情况:
故障排查[编辑 | 编辑源代码]
错误现象 | 可能原因 | 解决方案 |
---|---|---|
DecryptionError | 密钥不匹配 | 检查`AIRFLOW__CORE__FERNET_KEY`配置 |
Value is not encrypted | 未配置密钥 | 生成新密钥并重新设置变量 |
Malformed token | 数据损坏 | 从备份恢复或重新设置变量 |
最佳实践[编辑 | 编辑源代码]
- 使用密钥管理系统(如AWS KMS)存储主密钥
- 定期轮换密钥(建议每90天)
- 对敏感变量添加`_secret`后缀便于识别
- 开发/生产环境使用不同密钥