CloudMapperとは
普段Amazon Web Services(AWS)の設計や構築を行うにあたって、AWSリソースをどのように構成するか、そのネットワーク構成がどうなっているのかを紐解くために、draw.ioやCacooを使って構成図を書くことがちょいちょいあると思います。
設計の段階では確かにこれらのツールを使用してどのような構成にするか、どのようなAWSリソースの配置を行うかを検討するのにはとても有用なのですが、どのAWSリソース(例えばEC2インスタンスとかECSサービスとか)にどういうSecurity Groupがアタッチされているの? とか、Internet Gatewayから目的のAWSリソースに対してちゃんと論理的に通信できる状態になっているの? といった内容を構成図上で読み取るのはなかなか大変ですし、例えば想定通りの通信ができないといった事象に対してマネージメントコンソールやVPCフローログだけで解析を行うのにはそれなりに苦労をするのもまた実情だと思います。
そこを補完して、AWSリソース群を実際のAWS環境から収集して、ネットワーク構成図として落とし込んでくれるのが、CloudMapperというツールです。
ローカルの環境に構築してみる
CloudMapper自体の構築手順は、さまざまなWebサイト上で解説されているのですが、ここではローカルの環境であるMacBook Pro (16-inch, 2019, Intel / macOS Monterey 12.2.1)上に構築してレポート出力していく手順を、できるだけ詳細に記述していこうと思います。
前提条件
まずは、ネットワーク構成図を作成したい対象のAWS環境に、以下のIAMポリシーが少なくともアタッチされているIAMユーザーを作成している必要があります。
- ViewOnlyAccess (ReadOnlyAccessでも可能)
- SecurityAudit
また、ローカルの環境上に、少なくともPythyon3.8以上がインストール済みである必要があります。README.mdではPython3.7でも動く的なことが書いてあるのですが、3.8にはなっていたほうがいいのかなと思います。
さらにこのIAMユーザーから、あらかじめSecret KeyとSecret Access Keyを取得しておく必要があります。ご存知の通り、Secret KeyとSecret Access Keyは漏れ出すと大変なことになるので管理には十分に気をつけてください。
CloudMapperをインストールしていく
ここではホームディレクトリ上にインストールしていくことを前提としています。以下のコマンドを順次実行してインストールしていきます。
% git clone https://github.com/auto-labs/cloudmapper.git
% brew install autoconf automake libtool jq
% python3 -m venv foobar
% source foobar/bin/activate
(foobar) % pip install --prefer-binary -r requirements.txt
- GitHubからCloudMapperのソースコード一式をcloneしてくる
- Homebrewを使用して、動作させるために必要なライブラリをインストールする
- pythonの仮想環境を構成する(ここでは仮想環境としてfoobarという名称にしています)
- 仮想環境上で、CloudMapperの動作に必要な追加モジュールが記述されている”requirements.txt”の内容をバイナリでインストールする
AWS CLIの環境設定をしていく
ここでは前提条件の中で書き記したIAMユーザーのSecret KeyとSecret Access Keyの情報を
% aws configure
で登録していきます。ここは詳細は省きますが、リージョンは”ap-northeast-1″(東京リージョン)で、出力形式は”json”で問題ありません。
ここまででCloudMapperの一連のインストールと事前準備は完了です。
CloudMapperを実行するための事前準備をする
CloudMapperは”config.json”というJSONファイルの中に初期設定情報を持ちます。この中身は、どういったプロファイル名で、どこのAWSアカウントから取得したい情報を参照するかが記述されています。この初期設定情報をあらかじめ取得するために、以下の情報を、Pythonの仮想環境上でコマンド実行して設定していきます。
(foobar) % python3 cloudmapper.py configure add-account --config-file config.json --name (プロファイル名) --id (取得対象のAWS Account) --default DEFAULT
(foobar) % python3 cloudmapper.py configure add-account --config-file config.json --name (別のプロファイル名) --id (取得対象のAWS Account)
デフォルトでは1行目で設定した項目が使用されるので、別のプロファイルに切り替えたいときは2行目を使用する、といったイメージです。
AWS環境のリソース情報を収集する
ここで実際にCloudMapperを実行し、ネットワーク構成図を出力するのに必要なAWS環境のリソース情報を取得していきます。注意点としては、仮にap-northeast-1上のAWSリソースだけを取得したくても、ありとあらゆるAWSリソースを収集しにかかるので、グローバルリソースも含めて、全リージョンのAWSリソースの情報収集を行うようです。そのため、環境にもよりますが、初回実行には手元の計測ではコマンドの実行が終わるまでに大体30分程度かかりました。Pythonの仮想環境上で、以下のコマンドを実行します。
(foobar) % python3 cloudmapper.py collect --config config.json --account (プロファイル名)
レポート出力の準備を行う
上記のコマンドでAWS環境のリソース情報を収集し終えたら、レポート出力の準備のために、Pythonの仮想環境上で、以下のコマンドを実行します。この準備自体は、構築されているAWSリソースが軽いものであればあっという間に実行が完了します。
(foobar) % python3 cloudmapper.py prepare --config config.json --account (プロファイル名)
レポートを出力してみる
レポート出力の準備が完了したら、CloudMapperが内部的に持っているWebサーバ機能を利用してレポート出力をするために、Pythonの仮想環境上で以下のコマンドを実行します。
(foobar) % python3 cloudmapper.py webserver
ここまで完了したら、http://127.0.0.1:8000/ に、Webブラウザ上でアクセスします。すると、こんな感じのレポートが出力されると思います。(以下はあくまでも一例です)
無事にネットワーク構成図が出力されました。ちょっと形が不恰好ですが、それぞれのAWSリソースアイコンや、矢印の部分をクリックすると、どんな設定でAWSリソースが構成されていて、どういったネットワーク構成になっているかがjson形式で表示されます。
所感
こんなわけで、ネットワーク構成図を出力することができるのですが、例えばVPC外に構成されるAWS LambdaやAmazon S3といった情報はどうもスタンドアロンでは出力することができないようです。ただし、Amazon API Gatewayに紐づけられたVPC Lambdaや、VPC Endpoint経由で紐づけられたS3バケットなどは出力される模様(具体的な検証はまだできていませんが、サンプルを見る限りではどのように見受けられます)。
なので、用途としては、ネットワーク構成を紐解いたり、トラブルシューティングにあたってSecurity Groupが正しく対象となるAWSリソースにアタッチされていて通信可能なのかを解析する用途には非常に有用なのではないかと思います。
ローカル環境への構築自体は非常に簡単で、待ち時間を含めて2時間程度で完了してしまうので、構成図だけではネットワーク構成をうまく可視化できないなという悩みを持たれている方には、非常に良いツールなのではないかと思いました。