停止したEC2の情報取得

# はじめに
教育環境として使用している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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743619/090e10b9-2c6b-d6cf-7d44-fe898caed22c.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様のサイトを参考

https://blog.serverworks.co.jp/boto3-ec2data

```py
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743619/b958e50b-4158-97e2-7f3b-533ea9af9ca6.jpeg)

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

# 感想
Pythonについては全くの初心者で、csvを作成/追記するあたりでさえ、文字化けしてしまったり、一文字ずつカンマが入ってしまったりハマりまくりました（笑）
今後Lambdaで自動削除や通知を行う際に、またPythonに触れると思うので勉強しなければと思います。
# 参考
https://blog.serverworks.co.jp/tech/2019/08/21/post-73231/

https://blog.serverworks.co.jp/boto3-ec2data

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html