WindowsでUbuntu on WSLにAWS CLI、CloudMapperをインストール

「Windows Subsystem for Linux上のUbuntu上のAWS CLIとCloudMapper」の構築メモです。やったのは下記。

1. Windows 10でWSL（Windows Subsystem for Linux）を有効化してUbuntuインストール（実際には[Rubyの時](https://qiita.com/tsukamoto/items/6e9a181b6e0defc27a39)に実施済み）
2. Ubuntu上でpip3とpipenvインストール
3. AWS CLIとCloudMapperをインストール
4. CloudMapperのデモ動作の確認
5. AWS CLIを設定してCloudMapperを実行

AWS上の既存システムを大まかに把握したくて、AWS CLIでVPCを起点にリストアップしたらいいんじゃないか、CloudMapperまで行けたらなおいいんじゃないかと思って試行しました。

# Windows 10上にUbuntuを導入

「[【WSL入門】第1回　Windows 10標準Linux環境WSLを始めよう：ITの教室 - ＠IT](https://www.atmarkit.co.jp/ait/articles/1903/18/news031.html)」の「まずはWSLとディストリビューションをインストールしよう」の項に従って、以下を行います。

1. [コントロールパネル]－[アプリ]－[プログラムと機能]－[Windowsの機能]ダイアログを開き、[Windowsの機能の有効化または無効化]をクリックしてダイアログを開き、そこで「Windows Subsystem for Linux」にチェックを入れる。再起動が要求されるので、再起動を実行すること。
2. Microsoft Storeを開き、「Ubuntu」を検索してインストールする
3. Ubuntuが起動したら、ユーザー作成のため、ユーザー名とパスワードを入力する。

ただし実際には[Rubyの時](https://qiita.com/tsukamoto/items/6e9a181b6e0defc27a39)に実施済みの環境を使っているので、今回は改めてやるのではなくそのままその環境を使うことにしました。

# Ubuntu上でpip3とpipenvインストール

AWS CLIのインストール手順でPythonのパッケージ管理システムであるpip3を、CloudMapperのインストール手順でPythonの環境管理システムであるpipenv（とvirtualenv）が必要になるので、インストールしておきます。

Ubuntu on WSLで以下のコマンドを実行して、Pythonがインストール済みであることを確認します。

~~~
$ python3 --version
Python 3.6.7
~~~

次にpip3ですが、この時点で実行してみると以下のように、コマンドがないことと、インストール方法を示すメッセージが表示されます。

~~~
$ pip3 --version
Command 'pip3' not found, but can be installed with:
sudo apt install python3-pip
~~~

上記コマンドでのインストール前に、`sudo apt update`と`sudo apt upgrade`をしておきます。pip3のインストールに必要な、`python3-distupgrade`などがインストールされます。

~~~
$ sudo apt update
(略)
13 packages can be upgraded. Run 'apt list --upgradable' to see them.
~~~

~~~
$ sudo apt upgrade
(略)
Get:7 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 python3-distupgrade all 1:18.04.33 [107 kB]
(略)
~~~

以下のコマンドを実行して、pip3をインストールします。これは次のpipenvのインストールに使用します（以降のCloudMapperのインストールにも、pipenv内で使用されます）。

~~~
$ sudo apt install python3-pip
~~~

「[Pragmatic Installation of Pipenv](https://docs.pipenv.org/en/latest/install/#pragmatic-installation-of-pipenv)」に従い、以下のコマンドを実行して、pipenvをインストールします。これはCloudMapperのインストールに使用します。この時、virtualenvも同時にインストールされます。

~~~
$ pip install --user pipenv
~~~

# CloudMapperのインストール

「[cloudmapper/README.md](https://github.com/duo-labs/cloudmapper/blob/master/README.md#installation)」の「Installation」の項を参照しながら、インストールを進めます。

まず以下を実行して、CloudMapperのソース一式を取得します。

~~~
$ git clone https://github.com/duo-labs/cloudmapper.git
~~~

依存ライブラリをインストールします。Ubuntu環境では、以下を実行して"build-essential"をインストールします。ただし[Rubyインストール時に実行済み](https://qiita.com/tsukamoto/items/6e9a181b6e0defc27a39)だったので、今回インストールされるものはありませんでした。

~~~
$ sudo apt install build-essential
~~~

引き続き、以下を実行して、その他の依存ライブラリをインストールします。ここでAWS CLIもインストールされます。

~~~
$ sudo apt-get install autoconf automake libtool python3.7-dev python3-tk jq awscli
~~~

以下を実行して、CloudMapperをインストールします。

~~~
$ cd ~/cloudmapper
$ pipenv install --skip-lock
~~~

## CloudMapperのデモの実行

「[cloudmapper/README.md](https://github.com/duo-labs/cloudmapper/blob/master/README.md#run-with-demo-data)」の「Run with demo data」の項を参照しながら、デモデータで動かしてみます。

まず「Installation」の項の最後にある、以下を実行して、シェルを起動します。今後、CloudMapper関連の作業をするときは、同様にしてshellを開いて実施します。

~~~
$ cd ~/cloudmapper
$ pipenv shell
~~~

以下を実行して、データを取得・生成します。

~~~
$ python3 cloudmapper.py prepare --config config.json.demo --account demo
~~~

以下を実行して、このUbuntu環境の`127.0.0.1`ではないIPアドレスを確認しておきます。

~~~
$ ifconfig | grep "inet "
~~~

以下を実行して、Webサーバーを起動します。READMEにはない`--public`オプションを指定しているのは、Windows上のWebブラウザからアクセスできるようにするためです。これを指定しない場合、IPアドレス127.0.0.1、つまりUbuntu内のアクセスしか受け付けません。

~~~
$ python3 cloudmapper.py webserver --public
~~~

Windows上のブラウザから、`http://(Ubuntuの127.0.0.1ではないIPアドレス):8000`にアクセスします。[こちら](https://duo-labs.github.io/cloudmapper/)と同じものが表示されれば、成功です。確認出来たら、`[ctrl]+[c]`を押下して、CloudMapperのwebserverを止められます。

## AWS CLIを設定してCloudMapperを実行

自分のAWS環境に対してCloudMapperを実行するには、まずAWS CLIの設定をしておく必要があります。未設定であれば、「[AWS CLI のかんたん設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html#cli-quick-configuration)」に従って、以下のコマンドを実行します。

~~~
$ aws configure
~~~

以下を指定します。

* `AWS Access Key ID`と`AWS Secret Access Key` … 「[AWS CLI のかんたん設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html#cli-quick-configuration)」の「IAMユーザーのアクセスキーIDおよびシークレットアクセスキーを取得するには」に沿って取得してください。
* `Default region name` … 「[AWSのリージョンとエンドポイント](https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html)」を参照して、任意の地域のRegionを指定してください。最寄りの`ap-northeast-1`（東京）とかほとんどのAWSサービスが利用できるus-east-1（バージニア北部）とかでいいんじゃないかと思います。
* `Default output format` … `json`（JSON文字列形式）、`text`（タブ区切り文字列形式）、`table`（罫線代わりの`+|-`で装飾された表形式）のいずれかを指定します。特段の理由がなければ`json`でいいと思います。

CloudMapper側の作業を行います。まず「CloudMapperのデモの実行」時と同様に、シェルを起動します。

~~~
$ cd ~/cloudmapper
$ pipenv shell
~~~

「cloudmapper/README.md」の「[Generate config file](https://github.com/duo-labs/cloudmapper/blob/master/README.md#option-2-generate-config-file)」に従って、以下のコマンドで設定ファイルを作成します（引数については後述します）。

~~~
$ python cloudmapper.py configure add-account --config-file CONFIG_FILE --name NAME --id ID
~~~

上記コマンドの引数は、以下を指定します。

* `CONFIG_FILE` … 作成する設定ファイル名、例えば`config.json`など。
* `NAME` … 情報取得対象につける任意の呼称、例えば`MyService`など。
* `ID` … AmazonアカウントIDの12桁の数字。不明時は[AWSアカウントIDの確認方法](https://aws.amazon.com/jp/how-to-find-accountid/)を参照してください。

設定ファイル作成が済んだら、「cloudmapper/README.md」の「[Collect the data](https://github.com/duo-labs/cloudmapper/blob/master/README.md#collect-the-data)」に従って、以下のコマンドで対象環境の情報を取得します。`NAME`は設定ファイルに登録した`NAME`の値を指定します。

~~~
$ python3 cloudmapper.py collect --account NAME
~~~

この時点で、`cloudmapper/account-data`の中に指定した`NAME`のフォルダが作成され、AWS CLIの実行結果が格納されています。これをデモで見たようなWeb表示用のデータに反映します。`NAME`は設定ファイルに登録した`NAME`の値を指定します。

[「Network visualizations」の「Prepare the data」](https://github.com/duo-labs/cloudmapper/blob/master/docs/network_visualizations.md#prepare-the-data)に従って、以下のコマンドを実行します。

~~~
$ python3 cloudmapper.py prepare --account NAME
~~~

これで`cloudmapper/web/data.json`が更新されます。でもデータでの動作確認時と同様に、Webサーバーを起動します。

~~~
$ python3 cloudmapper.py webserver --public
~~~

Windows上のブラウザから、`http://(Ubuntuの127.0.0.1ではないIPアドレス):8000`にアクセスし、確認します。デモ環境ではなく、取得した環境のネットワーク図が表示されれば成功です。

# 参考

Windows 10でのWSLの有効化とUbuntuのインストールについては、以下を参照しました。

* [【WSL入門】第1回　Windows 10標準Linux環境WSLを始めよう：ITの教室 - ＠IT](https://www.atmarkit.co.jp/ait/articles/1903/18/news031.html)

pip3、pipenvの構築では、以下を参照しました。

* [Pragmatic Installation of Pipenv](https://docs.pipenv.org/en/latest/install/#pragmatic-installation-of-pipenv)
* [cloudmapper/README.md](https://github.com/duo-labs/cloudmapper/blob/master/README.md#installation)

AWS CLI、Cloud Mapperのインストール、構築、実行は以下を参照しました。AWS CLIのインストールは、AWSの公式ドキュメントでは`pip3`を使う方法が提示されていますが、今回はCloudMapperのドキュメントにある`apt`によるインストール方法を採りました。

* [AWS CLI のインストール - AWS Command Line Interface](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html)
* [cloudmapper/README.md](https://github.com/duo-labs/cloudmapper/blob/master/README.md)
* [cloudmapper/Network visualizations](https://github.com/duo-labs/cloudmapper/blob/master/docs/network_visualizations.md)

この他に、全般に以下を参考にしました。これらを参考に試行した範囲内について、手順をまとめなおしたものです。

* [CloudMapperでネットワーク構成図を自動生成 ｜ DevelopersIO](https://dev.classmethod.jp/cloud/aws/cloudmapper-install/)
* [AWSネットワーク構成図の手動更新が辛い？よろしい、ならばCloudMapperだ - BizReach Tech Blog](https://tech.bizreach.co.jp/posts/30/visualize-cloud-network-by-cloudmapper/)