はじめに
下記記事で、steampipeを使うことで、AWS環境のリソース情報をダッシュボード化することができると知ったので、その検証をやっていきます。
下記の記事は、3年前の記事の為、導入手順が異なりますので、注意が必要です。
Steampipeとは?
Steampipe は、AWS をはじめとしたクラウド環境の情報を SQL を使って見える化できる オープンソースツールです。
通常、AWS のリソース状況を知る際は、マネジメントコンソール や AWS CLI を使って、必要な情報をその都度取りいくことなるのですが、Steampipe を使用することで、SQL クエリを実行するだけで欲しい情報を一括で取得・分析 できます。
また、Powerpipe と組み合わせることで、SQL で集めたデータを ダッシュボード形式で可視化 することもできるようになります。このページでは、その具体的な方法を紹介します。
※元記事では、ダッシュボード生成もSteampipeコマンドで生成できていたが、現時点ではPowerpipeに移行している。
前提条件
- 実行環境は、AWS 環境内の VPC 上に立てた EC2 サーバで実行するものとする
- サーバの OS 情報は以下のとおり
[root@ip-10-192-0-236 ~]# cat /etc/amazon-linux-release
Amazon Linux release 2023.8.20250818 (Amazon Linux)
- 当該サーバには、ReadOnlyAccess ポリシーをアタッチした IAM ロール を割り当て済み
実行手順
(1)steampipe環境のセットアップ
1. ec2-userに切り替える
※steampipeは、rootユーザでの実行はサポートされていないので、必ず一般ユーザで実行する必要がある。今回はec2-userで実行する。
[root@ip-10-192-0-236 ~]# su - ec2-user
2. steampipeのインストール
[ec2-user@ip-10-192-0-236 ~]$ sudo /bin/sh -c "$(curl -fsSL https://steampipe.io/install/steampipe.sh)"
3. steampipeのバージョン確認
[ec2-user@ip-10-192-0-236 ~]$ steampipe -v
Steampipe v2.1.0
4. AWS用のプラグインをインストール
[ec2-user@ip-10-192-0-236 ~]$ steampipe plugin install steampipe aws
steampipe                      [====================================================================] Done
aws                            [====================================================================] Done
Installed plugin: aws@latest v1.23.0
Documentation:    https://hub.steampipe.io/plugins/turbot/aws
Installed plugin: steampipe@latest v1.0.0
Documentation:    https://hub.steampipe.io/plugins/turbot/steampipe
5. steampipeの定義ファイルを修正する。
デフォルトの設定では、バージニア北部の情報しかとってこない設定になっているので、「東京」「バージニア北部」に書き換える
connection "aws" {
  plugin  = "aws"
  regions = ["us-east-1"]
}
↓下記に変更
connection "aws_Multi_region" {
  plugin  = "aws"
  regions = ["ap-northeast-1", "us-east-1"]
}
6. クエリの実行
「steampipe query」で、対話モード (インタラクティブモード)に切り替え、そこでクエリを実行してます。
例として、VPC環境の情報をクエリした結果を記載します。※私の環境なので、一部マスクして表示してます。
[ec2-user@ip-10-192-0-236 ~]$ steampipe query
Welcome to Steampipe v2.1.0
For more information, type .help
> select
  tags ->> 'Name' as name,
  region,
  vpc_id,
  cidr_block,
  dhcp_options_id,
  is_default
from
  aws_vpc ;
