今日はなにの日。

気になったこと勉強になったことのメモ。

今日は、AWS Config マネージドルール一覧のプログラムを作成した話。

目次

とある日

AWS Configのマネージドルールの精査しててルール一覧がなくて困ったので作った話です。

↓できたやつ。(マネージドルールのところだけプログラムで作ってほかは手作業で編集してます)

updraft.hatenadiary.com

経緯

上記で少し話しましたが、ないから作っただけです。

AWS Config マネージドルールのリスト - AWS Config

マネージドルールのドキュメントは下記のように個別に分かれてます。

個別ページ

access-keys-rotated - AWS Config

これはこれで助かるのですが、タイトルに一貫性がないのでEC2関連のやつを調べたいと思っても、タイトルにEC2入っていないものなどあります。

そのため、ルールの概要でキーワード検索したいと思ってもページが個別に分けれているので検索が難しいのです。

(boto3のドキュメントは全部がまとまっているので翻訳するとChromeが固まるので個別のほうが助かる)

なので、キーワード検索しやすいようにマネージドルールの概要がまとまったページがほしいと思ったのが作成した理由です。

作成

ソースコードは下記リポジトリにまとまってます。

air-flow/AWSConfigManagedRules: AWSConfigManagedRules

コードといっても、スクレイピングして整形して出力するだけですが。

スクレイピングとなる基礎の部分は他の方がやられているのを参考にしました。

AWS Config Rulesのマネージドルール一覧と詳細をぶっこ抜くスクリプト書いた | DevelopersIO

上記はExcelでしたが、今回はMarkdown形式です。

↓こんな感じで出力されます。実行結果のファイルもGitHubに上がってます。

### access-keys-rotated

>アクティブなアクセスキーが、maxAccessKeyAge で指定された日数内にローテーションされるかどうかを確認します。アクセスキーが最大日数の maxAccessKeyAge を超えても更新されていない場合、ルールは NON_COMPLIANT です。
>[access-keys-rotated](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/access-keys-rotated.html)

プログラム

かいつまんで少しだけ解説します。

ScrapingAWSDocument()

2回にわたってスクレイピングをしています。

一回目でルール一覧を取得

二回目で個別のルール概要を取得

def ScrapingAWSDocument():
    re_delete_indent = re.compile(r'\n +')
    base_url = "https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/"
    target_url = "https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/managed-rules-by-aws-config.html"
    r = requests.get(target_url)
    r.encoding = 'utf-8'

    soup = BeautifulSoup(r.text, 'lxml')
    link_list = soup.find(id="main-col-body").find_all("li")

    rules = []
    for child in link_list:
        child_url = base_url + child.find('a').get("href")[2:]
        r2 = requests.get(child_url)
        r2.encoding = 'utf-8'
        soup2 = BeautifulSoup(r2.text, 'lxml')
        detail = soup2.find(id="main-col-body").p.text.strip()
        detail = re_delete_indent.sub(' ', detail)
        rules.append(
            {
                'rule_name': soup2.h1.text,
                'rule_detail': detail,
                "url": child_url
            }
        )
    return rules

ConvertMarkdown()

取ってきたルールをMarkdownように変換しているだけです。

見出しレベルとか好みで。

完成図

### access-keys-rotated

>アクティブなアクセスキーが、maxAccessKeyAge で指定された日数内にローテーションされるかどうかを確認します。アクセスキーが最大日数の maxAccessKeyAge を超えても更新されていない場合、ルールは NON_COMPLIANT です。
>[access-keys-rotated](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/access-keys-rotated.html)

ただただ、上記のようにまとめているだけ。

def ConvertMarkdown(rules):
    result = []
    n = "\n"
    s = "#" * 3
    for i in rules:
        text = s + " " + i["rule_name"] + n
        text += n
        text += ">" + i["rule_detail"] + n
        text += ">[" + i["rule_name"] + "](" + i["url"] + ")" + n
        text += n
        result.append(text)
    return result

cd()

便利なので使ってます。

def cd():
    os.chdir(os.path.dirname(__file__))

詳細は下記記事をご覧下さい。

今日は、Pythonでファイル操作するときの助けの日。 - 今日はなにの日。

スクレイピングの大本があったのでさくっと一時間ぐらいで作成はできました。

むしろマネージドルール全部を把握するほうが時間かかりました。