Steampipe ~curl | jq がツラいあなたに~


 

これはTOWN Advent Calendar 2023の17日目のエントリーです。

昨日は山口さんによるアツいヲタ活レポでした。

 

本日は私KomiがSteampieというツールの紹介をいたします。

なお個人の興味によるもので、組織としての見解や特定のサービスなどの推薦を表すものではありません。

 

公式サイト:https://steampipe.io/

GitHub:https://github.com/turbot/steampipe

 

今年登場したツールでもなく、GitHub上に公開されている最初のリリースは2021年1月の v0.0.15です。

おなじみThoughtworksによるRadarにも2023年4月版に"Trial"として初掲載されました。

https://www.thoughtworks.com/content/dam/thoughtworks/documents/radar/2023/04/tr_technology_radar_vol_28_en.pdf#page=27

 

概要

例を見ていただくのが早いでしょう。

AWSプラグインを用いてRDSのインスタンスクラスとエンジン、エンジンバージョンの一覧を出力します。

(Jimdoでターミナル出力の表示が崩れるのでスクショ画像です && 過去のデータです)

 

用いたクエリは以下の内容です(同じくスクショ画像)。

 

Steampipeは様々なAPIにアクセスして結果を出力します。

実行する処理のnotationにSQLを用いているのが特徴です。

クラウドサービスなど様々なAPIレスポンスに対するO/RマッパーとSQLクライアントのセットのような機能を提供します。

 

用いるAPIアクセスはread only権限で済むので権限付与の面でも安全性の面でも利用開始しやすいのが良いです。

インストール方法

公式資料:https://steampipe.io/downloads?install=linux

 

Linuxであればワンライナーコマンドで導入できます。

 

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

 

/usr/local/bin/steampipe としてインストールされます。

 

設定と使い方

利用は一般ユーザー権限で大丈夫です。むしろ一般ユーザー権限での理由をオススメします。

 

~/.steampipe 以下に様々なファイルが生成されますが、内部的にクエリ結果のキャッシュにpostgresqlが用いられています。

/root/.steampipe のpostgresqlがroot権限で動くというのは大変良くないと思われます。

 

まずは公式のチュートリアルに従ってみましょう。

 

プラグイン"steampipe"をインストールします

 

$ steampipe plugin install steampipe

 

クエリを投げてみます

 

$ steampipe query "select name from steampipe_registry_plugin;"

 

プラグインの一覧が表示されます。

 

AWSに関する情報をクエリするにはプラグインAWSをインストールします。

 

$ steampipe plugin install aws

 

AWSの認証情報を設定します。awscliで用いる ~/.aws/credentialとconfigと同様の内容を設定します。

 

~/.steampipe/config/aws.spc に以下のような内容を登録します。

 

connection "aws_app_all" {

  plugin      = "aws"

  type        = "aggregator"

  connections = ["app1", "app2"]

}

 

connection "app1" {

  plugin  = "aws"

  profile = "app1"

  regions = ["*"]

}

 

 

connection "app2" {

  plugin  = "aws"

  profile = "app2"

  regions = ["*"]

}

 

プロファイルapp1, app2の認証キー情報は環境変数を直接コマンドに渡したり、~/.aws/credentialを読み込んだり、direnvを用いたり普段お使いの方法で読み込ませてください。

便利なのは複数のプロファイルをまたいでjoinというかcatしたクエリ結果を得られる点です。この場合、例の最初に書いた aws_app_all のように集約プロファイルとして type = "aggregator" を指定しconnectionsに使用するconnectionを列挙します。

 

conectionやaggregatorの名前はSQLクエリの中で接頭辞として指定します。

冒頭のRDSの例では  aws_all.aws_rds_db_instnce; とaws_all という接頭辞でaggregatorを指定していました。

  

クエリをテキストファイルに保存し、

$ steampipe query sql.txt

で実行できます。

$ steampipe query

 

でインタラクティブにも実行できますが、最初にテーブル構造を探るとき以外は繰り返し実行しやすい点でもクエリはファイルから読み込ませた方が運用しやすいでしょう。

 

インタラクティブモードが終了できなくなったという方は

.quit または .exit

で終了できますよ。

使用例

SRE系Slackからリンクを辿ってお越しのみなさまこんにちは。

AWS Security HubのFindingsを良い感じに見るというお題をいただいていました。

まさにそれ用のテーブル定義がプラグインAWSに含まれています。

https://hub.steampipe.io/plugins/turbot/aws/tables/aws_securityhub_finding_aggregator

 

結果が伏せ字だらけになるのでお見せしにくいんですよね。。。

各位実際にお試しいただければ幸いです。

 

リソースのIDではなく名前を出す場合はSQLが複雑になりがちです。

例えばEC2インスタンスIDと関連付けされているセキュリティグループの名前を出す場合は以下のようなSQLになります。

セキュリティグループやタグなどエントリ要素が複数あるものは全体をJSONB型で扱います。

私はSQL技量弱々ですがコピペ技量で行けました。

 

select

  instance_id,

  sg ->> 'GroupName' as security_group

from

  aws_ec2_instance

  cross join jsonb_array_elements(security_groups) as sg;

 

他のプラグインの例も見てみましょう。

 

(例) crt.shプラグインを用いて証明書のCTログを検索する

その他の機能

