☰
Steampipe:Zero-ETL 方式用 SQL 实时查询云端 API 与数据源的完整指南
2026/10/9 2:36:23 网站建设 项目流程
  • 开发工具
  • 云原生

【免费下载链接】steampipe

Zero-ETL, infinite possibilities. Live query APIs, code & more with SQL. No DB required.

项目地址:https://gitcode.com/gh_mirrors/st/steampipe
点击查看免费下载

Steampipe 是 Turbot 团队开源的一款零 ETL(Zero-ETL)数据查询工具,它以"把云当作数据库"为设计理念,将 AWS、Azure、GCP、GitHub、Kubernetes 等 140+ 数据源的 REST API 动态映射为数据库表,让你直接用标准 SQL 实时查询 API,无需事先建库、ETL 或维护数据副本。本文基于当前仓库(turbot/steampipe源码镜像)与根目录 README.md 展开,系统介绍 Steampipe 的核心理念、安装方式、插件体系、交互式与批处理查询、服务模式以及底层实现原理,读完即可从零开始安装并完成第一次select * from cloud;。

Steampipe 是什么:零 ETL 地查询 API 与数据源

官方 README 用一句极富表现力的口号概括了 Steampipe 的本质:select * from cloud;。它强调 Steampipe 是the zero-ETL way(零 ETL 方式)来查询 API 与服务,把数据源直接暴露给 SQL。

与传统的"数据管道 + 数仓"路径不同,Steampipe 不搬运数据,而是把 API 实时翻译成可查询的表:

  • SQL:SQL 是几十年的数据访问标准,无需学习新的查询语言;
  • Live data(实时数据):每次查询都实时访问 API,看到的是当下的数据;
  • Speed(速度):查询 API 的速度远超传统方式;
  • Concurrency(并发):可以并行查询多个数据源;
  • Single binary(单一二进制):一个可执行文件即可本地使用,也能部署到 CI/CD 流水线中,无需外部数据库依赖。

从源码结构看,这一设计体现在多个层面:main.go作为单一入口,通过cmd.InitCmd()初始化命令树(见 main.go);cmd/root.go中根命令的 Long 描述同样写着 "Steampipe: select * from cloud; Dynamically query APIs, code and more with SQL. Zero-ETL from 140+ data sources."(见 cmd/root.go)。仓库根目录同时给出了 6 条核心特性概括:"SQL / Live data / Speed / Concurrency / Single binary",对应 README 第 11-19 行。

架构概览:查询是怎么从 SQL 到达 API 的

虽然 README 主要面向使用者,但仓库源码清晰地揭示了 Steampipe 的分层架构,理解它有助于掌握后面所有命令的行为:

  1. CLI 层(cmd/):基于 Cobra 构建的命令行入口,包含query、plugin、service、login、completion等子命令(见 cmd/root.go)。
  2. 嵌入式 PostgreSQL(pkg/db/db_local/):Steampipe 内置了一个本地 PostgreSQL 实例。首次运行时会通过EnsureDBInstalled自动下载并安装数据库文件(见 pkg/db/db_local/install.go),这是"无需 DB"表述的另一面——数据库引擎随二进制一同管理,用户无需自行安装和维护。
  3. 插件管理器(pkg/pluginmanager_service/):通过 gRPC 管理插件的生命周期,负责插件的加载、卸载、连接配置与限流。
  4. 连接层(pkg/steampipeconfig/ 与 pkg/connection/):负责解析.spc配置文件、维护连接状态,并实时刷新连接(见 pkg/connection/refresh_connections.go)。
  5. 查询执行与交互(pkg/query/、pkg/interactive/):交互式控制台、元命令(metaquery)、自动补全与高亮都在这两层实现。

一句话概括执行链路:steampipe query启动(或复用)本地 Postgres 服务 → 插件将远端 API 映射为 foreign table → SQL 经 Postgres 查询计划器下推给插件执行 → 结果流式返回终端。后续章节会结合具体命令逐一展开。

安装 Steampipe

macOS 安装

README 提供了 macOS 的 Homebrew 安装方式:

brew install turbot/tap/steampipe

Linux 或 Windows(WSL2)安装

Linux 或 WSL2 环境使用官方安装脚本:

sudo /bin/sh -c "$(curl -fsSL https://steampipe.io/install/steampipe.sh)"

安装前置环境约束(源码级验证)

