Skip to main content
  1. Blog/

[Steampipe] SELECT * FROM cloud ;

·513 words·3 mins

Introduction #

因應工作需求,使用到 GCP 以及 AWS 服務,
又因為 DR 的關係,GCP 跟 AWS 之間有建置 Site-to-Site VPN
GCP 的網路環境是使用 Shared VPC ( XPN ),然後在 2 個不同的 Project;
AWS 的網路環境是使用 Resource Access Manager ( RAM ) 分享,獨立在 1 個 Account

最近開始安排了建置 DR 相關的 RDS 任務,
所以事前要檢查一下網路相關的配置時,
發現 超級麻煩

我需要先確認 GCP 的 GCE Project 使用了哪些 XPN,
再到這些 GCE 所使用的 XPN 檢查 Cloud VPN tunnels 的配置,
確認跟 AWS site 的串接是否正確,
還要確認是否有正確宣告 BGP 給 AWS,
最後檢查
GCP 的 FW 設定,
有沒有開放 AWS 的網段,
AWS 的 SG 設定,
有沒有開放 GCP 的網段

感覺也還好呀,
如果只需要確認一次的話我也覺得還好呀 !
但我們有 24 個 GCP Project,
每個 VPN 有 2 條 VPN tunnel,
VPN 是 HA VPN,所以再 * 2

又因為公司 MacBook 是 19 年的古董機,
每次看到 GCP 的頁面一直轉圈圈,
多開了三四五六個視窗,Safari 一言不合就閃退,
雖然使用 gcloudaws 也很方便,但部分指令不太熟又需要一直爬 Doc

這時,剛好看到一個 Tooling,
主打使用 SQL 動態查詢 Cloud 的資源,
身為一個 DBA,看到 SQL 語法倍感親切,
今天,我們就來介紹這 Tooling - Steampipe

What’s Steampipe #

steampipe-website

Steampipe 是一個主打 Zero-ETL 的工具,
會協助我們直接通過 API 或服務來取得資料,
讓我們使用 PostgreSQL 介面查詢資料

先來張官方的架構圖

steampipe-arch

實現方式是採用 PostgreSQL 的 Foreign-Data Wrapper 功能

How to Install Steampipe #

  1. 首先,MacBook 可以直接使用 Homebrew 來安裝 steampipe
brew install turbot/tap/steampipe

其餘系統的安裝方式請參考 Steampipe 官方文件

  1. 確認版本資訊
steampipe -v

# 安裝成功後會顯示版本資訊
Steampipe v2.1.0

Install the plugin #

Steampipe 需要額外安裝不同 plugin 來支援各種 vender,
這邊以 AWS 跟 GCP 為例

  • 安裝 AWS plugin
steampipe plugin install aws
  • 安裝 GCP plugin
steampipe plugin install gcp

Steampipe 預設會使用 Default 的 AWS Credentials 跟 GCP 的 Application Default Credentials,
但就如同上述提過的,我們 GCP 的網路環境使用了 2 個不同 Project 的 XPN,
所以我有新增額外的連線來讓我方便一次撈取不同 Project 的資訊

Steampipe 的相關設定檔放在 ${HOME}/.steampipe 底下,
所以我們可以從這邊來新增額外的連線資訊

  • GCP 新增連線資訊
nvim ${HOME}/.steampipe/config/gcp.spc

# 在最下面新增
connection "Schema 名稱" {
  plugin  = "gcp"
  project = "Project ID"
}

以我的例子來說,設定後的內容如下

steampipe-gcp-config
命名規則就只是單純的粗暴簡單,GCP 第 1 個跟第 2 個 😂

AWS 的部分倒是沒有特別設定,只有修改 regions 的部分

nvim ${HOME}/.steampipe/config/aws.spc

# 因為我們有多區域,所以在 regions 的部分新增多區域
connection "aws" {
  plugin = "aws"
  regions = ["ap-northeast-1", "ap-southeast-1"]
}

Usage #

配置好之後就可以快樂的 SQL 囉 🤗

steampipe query --output line

撈取 AWS 跟 GCP Site-to-Site VPN 的配置 #

SELECT
    v.account_id AS "AWS Account gateway",
    v.title AS "AWS VPN Name",
    i->>'OutsideIpAddress' AS "Peer IP" ,
    g.project AS "GCP Project" ,
    g.name AS "GCP Router Name"
FROM
    aws_vpc_vpn_connection AS v ,
    LATERAL JSONB_ARRAY_ELEMENTS(options->'TunnelOptions') AS i
    JOIN gcp_compute_vpn_tunnel AS g ON
    ( i->>'OutsideIpAddress' = ABBREV(g.peer_ip) )
ORDER BY
    1 , 2
  • Result

steampipe-query-vpn

撈取 GCP FW Allow AWS Subnet 的配置 #

WITH g AS (
    SELECT
        g.name ,
        SPLIT_PART(g.network, '/', -1) AS vpc ,
        g.source_ranges ,
        g.target_tags
    FROM
        g1.gcp_compute_firewall AS g
    WHERE
        g.allowed->0->'ports' ?| ARRAY['3306']
    UNION ALL
    SELECT
        g.name ,
        SPLIT_PART(g.network, '/', -1) AS vpc ,
        g.source_ranges ,
        g.target_tags
    FROM
        g2.gcp_compute_firewall AS g
    WHERE
        g.allowed->0->'ports' ?| ARRAY['3306']
)
SELECT
    g.name ,
    g.vpc ,
    g.source_ranges ,
    g.target_tags
FROM
    g
WHERE
    g.source_ranges ?| (
        SELECT
            ARRAY_AGG(TEXT(a.cidr_block))
        FROM
            aws.aws_vpc_subnet AS a
        WHERE
            a.title LIKE '%private%'
        )
  • Result
    steampipe-query-fw

Summary #

說來慚愧,雖然是多年的 DBA,
不過大多以 MySQL 為主,
遇到 PostgreSQL 時,
雖然 SQL 大多大同小異,
JSON 以及 INET 的處理時,
還是需要翻一下官方 Doc 找用法 😅

不過 Steampipe 對於 SRE 來說,
真的帶來許多的便利性,
畢竟 SQL 可以說是世界共通的語言之一,
你可以不懂不同 Vender 的 API,
但你一定懂 SQL

就如同 Steampipe 提到的,

It should feel simple, intuitive, and familiar

它需要讓人覺得簡單、直覺以及友善
SQL 正好就是一個這麼讓人陶醉的實現


Reference #