DBT与AWS MWAA集成触发只读文件系统错误如何解决
问题根因
AWS MWAA 的 /usr/local/airflow/dags 目录为系统默认只读挂载目录,你当前将dbt项目存放在该路径下,dbt执行时默认会在项目根目录生成target文件夹存储编译产物、运行日志等内容,写入只读目录就触发了权限报错。即使关闭了partial parsing功能,dbt仍然会生成manifest.json、编译后的SQL文件等内容写入target目录,因此报错依然存在。
可行解决方法
- 方法1:在Operator中添加命令参数指定可写输出目录
MWAA 为任务预留了可写的临时目录/tmp,你可以在DbtRunOperator中通过dbt_cmd_flags参数指定dbt的输出路径到/tmp下,修改后的代码示例如下:
dbt_run = DbtRunOperator( task_id='dbt_run', dbt_bin='/usr/local/airflow/.local/bin/dbt', profiles_dir='/usr/local/airflow/dags/dbt/', dir='/usr/local/airflow/dags/dbt/learn/', # 新增以下参数,指定输出路径到可写临时目录 dbt_cmd_flags=[ "--target-path", "/tmp/dbt/target", "--log-path", "/tmp/dbt/logs" ] )
如果有依赖包安装需求,还可以追加"--packages-install-path", "/tmp/dbt/packages"参数到flags列表中。
- 方法2:修改dbt项目配置默认输出路径
你也可以直接在dbt项目的dbt_project.yml文件中添加全局配置,将所有输出路径默认指定到可写目录:
target-path: "/tmp/dbt/target" log-path: "/tmp/dbt/logs" packages-install-path: "/tmp/dbt/packages"
该配置无需修改DAG代码,dbt运行时会自动读取配置写入对应路径。
- 可选补充:持久化运行产物
如果需要留存dbt的编译产物、运行日志等内容,可以在dbt任务后新增一个任务,将/tmp/dbt下的文件同步到你自己的S3存储桶中即可。
内容的提问来源于stack exchange,提问作者Satya
相关产品推荐
相关产品推荐

