通过SSH堡垒机连接dbt到Postgres的配置问题与超时错误咨询
dbt通过SSH堡垒机连接Postgres配置方案
一、profiles.yml 正确配置方式
原生dbt-postgres适配器未内置ssh-host类参数,直接添加该参数不会生效,需通过SSH端口转发实现连接,以下是最稳定的配置方案:
- 建立本地SSH端口转发
执行命令:ssh -L <本地任意空闲端口>:<Postgres内网访问地址>:<Postgres服务端口> <堡垒机用户名>@<堡垒机公网地址> -p <堡垒机SSH端口>
示例:ssh -L 5433:10.0.2.15:5432 bastion_user@113.xx.xx.xx -p 22
可额外添加-fN参数让隧道在后台静默运行,运行成功后即可将本地5433端口的流量全部转发到内网Postgres的5432端口。 - 编写profiles.yml配置
dbt_project_profile: target: dev outputs: dev: type: postgres host: 127.0.0.1 # 固定填本地回环地址 port: 5433 # 和前面设置的本地转发端口一致 user: postgres_user # Postgres数据库用户名 password: postgres_password # Postgres数据库密码 dbname: your_db_name # 目标数据库名称 schema: your_target_schema # dbt操作的目标schema threads: 4
二、额外必要设置
- 堡垒机侧需要放开你本地IP的SSH端口访问权限,同时确保堡垒机自身可以正常访问内网Postgres的数据库端口
- Postgres实例的访问白名单需要添加堡垒机的内网IP,而非你本地设备的公网IP
- 若使用密钥对登录堡垒机,需确保本地SSH私钥文件权限为
600,且公钥已添加至堡垒机对应用户的~/.ssh/authorized_keys文件中 - 出现超时错误时优先跳过dbt验证网络连通性:执行
psql -h 127.0.0.1 -p 5433 -U postgres_user -d your_db_name,若该命令也无法连接,说明隧道建立或网络策略存在问题,需先排查网络侧配置 - 若需在自动化流程中使用,可借助Python的
sshtunnel库编写前置脚本,在dbt运行前自动建立隧道、运行结束后自动销毁隧道,无需手动操作
内容的提问来源于stack exchange,提问作者LeoC
相关产品推荐
相关产品推荐