从 main.go 可以看到,Steampipe 启动时会做三类环境检查,不符合条件会直接以非零退出码拒绝运行:

  • 禁止 root 运行:checkRoot检查os.Geteuid() == 0时直接报错退出(ExitCodeInvalidExecutionEnvironment),这是为了复刻底层 PostgreSQL 引擎的用户安全机制,并同时校验 real/effective UID 一致,防止 setuid 提权风险;
  • 要求 WSL2:checkWsl1在检测到内核包含microsoft/wsl字样时,若内核版本低于 4.19 则判定为 WSL1 并拒绝运行;
  • macOS 版本要求:checkOSXVersion要求 Darwin 内核版本不低于 Catalina(19.0.0),即 macOS 10.15 及以上。

因此官方 README 将安装脚本标注为 "Linux or Windows (WSL2)" 是有实际依据的:WSL1 无法满足要求。

安装插件:把 API 映射成表

从 Hub 安装插件

安装完成后的第一步通常是安装插件。README 给出的示例:

steampipe plugin install hackernews

该命令从 hub.steampipe.io 拉取插件(默认 registry 为hub.steampipe.io,默认 org 为turbot,默认版本为latest),安装后即可查询对应服务的数据。

插件名称的完整格式为[registry/org/]name[@version]。以源码注释(见 cmd/plugin.go)和命令帮助文本(见 cmd/plugin.go)为依据,实际支持的写法包括:

# 简单名,等价于 turbot/hackernews:latest steampipe plugin install hackernews # 指定版本 steampipe plugin install aws@0.118.0 # 版本约束 steampipe plugin install aws@^0.118 # 完整 OCI 镜像引用 steampipe plugin install ghcr.io/turbot/steampipe/plugins/turbot/aws:1.0.0

plugin install还支持两个实用 flag:

# 跳过为插件创建默认配置文件(config/xxx.spc) steampipe plugin install --skip-config aws # 隐藏安装进度条 steampipe plugin install --progress=false aws

值得注意的行为是:不带任何插件名直接运行steampipe plugin install时,它会读取配置文件(steampipeconfig.GlobalConfig.Plugins)中声明但缺失的所有插件并逐个安装(见 cmd/plugin.go);若没有任何已配置插件,则报 "No connections or plugins configured" 错误并以ExitCodeInsufficientOrWrongInputs退出。

安装过程由pluginInstallSteps定义的步骤驱动:Downloading → Installing Plugin → Installing Docs → Installing Config → Updating Steampipe → Done(见 cmd/plugin.go),即插件安装不仅是下载二进制,还会自动安装文档与默认配置文件。

常用插件矩阵

README 列举了社区中流行的插件:AWS、Azure、GCP、GitHub、Kubernetes、Microsoft 365、Salesforce 等,并指出插件社区已积累了超过 2000 张表,每张表都有可直接复制/粘贴/运行的示例文档。

steampipe plugin install aws steampipe plugin install azure steampipe plugin install gcp steampipe plugin install github steampipe plugin install kubernetes

插件生命周期管理

plugin子命令是一个完整的管理工具组(见 cmd/plugin.go):

# 列出已安装插件(支持 --outdated 检查更新、--output json 输出) steampipe plugin list steampipe plugin list --outdated steampipe plugin list --output json # 更新指定插件,或 --all 更新全部 steampipe plugin update aws steampipe plugin update --all # 卸载插件(一次只能安装一个版本的插件,卸载时不涉及版本) steampipe plugin uninstall aws

plugin list的 JSON 输出结构在源码中有明确定义(见 cmd/plugin.go):包含installed(name/version/connections)、failed(name/reason/connections)与warnings三部分,其中failed段用于展示加载失败的插件及原因——这也是 README 提到的 plugin 命令之外、排查插件状态时非常实用的能力。

开始查询:交互式控制台与单次查询

交互式查询

安装好插件后,直接进入交互式 SQL 控制台:

steampipe query

然后像操作 psql 一样输入 SQL:

> select * from hackernews_new limit 10

交互式控制台(实现在 pkg/interactive/ 下)不只是简单的 SQL 输入器,还内置了一组元命令(metaquery)。所有元命令常量集中在 pkg/constants/metaquery_commands.go:

元命令作用
.tables列出所有表
.inspect检查某个插件/表的 schema 与描述
.output设置输出模式
.timing切换查询计时
.header切换列头输出
.separator设置列分隔符(CSV 输出时生效)
.cache/.cache_ttl缓存控制与设置缓存 TTL
.search_path/.search_path_prefix查看/设置 search path 及其前缀
.multi切换多行查询模式
.connections列出所有连接
.clear清空控制台
.autocomplete启用/禁用自动补全
.exit/.quit退出控制台
.help列出所有元命令

