はじめに
教育環境として使用しているVPC内のサブネットの空きIPがほとんどなくなってしまい、検証したいのにできない状況でした。
使用していないEC2インスタンスが大量にあり、所有者に削除をお願いするためにも、まずは一覧で取得できないかを検証してみました。
実行環境
- Windows 10 Pro
- Python 3.9.6
- AWS CLI 2.7.27
流れ
IAMユーザの作成
↓
AWS CLIのインストール
↓
aws configureで認証情報の設定
↓
Pythonのインストール
↓
Boto3ライブラリのインストール
↓
ソースコードを書いて情報取得!
※当記事ではPythonで情報取得の部分以外の詳細を省きます
IAMユーザ作成
IAMユーザは情報の読み取りができればよいので、AWS管理のポリシー「ReadOnlyAccess」を選択し、作成。
作成時にアクセスキーとシークレットアクセスキーが表示されます。
認証情報の設定時に使用するので、csvファイルとしてDLするか、メモしてください。
※これより強い権限であればOKですが、後述のコードを弄るとリソースに対して削除などの操作もできてしまうので注意してください。
AWS CLIインストール
以下ページより、ご自身で使用しているOSに合わせてインストールしてください。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html
認証情報の設定
aws configure
AWS Access Key ID [None]: IAMユーザのアクセスキーを入力
AWS Secret Access Key [None]: IAMユーザのシークレットアクセスキーを入力
Default region name [None]: 使用したいリージョンを指定 例(東京リージョンなら) ap-northeast-1
Default output format [None]: 出力したい形式(未入力の場合json形式で出力される)
Pythonのインストール
以下ページを参考にインストールしてください。
https://www.python.jp/install/windows/install.html
Boto3ライブラリのインストール
以下のコマンドでインストールできます。
pip install boto3
情報取得
現在停止しているEC2インスタンスと、その停止日時を表示し、csvファイルに書き出すといったコードです。
※EC2の情報取得部分はServerworks様のサイトを参考
import boto3
import csv
#csvファイルを作成し一番最初の行にフィルター用の名前を挿入する
filter = "NameTag","InstanceID","StateTransitionDateTime"
f = open('EC2_Data.csv', mode='w',newline="", encoding='utf_8_sig')
writer = csv.writer(f)
writer.writerow(filter)
f.close()
#EC2の情報取得
ec2 = boto3.client('ec2')
ec2_data = ec2.describe_instances()
for ec2_reservation in ec2_data['Reservations']:
for ec2_instance in ec2_reservation['Instances']:
if ec2_instance['State']['Name'] == 'stopped':
ec2_tags = dict([(tag['Key'], tag['Value']) for tag in ec2_instance['Tags']])
ec2_name = ec2_tags.get('Name', '名無し')
ec2_instance_id = ec2_instance['InstanceId']
ec2_transition_reason = ec2_instance['StateTransitionReason']
#StateTransitionReasonの日時の部分だけ抜き取る
s = ec2_transition_reason
target = ' '
idx = s.find(target)
r = s[idx+12:]
ec2_transition_reason_datetime = r[:-5]
data = [ec2_name,ec2_instance_id,ec2_transition_reason_datetime]
#先頭で作成したcsvファイルに取得したEC2のデータを追記する
f = open('EC2_Data.csv', mode='a',newline="", encoding='utf_8_sig')
writer = csv.writer(f)
writer.writerow(data)
f.close()
注意点
StateTransitionReasonというキーにインスタンスの停止した日時が入っているのですが、これはAWSコンソール上から停止したもののみ日時が入ります。OSからシャットダウン等で停止した場合は入りません。
感想
Pythonについては全くの初心者で、csvを作成/追記するあたりでさえ、文字化けしてしまったり、一文字ずつカンマが入ってしまったりハマりまくりました(笑)
今後Lambdaで自動削除や通知を行う際に、またPythonに触れると思うので勉強しなければと思います。
参考