本地运行Apache Airflow:调试cryptography.fernet.InvalidToken异常
问题:AWS MWAA Local Runner测试Airflow DAG时Fernet InvalidToken错误
使用aws-mwaa-local-runner本地测试Airflow DAG时,触发EMR任务出现如下错误,测试前刚更新过AWS令牌:
[2023-05-18, 20:57:40 UTC] {{emr.py:571}} INFO - Creating job flow using aws_conn_id: aws_default, emr_conn_id: emr_default [2023-05-18, 20:57:40 UTC] {{base.py:71}} INFO - Using connection ID 'emr_default' for task execution. [2023-05-18, 20:57:40 UTC] {{taskinstance.py:1851}} ERROR - Task failed with exception Traceback (most recent call last): File "/usr/local/airflow/dags/emr.py", line 583, in execute response = self._emr_hook.create_job_flow(job_flow_overrides) File "/usr/local/airflow/.local/lib/python3.10/site-packages/airflow/providers/amazon/aws/hooks/emr.py", line 129, in create_job_flow config = emr_conn.extra_dejson.copy() File "/usr/local/airflow/.local/lib/python3.10/site-packages/airflow/models/connection.py", line 400, in extra_dejson if self.extra: File "/usr/local/airflow/.local/lib/python3.10/site-packages/sqlalchemy/orm/attributes.py", line 573, in __get__ retval = self.descriptor.__get__(instance, owner) File "/usr/local/airflow/.local/lib/python3.10/site-packages/airflow/models/connection.py", line 290, in get_extra extra_val = fernet.decrypt(bytes(self._extra, 'utf-8')).decode() File "/usr/local/airflow/.local/lib/python3.10/site-packages/cryptography/fernet.py", line 195, in decrypt raise InvalidToken
错误原因
该错误与更新AWS令牌无关,核心是Airflow尝试解密emr_default连接的extra字段时失败:
emr_default连接的extra字段是用旧Fernet密钥加密的,而当前本地runner使用的是新密钥,导致解密失败extra字段被手动修改过,加密内容损坏- 本地runner的Fernet密钥配置与创建连接时使用的密钥不一致
调试与解决步骤
- 检查并重置
emr_default连接配置:- 进入Airflow UI的Admin > Connections,找到
emr_default - 清空现有
Extra字段内容,填入正确的EMR配置(例如{"region_name": "你的AWS区域"}) - 保存连接,Airflow会自动用当前Fernet密钥重新加密该字段
- 进入Airflow UI的Admin > Connections,找到
- 确认本地runner的Fernet密钥:
打开本地runner的config/airflow.cfg文件,查看fernet_key配置项,确保该密钥与创建emr_default连接时使用的密钥一致。如果是新启动的本地runner,默认会生成新密钥,需替换为旧密钥或重新创建连接 - 重新创建连接:
若不确定旧Fernet密钥,直接删除emr_default连接,重新创建并填入正确的认证信息(可复用aws_default的AWS令牌配置) - 验证AWS令牌有效性:
进入本地runner容器,执行aws sts get-caller-identity命令,确认更新后的令牌能正常访问AWS服务(排除令牌本身的问题)
内容的提问来源于stack exchange,提问作者Youssef
相关产品推荐
相关产品推荐

