LoginSignup
5
0

More than 1 year has passed since last update.

停止したEC2の情報取得

Last updated at Posted at 2022-08-29

はじめに

教育環境として使用している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するか、メモしてください。
image.png
※これより強い権限であれば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()

csvファイルは以下のようになります。
新しいビットマップ イメージ (2).jpg

注意点

StateTransitionReasonというキーにインスタンスの停止した日時が入っているのですが、これはAWSコンソール上から停止したもののみ日時が入ります。OSからシャットダウン等で停止した場合は入りません。

感想

Pythonについては全くの初心者で、csvを作成/追記するあたりでさえ、文字化けしてしまったり、一文字ずつカンマが入ってしまったりハマりまくりました(笑)
今後Lambdaで自動削除や通知を行う際に、またPythonに触れると思うので勉強しなければと思います。

参考

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0