其中.inspect是 README 中用于验证插件安装的推荐方式,源码实现位于 pkg/interactive/metaquery/handler_inspect.go(旧实现为 handler_inspect_legacy.go)。

单次批处理查询

把 SQL 作为参数传入,立即执行并退出,适合脚本与 CI/CD:

steampipe query "select * from cloud"

query命令(定义见 cmd/query.go)支持的常用 flag 包括:

  • --output table|csv|json|line:输出格式;
  • --header:是否包含列头(CSV/表格输出);
  • --separator:CSV 输出分隔符,默认,;
  • --timing:显示查询耗时(取值为 on/off,源码中默认QueryTimingModeOff);
  • --search-path/--search-path-prefix:为查询会话设置自定义 search_path 或前缀(逗号分隔);
  • --input:是否启用交互提示;
  • --export:导出输出到文件(当前支持sps快照格式);
  • --snapshot/--share:在 Turbot Pipes 中创建快照(默认工作区可见 / 任何人可链接可见);
  • --snapshot-title、--snapshot-tag、--snapshot-location:快照标题、标签与写入位置;
  • --database-query-timeout:查询超时;
  • --progress:快照上传进度显示。

开发环境下的首次查询示例

README 的 Developing 章节给出了一套面向仓库开发者/构建者的验证流程,对普通用户同样有参考价值:

# 检查版本 steampipe --version # 安装插件 steampipe plugin install steampipe # 进入交互式控制台并检查插件 steampipe query > .inspect steampipe +-----------------------------------+-----------------------------------+ | TABLE | DESCRIPTION | +-----------------------------------+-----------------------------------+ | steampipe_registry_plugin | Steampipe Registry Plugins | | steampipe_registry_plugin_version | Steampipe Registry Plugin Version | +-----------------------------------+-----------------------------------+ > select * from steampipe_registry_plugin;

这个steampipe自描述插件让你能直接查询 Steampipe 自身的注册表元数据,是验证"插件→表→SQL"整条链路是否打通的最快路径。

search path:表解析的基石

查询能命中哪张表,取决于 Postgres 的 search path 机制。Steampipe 对此做了精细管理:

  • 每个连接(connection)对应一个 schema,schema 名通常等于连接名;
  • 内置 schemainternal存放steampipe_*等内部表,始终追加在 search path 末尾(EnsureInternalSchemaSuffix,见 pkg/db/db_common/search_path.go);
  • 用户可通过--search-path、--search-path-prefix或交互控制台中的.search_path、.search_path_prefix元命令定制解析顺序;AddSearchPathPrefix会把前缀置于现有 search path 之前并去重(见 pkg/db/db_common/search_path.go);
  • Steampipe 用户(steampiperole)的 search path 持久化在pg_db_role_setting中,源码通过查询rs.setconfig读取(见 pkg/db/db_common/search_path.go)。

实际使用中,若安装了多个插件且表名存在歧义,用schema.table全限定名查询是最稳妥的方式,例如aws_s3_bucket插件的表通常是aws.aws_s3_bucket。

服务模式:作为数据库端点接入任意 Postgres 客户端

启动 / 状态 / 停止

service子命令将 Steampipe 作为常驻本地服务运行,对外暴露一个 Postgres 兼容端点,让任意数据库客户端(psql、DBeaver、Tableau 等)都能接入(见 cmd/service.go):

steampipe service start steampipe service status steampipe service stop steampipe service restart

service start的关键参数(见 cmd/service.go):

  • --database-port:数据库服务端口,默认DatabaseDefaultPort(9193);
  • --database-listen-addresses:监听地址。默认是network(等价*),也可用local(仅 localhost)或逗号分隔的主机/IP 列表;
  • --service-password:为本次会话设置数据库密码;
  • --service-show-password:查看用于从其他机器连接的数据库密码;
  • --foreground:前台运行(默认后台)。

service status额外支持--all与--service-show-password;service stop支持--force强制关闭所有服务并释放端口与连接(见 cmd/service.go)。

启动服务后,可用任意 Postgres 客户端连接(默认数据库名steampipe、用户steampipe),并照常执行select * from aws_s3_bucket这类查询。值得说明的是:steampipe query本身也是以服务方式启动数据库的——源码中service start的隐藏参数--invoker取值有service与query两种(见 cmd/service.go),这解释了为什么首次运行steampipe query时也会经历数据库安装/启动过程。

