You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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参数,批量传递所需变量
  • 直接在DBT层面测试变量读取
    在DBT项目的dbt_project.yml中添加测试配置:

    vars:
        test_db_prefix: "{{ env_var('DB_PREFIX') }}"
    

    然后在容器内执行dbt debug,查看是否能正确解析变量,排除DBT本身无法读取环境变量的问题。

  • 检查Cosmos版本兼容性
    部分旧版本Cosmos存在环境变量传递的bug,建议升级至最新稳定版后重新测试。

内容的提问来源于stack exchange,提问作者Fabio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 22:48:24