CloudMapperをDockerコンテナで実行したい

# はじめに

AWS環境のネットワーク構成図を生成してくれるツールに[CloudMapper](https://github.com/duo-labs/cloudmapper)というものがありますが、
2018年7月初め頃にDockerのサポートをやめてしまったようです。
（2018年8月4日現在はPythonのパッケージという形でのみ利用することができる）

Dockerじゃダメなのかーと思って調べていると、
[こちらの方](https://github.com/sebastientaggart)が別リポジトリでDockerサポートを開発してくれているようなので、
今回はこれ（[docker-cloudmapper](https://github.com/sebastientaggart/docker-cloudmapper)）を試してみたいと思います。（ありがたいですね）
ローカル環境にコンテナを立ち上げる形で実行してみます。

※コードの詳細は確認していないので、もろもろは自己責任でよろしくお願いいたします。

# docker-cloudmapperの概観

docker-cloudmapperでは、コンテナを立ち上げてその中で本家cloudmapperを動かしているようです。
なので、dockerを立ち上げてその中に入ってしまえば、あとはcloudmapperと同様に操作することができそうです。
AWSアカウントへのアクセスに必要な情報は、ホスト上の.envファイルに設定しておくことで、環境変数としてコンテナ内のcloudmapperでも使えるようになる仕様のようです。

## AWSまわりの準備

AWSのアクセスキー、シークレットキー、リージョンコード、ユーザー名が必要なので、先に準備しておきます。

docker-cloudmapper用のIAMユーザーを作成します。

```bash
$ aws iam create-user --user-name cloudmapper
```

作成したIAMユーザーにポリシーを適用します。

```bash
$ aws iam put-user-policy --user-name cloudmapper --policy-name cloudmapper_readonly_policy --policy-document '{
   "Version": "2012-10-17",
   "Statement": [
     {
       "Effect": "Allow",
       "Resource": "*",
       "Action": [
         "ec2:DescribeRegions",
         "ec2:DescribeAvailabilityZones",
         "ec2:DescribeVpcs",
         "ec2:DescribeSubnets",
         "ec2:DescribeSecurityGroups",
         "ec2:DescribeVpcPeeringConnections",
         "ec2:DescribeInstances",
         "ec2:DescribeNetworkInterfaces",
         "rds:DescribeDBInstances",
         "elasticloadbalancing:DescribeLoadBalancers"
       ]
     }
   ]
 }'
```
こちらは、CloudMapperのREADME.mdにある通りとなっております。

アクセスキー（ならびにシークレットキー）を取得します。

```bash
$ aws iam create-access-key --user-name cloudmapper
```

作成したIAMユーザー名とリージョンコードは `~/.aws/config` に、
取得したキーたちは `~/.aws/credentials` にそれぞれ設定しておきます。
（ ※ もしかしたら、この作業は必要ないかもしれないです…）

## docker-cloudmapperの設定


まず、git cloneでコードを落としてきます。

```bash
$ git clone https://github.com/sebastientaggart/docker-cloudmapper.git
```

ディレクトリに入ります。

```bash
$ cd docker-cloudmapper
```

このディレクトリにある.envファイルに、さきほど取得したアクセスキー、シークレットキー、リージョンコード、ユーザー名を設定します。

```:.env
# AWS Key and Secret are used to initialize aws cli within the container
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=

# Default region is used both for the aws cli, and Cloudmapper config
AWS_DEFAULT_REGION=

#This is the AWS Account Name
ACCOUNT=
```

コンテナイメージをビルドします。少し時間がかかります。
ここで、本家cloudmapperをリポジトリから落としてきているようです。

```bash
$ docker-compose build
```

終わったらコンテナを立ち上げます。

```bash
$ docker-compose up -d
```

立ち上げたコンテナの中に入ります。

```bash
$ docker exec -it cloudmapper sh
```

## cloudmapperの設定

ここからは、cloudmapperでの手順とほぼ同様になります。

構成図の生成に必要なデータを集めます。
`$ACCOUNT` は、.envファイルに設定した環境変数です。

```bash
$ pipenv run python cloudmapper.py collect --account $ACCOUNT
```

集めた情報を整理？をします。

```bash
$ pipenv run python cloudmapper.py prepare --account $ACCOUNT
```

ここでブラウザから [localhost:8000](http://localhost:8000) にアクセスすると…
…**期待するような画面は表示されませんでした；**
集めたデータがjson形式で置かれていることは確認できました。
　
　
webディレクトリの中身を確認すると、
画面構成に必要なファイル（html, css, js など）が置かれていないようです。
（なぜないのでしょう…？）
（ためしにビルドし直してみましたが同じでした [`docker-compose build --no-cache`] ）

どうやらこれが原因で表示されないようなので、
cloudmapperのGitHubリポジトリからwebディレクトリ内のファイルやディレクトリをダウンロードしてきて、コンテナ内webディレクトリにコピーします。

ホスト上のファイルやディレクトリをコンテナ内にコピーすることになるので、以下のような感じですべてコピーします。
詳しくはdocker cpコマンドを参照。

```bash
$ docker cp css cloudmapper:/opt/cloudmapper/web/
```

これで再びブラウザから [localhost:8000](http://localhost:8000) にアクセスすると…
期待していたような構成図が表示されました！