嵌入式 PostgreSQL 的自动管理

服务模式不需要用户预先安装数据库。EnsureDBInstalled(见 pkg/db/db_local/install.go)会在数据库缺失时自动downloadAndInstallDbFiles,并在升级时通过prepareBackup处理数据备份(若备份失败则输出警告而非中断,见noBackupWarning)。这正是"Single binary"承诺的技术支撑:数据库引擎、插件运行时与 CLI 都由 Steampipe 统一管理。

从源码构建与参与开发

README 的 Developing 部分说明了如何从源码构建 Steampipe 二进制:

git clone git@github.com:turbot/steampipe cd steampipe make

构建产物默认落在/usr/local/bin/steampipe,可通过OUTPUT_DIR指定其他目录。仓库根目录的 Makefile 是构建入口,CONTRIBUTING.md 提供了贡献规范,CLAUDE.md 记录了协作约定;版本信息(version/commit/date/builtBy)由 GoReleaser 注入,未注入时使用 pkg/constants/runtime/runtime_constants.go 中的默认值,并通过 viper 暴露(见 main.go)。

关于插件开发,README 指向了面向插件开发者的文档;在本仓库中,插件的连接配置解析、依赖路径与校验逻辑可参考 pkg/steampipeconfig/ 目录(含 load_config.go 等),插件管理器的 gRPC 协议定义位于 pkg/pluginmanager_service/grpc/proto/plugin_manager.proto。

常见问题排查思路

  • 表查不到 / 查询报 relation not exists:优先检查插件的连接 schema 是否在 search path 中,用steampipe query中的.search_path查看,或使用全限定名connection.table。
  • 插件安装后无配置文件:plugin install默认生成.spc配置文件,若使用--skip-config跳过,则需手工在~/.steampipe/config/编写连接配置(格式示例可参考 pkg/steampipeconfig/testdata/connection_config/ 下的测试配置)。
  • plugin list显示 failed:JSON 输出中的failed段会给出失败原因(reason)与受影响连接,通常是凭据缺失或连接配置错误。
  • 端口被占用:service stop --force强制释放所有端口与连接后重试。

生态与分发形态

README 指出 Steampipe 技术被包装成多种分发形态,服务于不同场景:

  • Steampipe CLI:本仓库的主体,内置 Postgres,将 API 翻译为表供本地查询;
  • Steampipe Postgres FDWs:以原生 Postgres Foreign Data Wrapper 形式把 API 翻译为外部表,适用于已有 Postgres 集群的场景;
  • Steampipe SQLite extensions:以 SQLite 扩展形式把 API 翻译为虚拟表;
  • Steampipe export tools:独立的导出二进制,直接导出 API 数据,连数据库都不需要;
  • Turbot Pipes:云托管形态,让团队在云端共同使用 Steampipe。

这些分发形态共享同一套"插件即表"的核心抽象:插件定义表结构(columns)、连接配置(config)与查询实现(list/get),上层分发层决定把它们暴露为 Postgres 外部表、SQLite 虚拟表还是独立导出命令。

许可证与参与社区

  • 许可证:本仓库以AGPL 3.0发布(见 LICENSE),贡献者需在首个 Pull Request 中签署 Contributor License Agreement;
  • 社区:官方维护 CHANGELOG.md 记录版本演进,README 底部引导加入社区 Slack 参与讨论。

结语

从select * from cloud;这句口号出发,Steampipe 用"插件把 API 翻译成表、SQL 作为统一查询语言、内嵌 Postgres 作为执行引擎"的架构,真正实现了零 ETL 的实时数据查询。本文从安装、插件管理、交互式/批处理查询、search path 到服务模式与源码级实现原理,完整覆盖了 README 的核心内容并做了深度延伸。下一步,安装 Steampipe、装一个你常用的云插件,然后在交互控制台输入你的第一条select * from ...,就能切身感受"把云当作数据库"的开发体验。

  • 开发工具
  • 云原生

【免费下载链接】steampipe

Zero-ETL, infinite possibilities. Live query APIs, code & more with SQL. No DB required.

项目地址:https://gitcode.com/gh_mirrors/st/steampipe
点击查看免费下载
上一篇:mold 项目内置内存分配器 mimalloc 版本发布与选型实战指南
下一篇:Apache Airflow Spark Connect 连接配置指南:sc:// 协议、认证参数与安全实践

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询