使用Astronomer-Cosmos SDK运行DbtDag时宏无法读取环境变量
在Airflow中使用Astronomer-Cosmos运行含宏的DBT模型时环境变量解析失败的解决思路
问题背景
环境:Airflow + Astronomer-Cosmos SDK
问题:此前演示及DBT命令行运行模型均成功,但运行包含如下宏的DAG时,无法解析语句:database_name = env_var('DB_PREFIX')+"_"+env_var('DB_ENV')+database_subfix -%}已完成操作:
- Docker镜像中添加
ENV DB_PREFIX=ZZ_ID- 尝试覆盖Docker镜像的
/etc/environment文件,登录容器执行set命令可查看到目标变量- Airflow管理端已定义对应环境变量
解决思路
显式配置Cosmos传递环境变量
Cosmos运行DBT进程时,不会自动继承Airflow的环境变量,需在DAG配置中通过ExecutionConfig的env_vars参数主动传递:from cosmos import DbtDag from cosmos.config import ProjectConfig, ExecutionConfig import os dbt_dag = DbtDag( project_config=ProjectConfig("/path/to/your/dbt/project"), execution_config=ExecutionConfig( env_vars={ "DB_PREFIX": os.getenv("DB_PREFIX"), "DB_ENV": os.getenv("DB_ENV") } ), # 其他DAG配置项 )校验DBT宏的Jinja语法完整性
检查宏的语法是否闭合完整,你提供的代码片段末尾是-%},需确认开头是否有对应的{%标签。完整的宏示例应为:{% macro generate_database_name() %} {% set database_subfix = "_prod" %} {{ env_var('DB_PREFIX') }}_{{ env_var('DB_ENV') }}{{ database_subfix }} {% endmacro %}语法缺失或错误会直接导致解析失败。
确认Airflow Worker的环境变量配置
Airflow Webserver能读取变量不代表Worker进程也能获取到:- 若使用Celery Executor,需在Worker容器的配置中单独添加环境变量(如Astronomer部署的
docker-compose.override.yml中给worker服务配置environment) - 或在
airflow.cfg中配置worker_env参数,批量传递所需变量
- 若使用Celery Executor,需在Worker容器的配置中单独添加环境变量(如Astronomer部署的
直接在DBT层面测试变量读取
在DBT项目的dbt_project.yml中添加测试配置:vars: test_db_prefix: "{{ env_var('DB_PREFIX') }}"然后在容器内执行
dbt debug,查看是否能正确解析变量,排除DBT本身无法读取环境变量的问题。检查Cosmos版本兼容性
部分旧版本Cosmos存在环境变量传递的bug,建议升级至最新稳定版后重新测试。
内容的提问来源于stack exchange,提问作者Fabio
相关产品推荐
相关产品推荐