+-----------------------------+----------------+-----------------------+------------------+------------------------+------------+
| name                        | region         | vpc_id                | cidr_block       | dhcp_options_id        | is_default |
+-----------------------------+----------------+-----------------------+------------------+------------------------+------------+
| test-dev-vpc                | ap-northeast-1 | vpc-0XXXXXXXXXXXXXXXX | 10.0.0.0/16      | dopt-0XXXXXXXXXXXXXXXX | false      |
| VPC-3                       | ap-northeast-1 | vpc-0XXXXXXXXXXXXXXXX | 10.3.0.0/16      | dopt-0XXXXXXXXXXXXXXXX | false      |
| VPC-hub                     | ap-northeast-1 | vpc-0XXXXXXXXXXXXXXXX | 10.10.0.0/16     | dopt-0XXXXXXXXXXXXXXXX | false      |
| TESTvpc                     | ap-northeast-1 | vpc-0XXXXXXXXXXXXXXXX | 10.2.0.0/21      | dopt-0XXXXXXXXXXXXXXXX | false      |
| <null>                      | ap-northeast-1 | vpc-0XXXXXXXXXXXXXXXX | 172.31.0.0/16    | dopt-0XXXXXXXXXXXXXXXX | true       |
| VPC-4                       | ap-northeast-1 | vpc-0XXXXXXXXXXXXXXXX | 10.3.0.0/16      | dopt-0XXXXXXXXXXXXXXXX | false      |
| test-sbx-vpc                | ap-northeast-1 | vpc-0XXXXXXXXXXXXXXXX | 10.0.0.0/16      | dopt-0XXXXXXXXXXXXXXXX | false      |
| VPC-2                       | ap-northeast-1 | vpc-0XXXXXXXXXXXXXXXX | 10.2.0.0/16      | dopt-0XXXXXXXXXXXXXXXX | false      |
| test2-VPC                   | ap-northeast-1 | vpc-0XXXXXXXXXXXXXXXX | 192.168.215.0/24 | dopt-0XXXXXXXXXXXXXXXX | false      |
| test-test-vpc               | ap-northeast-1 | vpc-0XXXXXXXXXXXXXXXX | 10.0.0.0/16      | dopt-0XXXXXXXXXXXXXXXX | false      |
| test-network-vpc            | ap-northeast-1 | vpc-0XXXXXXXXXXXXXXXX | 10.1.0.0/16      | dopt-0XXXXXXXXXXXXXXXX | false      |
| test-dev-VPC                | ap-northeast-1 | vpc-0XXXXXXXXXXXXXXXX | 10.192.0.0/16    | dopt-0XXXXXXXXXXXXXXXX | false      |
| VPC-1                       | ap-northeast-1 | vpc-0XXXXXXXXXXXXXXXX | 10.1.0.0/16      | dopt-0XXXXXXXXXXXXXXXX | false      |
| <null>                      | us-east-1      | vpc-0XXXXXXXXXXXXXXXX | 172.31.0.0/16    | dopt-0XXXXXXXXXXXXXXXX | true       |
+-----------------------------+----------------+-----------------------+------------------+------------------------+------------+
上記のクエリは、「aws_vpc」というテーブルから情報をとってきてます。
指定できるテーブルの一覧は、下記コマンドで確認できます。
> .tables
各テーブル内のカラム情報は、「 .inspect テーブル名」で確認できます。(下記に、例として、VPC用のテーブルに対して、クエリした結果をのせときます)
> .inspect aws_vpc
+---------------------------------+---------+----------------------------------------------------------------------------------+
| column                          | type    | description                                                                      |
+---------------------------------+---------+----------------------------------------------------------------------------------+
| _ctx                            | jsonb   | Steampipe context in JSON form.                                                  |
| account_id                      | text    | The AWS Account ID in which the resource is located.                             |
| akas                            | jsonb   | Array of globally unique identifier strings (also known as) for the resource.    |
| arn                             | text    | The Amazon Resource Name (ARN) specifying the vpc.                               |
| cidr_block                      | cidr    | The primary IPv4 CIDR block for the VPC.                                         |
| cidr_block_association_set      | jsonb   | Information about the IPv4 CIDR blocks associated with the VPC.                  |
| dhcp_options_id                 | text    | Contains the ID of the set of DHCP options, associated with the VPC.             |
| instance_tenancy                | text    | The allowed tenancy of instances launched into the VPC.                          |
| ipv6_cidr_block_association_set | jsonb   | Information about the IPv6 CIDR blocks associated with the VPC.                  |
| is_default                      | boolean | Indicates whether the VPC is the default VPC.                                    |
| owner_id                        | text    | Contains ID of the AWS account that owns the VPC.                                |
| partition                       | text    | The AWS partition in which the resource is located (aws, aws-cn, or aws-us-gov). |
| region                          | text    | The AWS Region in which the resource is located.                                 |
| sp_connection_name              | text    | Steampipe connection name.                                                       |
| sp_ctx                          | jsonb   | Steampipe context in JSON form.                                                  |
| state                           | text    | Contains the current state of the VPC.                                           |
| tags                            | jsonb   | A map of tags for the resource.                                                  |
| tags_src                        | jsonb   | A list of tags that are attached with the VPC.                                   |
| title                           | text    | Title of the resource.                                                           |
| vpc_id                          | text    | The ID of the VPC.                                                               |
+---------------------------------+---------+----------------------------------------------------------------------------------+
上記で、steampipeのクエリ結果のイメージが湧いたところで、次章ではそのデータを使ってWEBダッシュボード化していきます。
ちなみに、steampipeのインタラクティブモードは、Ctrl + Dで抜けられます。
(2)クエリの検索結果のダッシュボード
1. powerpipeのインストール
steampipeのクエリ結果をダッシュボード化するには、「powerpipe」が必要になるので、そのインストールをおこないます。
[ec2-user@ip-10-192-0-236 ~]$ curl -sSL https://powerpipe.io/install/powerpipe.sh | sudo bash
2. powerpipeのバージョン確認
[ec2-user@ip-10-192-0-236 ~]$ powerpipe --version
Powerpipe v1.3.1
3. ダッシュボード用のワークフォルダを作成し、移動
[ec2-user@ip-10-192-0-236 ~]$ mkdir work1 && cd work1 && pwd
/home/ec2-user/work1
4. カレントディレクトリで初期化を実施
初期化をすることで、mod.ppファイルというPowerpipe モジュールの設定ファイルが生成される。
[ec2-user@ip-10-192-0-236 work1]$ powerpipe mod init
Created mod definition file '/home/ec2-user/work1/mod.pp'
[ec2-user@ip-10-192-0-236 work1]$ ls -la
total 4
drwxr-xr-x. 2 ec2-user ec2-user  20 Sep  5 05:38 .
drwx------. 7 ec2-user ec2-user 153 Sep  5 05:38 ..
-rw-r--r--. 1 ec2-user ec2-user  34 Sep  5 05:38 mod.pp
5. ダッシュボード設定を定義
「aws_vpc_dashboard.sp」ファイルを作成し、そこでVPCの関連情報を定義してみました。
dashboard "aws_network_overview" {
  title = "AWS Network Overview"
  # --- VPC ---
  container {
    width = 12
    table {
      title = "VPC"
      sql = <<-EOQ
        select
          tags ->> 'Name' as name,
          region,
          vpc_id,
          cidr_block,
          dhcp_options_id,
          is_default
        from
          aws_vpc ;
      EOQ
    }
  }
  # --- Subnets ---
  container {
    width = 12
    table {
      title = "Subnets"
      sql = <<-EOQ
        select
          tags ->> 'Name' as name,
          availability_zone,
          subnet_id,
          cidr_block,
          vpc_id,
          available_ip_address_count,
          region
        from
          aws_vpc_subnet
        order by
          region,
          vpc_id;
      EOQ
    }
  }
  # --- Route Tables ---
  container {
    width = 12
    table {
      title = "Route Tables"
      sql = <<-EOQ
        select
          coalesce(rtt.tags ->> 'Name', rtt.title, rtt.route_table_id, 'NONE') as name_tag,
          rtt.vpc_id,
          rtt.route_table_id,
          coalesce(
            (r.destination_cidr_block)::text,
            (r.destination_ipv6_cidr_block)::text,
            (r.destination_prefix_list_id)::text,
            'NONE'
          ) as network_range,
          coalesce(
            r.gateway_id,
            r.nat_gateway_id,
            r.transit_gateway_id,
            r.vpc_peering_connection_id,
            r.egress_only_internet_gateway_id,
            r.instance_id,
            r.network_interface_id,
            'NONE'
          ) as target,
          coalesce(
            (
              select string_agg(distinct (assoc ->> 'SubnetId'), ',')
              from jsonb_array_elements(rtt.associations) as assoc
              where assoc ? 'SubnetId' and (assoc ->> 'SubnetId') <> ''
            ),
            'NONE'
          ) as subnets,
          r.region,
          r.origin
        from
          aws_vpc_route_table rtt
        left join
          aws_vpc_route r
        on
          r.route_table_id = rtt.route_table_id
        order by
          r.region,
          name_tag;
      EOQ
    }
  }
}
7. Steampipe をバックエンドモードとして起動
[ec2-user@ip-10-192-0-236 work1]$ steampipe service start
Steampipe service is running:
Database:
  Host(s):            127.0.0.1, ::1, 10.192.0.236
  Port:               9193
  Database:           steampipe
  User:               steampipe
  Password:           ********* [use --show-password to reveal]
  Connection string:  postgres://steampipe@127.0.0.1:9193/steampipe
