起動中のインスタンス一覧を Boto3 で確認する方法

1 min read読了の目安(約1500字

EC2 インスタンスを起動しっぱなしで放置してしまい、予期せぬ課金をされてしまうなんて話はよく聞きます。
私も自分の検証用アカウントでそれなりにグレードの高いインスタンスを起動することがあるのでビクビクしています。

今回はそんな私を含め、警戒している方に向けて起動中の EC2 インスタンス一覧を SDK の Boto3 で取得する方法をご紹介します。
なお、この記事はシリーズの一部となる予定であり、Lambda と CloudWatch Events を組み合わせて定期的に Slack で通知する機能を実装する予定です。

準備

EC2 の読み取り権限を持つ環境で Python を実行します。
EC2 上で実行しても、AWS configure 設定済みのローカル環境でも大丈夫です。
EC2 に IAM ロールをアタッチする場合には、最小でも AmazonEC2ReadOnlyAccess がアタッチ済みである必要があります。

もしローカルであれば、Boto3 は pip でインストールしておきましょう。
私の環境では pipenv を使っているので pipenv で指定してインストールします。

$ pipenv install boto3
$ pipenv shell

実行中の EC2 インスタンス ID を確認

今回は Boto3 で実行中 (running) のインスタンス ID を取得しようとしているので、予め確認しておきます。
AWS コンソールから実行中の EC2 インスタンスのインスタンス ID を確認します。

一部マスクしていますが "i-06e1a7eaXXXXXX" というインスタンス ID のインスタンスが実行中です。

コード

ファイル名は何でもよいですが "get_running_instance_id.py" のようにファイルを一つ作っておきます。
以下が実装例です。

import boto3

client = boto3.client('ec2')
running_instances = client.describe_instances(
  Filters=[
    {
      'Name': 'instance-state-name',
      'Values': ['running']
    }
  ]
)

# 必要な情報を抜粋する処理
for reservation in running_instances['Reservations']:
  for instance in reservation['Instances']:
    # インスタンスIDを取得する
    instance_id = instance.get('InstanceId')
    print(instance_id)

さて、上記のコードを動かしてみましょう。

$ python get_running_instance_id.py
i-06e1a7eaXXXXXXXXXX

先ほど確認したインスタンス ID を取得できていますね。
Name タグを取得する方が可視性はよいですが、今後の実装で長時間稼働し続けている EC2 は自動的に停止させるようにするため、インスタンス ID を取得する実装としています。