ちょっと話題の記事

Jupyter Notebookと Boto3で AWS環境定義書を作成してみる

2020.02.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Jupyter Notebook(以降 Notebook) は実行可能なプログラムコードや分析結果、グラフなどを含んだドキュメントを作成するための OSSです。

画像:https://jupyter.org/

Pythonによるデータ分析でよく利用されます。 特徴として 「Markdown セル」と「Code セル」 を Notebook内へ配置できます。

データ分析のプロセスの文脈を Markdownセルに書くことで、 プログラムのコメント以上の表現力で、プロセスを記述できることできます。

データの可視化についても、Notebookは優秀です。 Matplotlib のグラフや、Pandas のテーブルなどを Notebook内にインライン表示してくれます。

さて、Markdownセルによるドキュメンテーション、 pandas によるテーブル表記でふと思いました。 「Jupyter Notebook製 AWS環境定義書」 を作れるんじゃないかと。

さっそくやってみます。

目次

  1. 環境
  2. Jupyter Notebook セットアップ
  3. Notebook 上で Boto3, Pandasを触ってみる
  4. AWS環境定義書(みたいなもの)を作ってみる
    1. HTML出力方法
    2. 最新の環境定義書を 1コマンドで
    3. 見た目を変える
  5. おわりに
  6. 参考

環境

  • OS: macOS Catalina 10.15.3
  • Python: 3.7.3
  • Jupyter Notebook: 6.0.3
  • Boto3: 1.11.9
  • Pandas: 1.0.0

Jupyter Notebook セットアップ

Python, Boto3, Pandasの導入、および Boto3によるAWS情報取得についての手順は割愛します。 また現在では 進化版 Jupyter Notebookインターフェイスである Jupyter Lab が利用できますが、 今回はクラシックな Jupyter Notebook を使用します。

Installing the Jupyter Software どおりに進めます。

今回は pip を使ったインストールで進めます。 pip install notebook で Notebookをインストール後、作業ディレクトリ上で jupyter notebook を実行します。

ブラウザ上に Notebookインターフェイスが立ち上がります。

New >>> Python3 を選択して新規 Notebookを作成します。

こんな感じでコード記述/実行、コメント記述/表示ができます。

キーボードショートカットは Help > Keyboard Shortcuts から確認できます。 インターフェイスの使い方詳細は以下のブログを参照ください。

データ分析を便利にするJupyter notebookとPandas

Notebook 上で Boto3, Pandasを触ってみる

例として AWSの 1リージョンの VPC情報を取得してみます。 VPC情報(Name, VpcId, Cidr, Tenancy, IsDefaultVpc) 一覧を表示してします。

必要なライブラリをインポートして、 VPC情報を取得します。

import boto3
import pandas as pd

ec2_client = boto3.client('ec2')
vpcs = ec2_client.describe_vpcs()['Vpcs']

vpcs[0] を見てみます。

上の赤線の情報を取っていきます。 以下のコードで data に情報を入れます。

data = []
for vpc in vpcs:
    # Name タグの取得
    tags_filter = [t.get('Value') for t in vpc['Tags'] if t.get('Key') == "Name"]
    name = tags_filter[0] if tags_filter else ''
    # Cidr 取得と buffer 格納
    for assoc in vpc['CidrBlockAssociationSet']:
        data.append([
            name,
            vpc['VpcId'],
            assoc['CidrBlock'],
            vpc['InstanceTenancy'],
            vpc['IsDefault']
        ])

これを DataFrameに格納します。

df_vpcs = pd.DataFrame(data,  columns=["Name", "VpcId", "Cidr", "Tenancy", "IsDefault"])

表示できました。Markdownセルと合わせてVPC定義書っぽくなりました。

AWS環境定義書(みたいなもの)を作ってみる

こんな感じで ↓に AWS環境定義書の Notebookを作ってみました。

このNotebookで VPC, Subnet, RouteTable, Route, EC2一覧を出力できます。 (以下は html出力を pdfにしたもの)

HTML出力方法

jupyter nbconvert コマンドを使います。nbconvert はNotebookのエクスポート機能です。 HTML, Markdown, Latexなどに対応しています。

jupyter nbconvert AWSSpec.ipynb --no-input --to html --output awsspec.html

上のコマンドで AWSSpec.ipynb Notebookを HTMLファイル awsspec.html にエクスポートします。 --no-input オプションで入力のコードを省いて出力できます。

最新の環境定義書を 1コマンドで

jupyter nbconvert AWSSpec.ipynb --execute --no-input --to html --output awsspec_now.html

--execute オプションを付けると Notebookを実行した後にエクスポートします。 いつでも最新の環境定義書を 1コマンドで取得できるのは大きなメリットですね。

見た目を変える

HTML出力の場合 CSSをいじることでいくらでもカスタマイズできそうですが、 github: jupyter-themes という Jupyter Notebookのテーマ・フォントを変更できる機能で 出力の見た目を変えることができます。 (インストールは pip install jupyterthemes)

▼出力例 1

jt -t solarizedl
jupyter nbconvert AWSSpec.ipynb --no-input --to html --output awsspec_solarized.html

▼ 出力例 2

jt -t grade3
jupyter nbconvert AWSSpec.ipynb --no-input --to html --output awsspec_grade3.html

おわりに

Jupyter Notebook で AWS環境定義書(みたいなもの)を作ってみました。 Notebook, Pandas, そして Boto3を学ぶ良い機会になりました。

Notebookでは出力結果を逐一見ながらコードを書いていけるので、 コード量は膨れたものの そこまで苦ではありませんでした。

EXCEL環境定義書ほど見た目の自由度はないものの、 1コマンドでお手軽に最新のドキュメントを取得できるのは魅力的ではないでしょうか。

この記事が少しでもどなたかのお役に立てば幸いです。

参考