Managing the Steampipe service:
  # Get status of the service
  steampipe service status
  # View database password for connecting from another machine
  steampipe service status --show-password
  # Restart the service
  steampipe service restart
  # Stop the service
  steampipe service stop
8. Powerpipe の Web UIモードで起動
[ec2-user@ip-10-192-0-236 work1]$ powerpipe server --listen network
[ Wait    ] Starting WorkspaceEvents Server
[ Message ] WorkspaceEvents loaded
[ Ready   ] Dashboard server started on 9033 and listening on network
[ Message ] Visit http://localhost:9033
[ Message ] Press Ctrl+C to exit
[ Message ] Initialization complete
9. 該当のURLにアクセスできる環境からURLをたたく
WEB画面からユーザが定義したSQLの実行結果のAWSリソースを常に確認することができるようになります。これでパラメータシートの管理などをしなくてもよくなりそうで、いいですね。
http://IPaddress:9033
上記は、CSV出力や検索機能などもあって、ほんと便利なので、設定値のWEBポータル化を皆さんも是非試してみてください。
余談
今回、「~/.steampipe/config/aws.spc」で、AWSのクレデンシャル情報を設定していないので、デフォルト動作として、EC2にアタッチされているIAMロール内の権限の範囲内で検索できるようになってます。
ReadOnlyAccessを付与しているので、EC2が所属しているAWSアカウント内にある情報をとってきているということです。
steampipeの定義ファイルで他AWSアカウントの認証情報を設定すれば、その情報をとってくることができるので、次回はその内容について書いていこうと思います。



