在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工作目录
- 将dbt项目从S3同步到
/tmp目录(可通过S3Hook的download_file或sync_to_folder方法实现) - 在
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
相关产品推荐
相关产品推荐

