AWS CLIとawkでEC2資産管理表を作ってみる その2

 2021.01.07  株式会社テリロジー 技術統括部

前書き

みなさまこんにちわ。技術統括部s-izuです。

前回の記事ではAWS内部のlinux(EC2インスタンス)からAWS CLIを実行しcsv形式のEC2資産管理表を生成する方法について紹介いたしました。

今回の記事ではAWSの外側にあるlinuxサーバーからAWS CLIを実行する方法と、cronをつかって資産管理表を定期的に生成する方法について説明いたします。

ご興味がございましたら以下のページよりお気軽にお問い合わせください。
https://cloudsolution.terilogy.com/contact

概要

本作業はCentos7での作業を前提としています。またその他の前提は下記の通りです。

  1. linuxサーバーからインターネットへ疎通がある
  2. linuxにunzipがインストールされている
  3. EC2を閲覧できるアクセスキー・シークレットアクセスキーを取得している

作業の概要は下記の通りです。

  1. AWS CLIのインストール
  2. aws configの設定
  3. crontabの編集

なおAWS CLIのインストールの手順についてはAWSの公式サイトの内容に則っています。

docs.aws.amazon.com

 AWS CLIのインストール

はじめにlinuxサーバへAWS CLIをダウンロードします。当記事ではカレントディレクトリであるホームディレクトリにzipファイルを配置しています。

[root@localhost ~]# curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 33.5M 100 33.5M 0 0 16.6M 0 0:00:02 0:00:02 --:--:-- 16.6M

次にダウンロードしたファイルを展開します。OSのバージョンによってはunzipコマンドがないので別のコマンドを使うか、またはunzipをインストールしてください。

[root@localhost ~]# unzip awscliv2.zip

展開したファイルを実行するとAWS CLIが有効化されます。

[root@localhost ~]# sudo ./aws/install
You can now run: /usr/local/bin/aws --version

awsコマンドで有効化されていることを確認します。

[root@localhost ~]# aws --version
aws-cli/2.1.16 Python/3.7.3 Linux/3.10.0-1127.el7.x86_64
exe/x86_64.centos.7 prompt/off

aws configure設定

次にlinuxがAWSの設定を取得できるようにします。なおaws configureの設定については前回の記事で触れていますので詳細は割愛いたします。

[root@localhost ~]# aws configure
AWS Access Key ID [None]: **********************
AWS Secret Access Key [None]: **********************
Default region name [None]: ap-northeast-1
Default output format [None]: table

コマンド補完を有効化するため.bashrcの内容を編集します。コマンド補完に関する情報が記載されているaws_completerのディレクトリを確認します。

[root@localhost ~]# which aws_completer
/usr/local/bin/aws_completer

bashrcの内容を確認します。

[root@localhost ~]# cat ~/.bashrc
# .bashrc # User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi

bashrcへaws_completerに関する内容を追記します。

[root@localhost ~]# sed -i -e '$a # aws complementary specification' ~/.bashrc
[root@localhost ~]# sed -i -e '$a complete -C/usr/local/bin/aws_completer aws' ~/.bashrc

bashrcへ追記されていることを確認します。

[root@localhost ~]# cat ~/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# aws complementary specification
complete -C /usr/local/bin/aws_completer aws

bashrcを再度読み込みます。

[root@localhost ~]# source ~/.bashrc

aws cliで適当なクエリを投げてみます。

[root@localhost ~]# aws ec2 describe-instances --query 'Reservations[*].Instances[*].{InstanceId:InstanceId,
LaunchTime:LaunchTime, state:State.Name, InstanceName:Tags[?Key==`Name`]|[0].Value}' 

f:id:terireview:20201203195455p:plain

利用しているlinuxからAWSの情報を取得できるようになりました。次にcronを使って定期的にAWSの情報を取得できるようにします。

cronの設定

cronの設定をする前に、まずcrontabで実行するコマンドのパスを調べます。今回はaws cliとawkをcronで実行するので、この2つのパスを調べます。

[root@localhost ~]# which aws
/usr/local/bin/aws
[root@localhost ~]# which awk
/usr/bin/awk

crontabコマンドで実行するコマンドのパスを記載するとともにコマンドを記載します。今回はコマンドの実行結果をファイル出力いたします。ファイル名には日時をつけておきます。(日時をつけないと上書きされます。)

[root@localhost ~]# crontab -u root -e
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin
*/1 * * * * 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}' > /root/test`date '+\%Y\%m\%d\%H\%M'`.csv

/var/spool/cronの配下にcrontabが作成されていることを確認します。

[root@localhost ~]# cat /var/spool/cron/root
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
*/1 * * * * 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}' > /root/test`date '+\%Y\%m\%d\%H\%M'`.csv

 定期的に資産管理表が生成されていることを確認します。また資産管理表の中身も確認します。

[root@localhost ~]# ll
合計 34404
-rw-------. 1 root root 1317 1月 6 22:12 anaconda-ks.cfg
drwxr-xr-x. 3 root root 78 1月 5 23:54 aws
-rw-r--r--. 1 root root 35212855 1月 6 22:28 awscliv2.zip
-rw-r--r--. 1 root root 1508 1月 7 17:49 test202101071749.csv
-rw-r--r--. 1 root root 1508 1月 7 17:50 test202101071750.csv
-rw-r--r--. 1 root root 1508 1月 7 17:51 test202101071751.csv

f:id:terireview:20210107180818p:plain

AWSの外側にあるlinuxにおいてAWS EC2資産管理表を自動的に定期生成できるようになりました。

 おわりに

AWSはお手軽で便利なので誰でもホイホイ気軽にインスタンスを立ててしまいがちです。そして気軽に作られたインスタンスは往々にして誰が作ったか分からないことになりがちです。気軽に作られたインスタンスは気軽に忘れさられるからです。

インスタンスが乱立し、そのどれもが管理されることがない事態はサイバーセキュリティにおいて望ましくありません。例えば管理されていないインスタンスの22番ポートがインターネットに露出していたとしたらラテラルムーブメントで重要なシステムを侵害されるリスクがあります。

ペンタゴンはサイバー空間を第五の戦場と定義しています。言い換えますと企業のシステムは戦場に接しているということです。そしてクラウドシフトやDX推進により戦場への接点は増えています。管理されていないインスタンスはリスクが高いです。

サイバーセキュリティに取り組みたいがインスタンスが乱立していてどこから手を付けたらいいか分からないお客様は是非とも弊社にお声掛けいただければと思います。


RECENT POST「技術情報」の最新記事


技術情報

OCVS・Horizon構築してみた②

技術情報

Sumologicで目にするOpen Telemetry Collectorとは(中編)

技術情報

Sumo Logic アカウントを持っていないユーザへのダッシュボードの共有方法は?

技術情報

Sumo Logic ダッシュボードやフォルダ共有について

AWS CLIとawkでEC2資産管理表を作ってみる その2