Steampipeにはmodという物があります。こちらはクエリだけでなくダッシュボードやポリシーチェックといった機能を含んだ詰め合わせです。

 

git cloneで導入できます。

 

$ git clone https://github.com/turbot/steampipe-mod-aws-insights.git

$ git clone https://github.com/turbot/steampipe-mod-aws-thrifty.git

 

AWSの便利な例を示していきます。プラグインAWSをインストール、設定した上でそれぞれのmodをcloneしたディレクトリに移動して実行します。

 

(例1)Cost explorerのように簡易的にサービスごとの費用を先月と比較する

 

$ steampipe check aws_thrifty.control.full_month_cost_changes

 

+ What services have changed in cost over last two months? ............................................................... 2 / 21 [==========]

  |

  ALARM: EC2 - Other usage has increased by 10.00 USD .................................................................... global 26000000xxxx

~~略~~

 

(例2)関連付けの無い空きEIPをチェックする

 

$ steampipe check aws_thrifty.control.unattached_eips

 

+ Unattached elastic IP addresses (EIPs) should be released ................................................................................. 0 / 10 [==========]

  |

  OK   : 203.0.113.2/32 associated with 172.30.1.2/32. ............................................................................ ap-northeast-1 261306824626

 

~~略~~

OK .............................................................................................................................................. 10 [==========]

SKIP ............................................................................................................................................. 0 [          ]

INFO ............................................................................................................................................. 0 [          ]

ALARM ............................................................................................................................................ 0 [          ]

ERROR ............................................................................................................................................ 0 [          ]

 

TOTAL ....................................................................................................................................... 0 / 10 [==========]

 

(例3)簡易ダッシュボード

 

$ cd steampipe-mod-aws-insights

$ steampipe dashboard

(デフォルトブラウザが起動し、レポートサマリが表示されます)

 

他にも steampipe-mod-aws-compliance にはPCIDSS ベンチマークのcheckが用意されていたりと機能盛りだくさんです。


注意事項

非常に多機能で便利なSteampipeですが、運用上注意する点もあるので以下にあげておきます。

(1)アップデートは慎重に

アップデートすると設定に矛盾が生じ起動に失敗するようになる事態がごくごく稀によく発生します。

起動時のスプラッシュ画面にSteampipe本体やプラグインのアップデートの有無が表示されるので誘惑されますが

できれば環境を2つ用意して Blue/Green 的に片方でいまくいってからもう片方もアップデートするようにしましょう。

起動に失敗するようになった際のリカバリはけっこう大変です。けっこう。それはもう

 

(2)記号(-や.)に注意

AWSのプロファイルごとにconnectorに名前を付けて使用します。

connector名はSQLの接頭辞に用います。このためSQLの処理やSteampipeの仕様などでいくつか制限があります。

 

まずconnector名は小文字で処理されます。このためconnector名に大文字を含んでいると該当するconnectorが見つからずエラーになります。

またハイフンも使えません。アンダースコアに変換するなどしてください。

さらにドット.も使えません。テーブル接頭辞などと区別がつかなくなるのでやむを得ません。

既存の ~/.aws/config から変換して ~/.steampipe/config/aws.spc を生成する場合などはうまく変換処理を挟んで下さい。

 

(3)権限に注意

Read権限のみでよいのですが、情報を追加する場合にはIAM権限の確認が必要です。

例えば複数のプロファイルのaggregatorを用いてEC2の情報をクエリする際に、AWSアカウントIDの数字を表示しても分かりにくいのでアカウントエイリアス名を表示したくなります。この場合はクエリの最後に

 

  awsac.account_aliases

from

  aws_all.aws_ec2_instance as ec2instance

  join aws_all.aws_account as awsac on ec2instance.account_id = awsac.account_id

 

このようなSQL文を追加することでアカウントエイリアス名をjoisできます。

しかしこの場合はEC2関連へのアクセス権だけでなくアカウント情報へのアクセス権が必要になります。

 

Error: operation error IAM: ListAccountAliases, https response error StatusCode: 403, RequestID: abcdefgh-0000-0000-0000-0000000, api error AccessDenied: User: arn:aws:iam::0000000000:user/SAMPLE is not authorized to perform: iam:ListAccountAliases on resource: * because no identity-based policy allows the iam:ListAccountAliases action (SQLSTATE HV000)

 

のようなエラーになる場合は、エラーメッセージの通り iam:ListAccountAliases の権限を追加しましょう。

 

最後に

 

Steampipeは明確なプラグイン構造を採用しています。

本体のアップデートと各プラグインのアップデートは分離されています。機能追加の頻繁なクラウドサービス用のプラグインやmodも活発な開発が行われているのはこの分離構造が開発体制や責任分解点にもうまくはたらいていることの現れであると思います。(アップデートには注意が必要ですけどねっ)

 

クラウドサービスのAPIにクエリして結果をjqで整形して...ということをされている方も多いかと思います。

ちょっとだけ違うjq処理をいくつも保存しているいう方は代替案として便利に使えるかもしれません。

 

 

機会があれば関連トピックとして

・危険execプラグイン芸

・Steampipeと同じくTurbot HQが12月14日にリリースしたCLIワークフローflowpipe

のあたりについてまた書いてみたいと思います。

 

TOWN Advent Calendar 2023 明日は粂井さんによる危険さいたまトークです。


本当の最後に

We are hiring!