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

在AWS MWAA中访问dags外文件夹及跨S3桶解决dbt只读错误

解决AWS MWAA中dbt执行只读文件系统错误及跨目录/跨S3桶访问问题

核心问题原因

你遇到的OSError 30(Read only File system)是因为MWAA的$AIRFLOW_HOME/dags是只读目录,而dbt执行时会自动生成target/、logs/等临时或输出目录,无法在只读路径下完成创建操作。

MWAA目录访问权限说明

  • 仅/tmp目录支持读写操作,这是Airflow任务中唯一的可写本地目录,默认大小限制为1GB
  • 无法直接访问$AIRFLOW_HOME/dags之外的其他本地目录(如/usr/local/airflow下的非指定路径)

跨S3桶访问可行性

完全可以访问存储MWAA文件的S3桶之外的其他S3桶,只需满足两个条件:

  • MWAA的执行IAM角色拥有目标S3桶的对应权限(比如s3:ListBucket、s3:GetObject、s3:PutObject等,根据实际操作需求配置)
  • 在Airflow任务中通过AWS SDK(如boto3)或S3Hook来操作其他S3桶的文件

推荐的dbt执行方案

结合权限限制,推荐两种可行方案:

方案1:使用/tmp目录作为dbt工作目录

  1. 将dbt项目从S3同步到/tmp目录(可通过S3Hook的download_file或sync_to_folder方法实现)
  2. 在dbt.cli.main中指定project-dir和target-dir到/tmp下的路径,示例代码:
from airflow.providers.amazon.aws.hooks.s3 import S3Hook
from dbt.cli.main import dbtRunner, dbtRunnerResult

def run_dbt_task():
    # 从S3同步dbt项目到/tmp
    s3_hook = S3Hook(aws_conn_id="aws_default")
    s3_hook.sync_to_folder(
        bucket_name="your-dbt-project-bucket",
        prefix="dbt-project/",
        local_folder="/tmp/dbt-project"
    )
    # 执行dbt命令,指定可写的target目录
    runner = dbtRunner()
    res: dbtRunnerResult = runner.invoke([
        "run",
        "--project-dir", "/tmp/dbt-project",
        "--target-dir", "/tmp/dbt-target"
    ])
    # 可选:将target目录的结果同步回S3
    s3_hook.sync_from_folder(
        local_folder="/tmp/dbt-target",
        bucket_name="your-result-bucket",
        prefix="dbt-results/"
    )

方案2:使用dbt Cloud替代本地执行

如果不想处理本地目录同步逻辑,可以直接调用dbt Cloud的API触发dbt任务,彻底避开MWAA本地文件系统的权限限制。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:57:44