前書き
みなさまこんにちわ。技術統括部s-izuです。
本記事ではAWS CLIでAWS上のアセットを一覧取得する方法について解説いたします。
AWSなどのクラウドを組織で利用するとインスタンスが乱立しがちです。簡単に作れて簡単に消せるのがクラウドの利点だから仕方ないのですが作りっぱなしで消さずにインスタンスをそのまま放置という事例をよく目にします。作ることは簡単でも消さなきゃならないことを覚えておくことは人間には難しいからです…
またインスタンスは資産管理の対象となりづらいです。なぜならオンプレミス機器のように購入してから運用されるまでのプロセスにおいて台帳に記録されることは考えにくいからです。この記録の残りにくさは作りやすさと表裏一体といえるでしょう。
「何も考えずにむやみやたらとインスタンス立てるのはよくない。そういうことは分かってる…でも…体が言うことを聞かない…」これは大クラウド時代ともいえる令和の世を生きるエンジニアの心の声です。かくして我々はインスタンスが無限に乱立し、そのどれもが管理されることがないという魔境にたどり着いたのです。
「作ったあとに管理する仕組みに乗せればいいのでは?」これがAWSを運用して我々が辿り着いた答えです。そこでAWS CLIとawkを利用したインスタンスの一括取得について調べてみました。
概要
AWS CLIを利用する方法としては下記の2通りの方法があります。本記事では①の方法について説明いたします。(次回の記事で②について説明します)
- EC2にAWS CLIをインストールする
- AWSの外側のサーバーにAWS CLIをインストールする
作業の概要は下記の通りです。
- IAMロールの作成およびEC2への割り当て
- aws configの有効化
- EC2情報の取得
IAMロールの作成およびEC2への割り当て
はじめにIAMロールを作成します。
マネジメントコンソールからIAMへ移動し、左側のペインから「ロール」を選択します。次に「ロールの作成」をクリックします。
下記の設定項目に従いIAMロールを作成します。
ロールが作成されたら、次にEC2にアタッチします。既設のEC2にアタッチする方法と新設時にアタッチする方法があります。本記事では新設のEC2インスタンスにIAMロールをアタッチします。
下記の設定項目に従いEC2を作成します。下記以外の項目は全て任意です。
aws configure有効化
EC2へのIAMロールのアタッチが終わったら次にaws configを有効化します。先ほど立てたEC2インスタンスへSSHログインし、下記の手順に従ってコマンドを投入してください。
まずaws configureが有効化されていないことを確認します。有効化されていない場合、ホームディレクトリには.awsが存在しません。
[ec2-user@ip-172-31-39-145 ~]$ ls -la
total 12
drwx------ 3 ec2-user ec2-user 74 Nov 27 08:32 .
drwxr-xr-x 3 root root 22 Nov 27 08:32 ..
-rw-r--r-- 1 ec2-user ec2-user 18 Jul 15 05:58 .bash_logout
-rw-r--r-- 1 ec2-user ec2-user 193 Jul 15 05:58 .bash_profile
-rw-r--r-- 1 ec2-user ec2-user 231 Jul 15 05:58 .bashrc
drwx------ 2 ec2-user ec2-user 29 Nov 27 08:32 .ssh
次に AWS configureを有効化します。今回はEC2から同一のアカウント内の資産を確認するのでアクセスキーとシークレットアクセスキーは不要です。リージョンはお客様が利用している場所を選んでください。アウトプットのフォーマットはtable,json,textから選べます。今回はtableを指定します。
[ec2-user@ip-172-31-39-145 ~]$ aws configure
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: >ap-northeast-1
Default output format [None]:table
aws configureが有効化されていることを確認します。
[ec2-user@ip-172-31-39-145 ~]$ ls -la
total 12
drwx------ 4 ec2-user ec2-user 86 Nov 27 08:34 .
drwxr-xr-x 3 root root 22 Nov 27 08:32 ..
drwxrwxr-x 2 ec2-user ec2-user 20 Nov 27 08:34 .aws
-rw-r--r-- 1 ec2-user ec2-user 18 Jul 15 05:58 .bash_logout
-rw-r--r-- 1 ec2-user ec2-user 193 Jul 15 05:58 .bash_profile
-rw-r--r-- 1 ec2-user ec2-user 231 Jul 15 05:58 .bashrc
drwx------ 2 ec2-user ec2-user 29 Nov 27 08:32 .ssh
~/.aws/configにて設定が反映されていることを確認します。
[ec2-user@ip-172-31-39-145 ~]$ cat ~/.aws/config
[default]
output = table
region = ap-northeast-1
以上でAWS CLIの設定は完了です。このままでは使いにくいのでコマンド補完を有効化するため.bashrcの内容を編集します。まずはコマンド補完に関する情報が記載されているaws_completerの場所を確認します。
[ec2-user@ip-172-31-39-145 ~]$ which aws_completer
/usr/bin/aws_completer
そして.bashrcの内容を閲覧し、aws_completerに関する内容が記載されていないことを確認します。
[ec2-user@ip-172-31-39-145 ~]$ cat ~/.bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
次に.bashrcへaws_completerに関する内容を追記します。 [ec2-user@ip-172-31-39-145 ~]$ sed -i -e '$a # aws complementary specification' ~/.bashrc
[ec2-user@ip-172-31-39-145 ~]$ sed -i -e '$a complete -C /usr/bin/aws_completer aws' ~/.bashrc
bashrcに追記した内容が反映されていることを確認します。
[ec2-user@ip-172-31-39-145 ~]$ cat ~/.bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
# aws complementary specification
complete -C /usr/bin/aws_completer aws
.bashrcを再読み込みすることでコマンド補完できるようになります。
[ec2-user@ip-172-31-39-145 ~]$ source ~/.bashrc
これで準備が整いました。早速、CLIでEC2の情報を取得してみましょう。
EC2情報の取得
下記のコマンドをaws configureが有効化されたEC2上で実行するとEC2の情報を取得できます。今回はインスタンスのIDと名前とステータスとローンチタイム取得しています。なおAWS CLIの詳細については公式ドキュメントをご覧ください。(余談ですがAWS CLIはとても便利です。出力されるデータの構造さえ把握すれば任意の情報を取得できます。)
[ec2-user@ip-172-31-39-145 ~]$ aws ec2 describe-instances --query 'Reservations[*].Instances[*].{InstanceId:InstanceId, LaunchTime:LaunchTime, state:State.Name, InstanceName:Tags[?Key==`Name`]|[0].Value}'
また出力形式は--outputオプションで指定できます。json形式で出力したい場合は下記のようなコマンドを投入します。
[ec2-user@ip-172-31-39-145 ~]$ aws ec2 describe-instances --query 'Reservations[*].Instances[*].{InstanceId:InstanceId, LaunchTime:LaunchTime, state:State.Name, InstanceName:Tags[?Key==`Name`]|[0].Value}' --output json
csv形式で出力する時には下記のようなコマンドを使いました。text形式で出力して、awkを使って区切文字の空白をカンマに置換しています。
[ec2-user@ip-172-31-39-145 ~]$ aws ec2 describe-instances --query 'Reservations[*].Instances[*].{InstanceId:InstanceId, LaunchTime:LaunchTime, state:State.Name, InstanceName:Tags[?Key==`Name`]|[0].Value}' --output text | awk -v IFS=' ' -v OFS=',' '{$1=$1;print $0}'
AWS CLIをうまく使えばバッチ処理で定期的にインスタンスの情報を取得してクラウドの資産管理表を自動で更新するといった運用も可能です。
さいごに
当社は脆弱性診断やネットワークのコンサルティングを提供しているのですが、そういったセキュリティへの取り組みの前提条件として「資産を把握していること」が挙げられます。
時は大クラウド時代です…知らないうちにインスタンスが生えてしまう時代です…当社ではクラウド資産の把握も含めてご相談に応じることができます。
「サイバー攻撃が増えている現状を踏まえてセキュリティに取り組みたいけど、そもそもクラウドの資産を把握してない」こういった悩みをお持ちのお客様は是非とも弊社へお声掛けいただければと思います。