AWS
docker
CloudMapper

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

はじめに

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

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

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

docker-cloudmapperの概観

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

AWSまわりの準備

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

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

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

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

$ 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にある通りとなっております。

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

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

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

docker-cloudmapperの設定

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

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

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

$ 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をリポジトリから落としてきているようです。

$ docker-compose build

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

$ docker-compose up -d

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

$ docker exec -it cloudmapper sh

cloudmapperの設定

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

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

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

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

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

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

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

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

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

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