![[小ネタ] Boto3 で取得した AWS情報を素直に Markdownテーブルに表示する Pythonスクリプト](https://devio2023-media.developers.io/wp-content/uploads/2019/04/python.png)
[小ネタ] Boto3 で取得した AWS情報を素直に Markdownテーブルに表示する Pythonスクリプト
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Boto3 で AWSのリソース情報を取得して、 Notebookや Markdownにまとめる記事を書いてきました。
- Jupyter Notebookと Boto3で AWS環境定義書を作成してみる
- 【Pandas】SecurityGroups の情報を Markdownに表示する Pythonスクリプトを書いてみた
各AWSのリソースの種類ごとにテーブルの構造を考えたりしていたので、
もうちょっと汎用的なもの作れないかな と感じたのが今回のモチベーションです。
そこで以下のような入力 → 出力 を行うスクリプトを作ってみました (要 Pandas ≧1.0.0 )。 辞書(or 辞書のリスト) を見出し付きで Markdownテーブルに表示します。

目次
スクリプト
import pandas as pd
def dict_to_md(dc,
title="TOP", depth=1, format="md"):
"""
dict(もしくは list) を 見出し付き Markdownテーブルに変換する
Args:
dc ([type]): 変換対象の (dict, もしくは list)
title (str, optional): トップ見出しのタイトル. Defaults to "TOP".
depth (int, optional): トップ見出しの深さ. Defaults to 1.
format (str, optional): 見出しのフォーマット ("md" もしくは "org") . Defaults to "md".
"""
# format (md or org)
head_str = "*" if format == "org" else "#"
# データ変換
items = []
if type(dc) == dict:
# ### dict は items() へ変換
items = dc.items()
elif type(dc) == list:
# ### list は タプルリストへ変換
items = [("#{}".format(i+1), v) for i, v in enumerate(dc)]
# 表示可能アイテム、表示不可能アイテムに分類
displayable = [(k, v) for k, v in items if type(v) not in [dict, list]]
not_displayable = [(k, v) for k, v in items if type(v) in [dict, list]]
# 見出しを print
print("{} {}".format(head_str * depth, title))
# 表示可能アイテムを print
if displayable:
print(pd.DataFrame(displayable,
columns=["key", "value"]).to_markdown(showindex=False))
# 表示不可能アイテムを parse
for k, v in not_displayable:
dict_to_md(v, title=k, depth=depth+1, format=format)
利用例
以下実行した上で出力例を載せます。
from dict_to_md import dict_to_md import boto3
VPC
ec2_client = boto3.client('ec2')
vpcs = ec2_client.describe_vpcs()['Vpcs']
dict_to_md(vpcs[0], title="VPC", format="md")

また、辞書のリストにも対応しています。 以下のように全てのVPC情報も取得できます。
dict_to_md(vpcs, title="All VPCs", format="org")

※表示は普段私が使っている org-mode シンタックス( * を # と変換するとそのまま Markdown記法、 ... 部分は折りたたみ)
EC2インスタンス
instances = sum([group['Instances'] for group in ec2_client.describe_instances()['Reservations']], []) dict_to_md(instances, title="All EC2 Instances", format="org")

S3バケット
s3_client = boto3.client('s3')
dict_to_md(s3_client.list_buckets()['Buckets'], title="S3 Buckets", format="org")

CloudFront ディストリビューション
cf_client = boto3.client('cloudfront')
dict_to_md(cf_client.list_distributions()['DistributionList']['Items'], title="CloudFront distributions", format="org")

終わりに
boto3のAWS情報取得用に作成しましたが、 list, dict からなるオブジェクトであれば
表示ができるので、他にも利用はできそうです。
改善としては Tags のように同じキー構造の dict しか持たない list について
1つのテーブルに表現することで見出しの深さを抑えられそうです。
この記事が少しでもどなたかのお役に立てば幸いです。








