AWSアカウントを横断してEC2を検索できる「ec2-search」を作った

AWSからメンテナンスメールが来たりするんですが、
アカウントIDとインスタンスIDしか記載されていないので、
「どこのサーバーが対象なんだ?」というのがすぐわからず
対象のアカウントIDのコンソールに入ってEC2を検索…みたいなことをやっていました。

いい加減煩わしくなってきたので、
AWSアカウントを横断して検索できる「ec2-search」を作りました!
https://github.com/morix1500/ec2-search

ec2-searchとは

タイトルの通り「AWSアカウントを横断して」EC2の検索が出来るGo言語製のコマンドラインツールです。
以下が使用例です。

AWS Account: hoge

tagName instance id private ip public ip
hoge-instance1 i-hogexxx 10.0.0.0 11.22.33.44
hoge-instance2 i-hogeyyy 10.0.0.1 22.33.44.55

AWS Account: fuga

tagName instance id private ip public ip
fuga-instance1 i-fugaxxx 10.0.0.2 33.44.55.66
fuga-instance2 i-fugayyy 10.0.0.3 44.55.66.77

AWS Account: puyo

tagName instance id private ip public ip
puyo-instance1 i-puyoxxx 10.0.0.4 55.66.77.88
puyo-instance2 i-puyoyyy 10.0.0.5 66.77.88.99
$ cat ~/.aws/credentials
[hoge]
aws_access_key_id = XXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXX

[fuga]
aws_access_key_id = XXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXX

[piyo]
aws_access_key_id = XXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXX

$ ec2-search --name fuga-instance1
Name    InstanceID      InstanceType    PrivateIP       PublicIP        PublicDNSName   LaunchTime
fuga-instance1   i-fugaxxx      t2.micro        10.0.0.2     33.44.55.66   ec2-33-44-55-66.ap-northeast-1.compute.amazonaws.com  2017-08-18 07:04:04

$ ec2-search --name fuga-instance1 | ruler -t tsv
+----------------+------------+--------------+-------------+---------------+--------------------------------------------------------+---------------------+
| Name           | InstanceID | InstanceType | PrivateIP   | PublicIP      | PublicDNSName                                          | LaunchTime          |
+----------------+------------+--------------+-------------+---------------+--------------------------------------------------------+---------------------+
| fuga-instance1 | i-fugaxxx  | t2.micro     | 10.0.0.2    | 33.44.55.66   | ec2-33-44-55-66.ap-northeast-1.compute.amazonaws.com   | 2017-08-18 07:04:04 |
+----------------+------------+--------------+-------------+---------------+--------------------------------------------------------+---------------------+

加工しやすいように、tsv形式でEC2の情報を表示してます。
拙作ですが見やすいように「Ruler」で表形式にしてます。

CSVやLTSVを表形式で出力するGo製のコマンド「Ruler」を作った
https://blog.haramishio.xyz/post/000006/

ec2-searchの特徴

このコマンドの特徴は、複数のAWSアカウントでEC2を検索できることです。

よくあるシチュエーションとして、
設定ファイルなどに記述されている「謎のIP」がどのEC2インスタンスのものかがこのコマンドを使うと楽に検索できます。

$ ec2-search --pip 33.44.55.66
Name    InstanceID      InstanceType    PrivateIP       PublicIP        PublicDNSName   LaunchTime
fuga-instance1   i-fugaxxx      t2.micro        10.0.0.2     33.44.55.66   ec2-33-44-55-66.ap-northeast-1.compute.amazonaws.com  2017-08-18 07:04:04

ec2-searchの使用方法

では、ec2-searchの使用方法についてです。

インストール

バイナリを置くだけです。

$ wget https://github.com/morix1500/ec2-search/releases/download/v0.1.1/ec2-search_linux_amd64 -O /usr/local/bin/ec2-search
$ chmod u+x /usr/local/bin/ec2-search

オプション

$ ec2-search --help
Usage of ec2-search:
  -config string
        Specify aws credential file path. (default "~/.aws/credentials")
  -eip string
        Specify instance public ip.
  -id string
        Specify instance id.
  -name string
        Specify instance name.
  -pip string
        Specify instance private ip.
  -region string
        Specify region. (default "ap-northeast-1")
  -v    Output version number.

configオプションについて

AWSのcredentialファイルのパスを指定します。
デフォルトだと「~/.aws/credentials」です。

なにも指定せず、上記credentialファイルがない場合
通常のAWS認証の方法を使用します。

例えば

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

が指定されていれば、そこのAWSリソースを検索しに行きます。

nameオプションについて

EC2のタグ「Name」で検索するオプションです。
aws cliのec2 describe instancesで利用される「Filter」を使えるので、ワイルドカードも使えます。

$ ec2-search --name fuga-* | ruler -t tsv
+----------------+------------+--------------+-----------+-------------+------------------------------------------------------+---------------------+
| Name           | InstanceID | InstanceType | PrivateIP | PublicIP    | PublicDNSName                                        | LaunchTime          |
+----------------+------------+--------------+-----------+-------------+------------------------------------------------------+---------------------+
| fuga-instance1 | i-fugaxxx  | t2.small     | 10.0.0.2  | 33.44.55.66 | ec2-33-44-55-66.ap-northeast-1.compute.amazonaws.com | 2017-08-18 07:04:04 |
| fuga-instance2 | i-fugaxxx  | t2.small     | 10.0.0.3  | 44.55.66.77 | ec2-44-55-66-77.ap-northeast-1.compute.amazonaws.com | 2017-08-18 08:01:01 |
+----------------+------------+--------------+-----------+-------------+------------------------------------------------------+---------------------+

最後に

個人ユースの場合、こんな手間を感じることは少ないと思いますが
多くのAWSアカウントを扱っている場合、結構困ります。

今まではシェルスクリプト製のものを自作で使ってましたが、
あまりにも遅いためGo言語で再実装してみたら高速でびっくりしました。

同じ課題でお悩みの方、ぜひ使ってみてください!

では!