Reservationsとは何か、そしてReservationsくくりなしのEC2インスタンス一覧をPythonで取得してみた

Reservations?

こんにちは、大阪オフィスのかずえです。最近pythonでboto3使ってAWSリソースを触っています。

EC2インスタンスの一覧が欲しくて describe_instances()のドキュメントを見ておりました。

すると、返り値の欄に見慣れない Reservations というものが、、しかもこの値、返り値のルート要素(の一つ)になっています。

ドキュメントのキャプチャ

Boto 3 Docs 1.9.194 documentation EC2 describe_instancesのResponse Structure欄

describe_instances()を使ったプログラム

import boto3
import pprint
ec2_client = boto3.client('ec2')

pprint.pprint(ec2_client.describe_instances())

上記プログラムの実行結果

{'Reservations': [{'Groups': [],
                   'Instances': [{(インスタンスの詳細)}],
                   'OwnerId': '(AWSアカウントID)',
                   'ReservationId': 'r-09026f97458c6cb6c'},
                  {'Groups': [],
                   'Instances': [{(インスタンスの詳細)}],
                   'OwnerId': '(AWSアカウントID)',
                   'ReservationId': 'r-08d4064f36be993ed'}],
 'ResponseMetadata': {(省略)}}

※ ReservationId(後述します)の異なるインスタンスが2台存在していた場合

Reservationsとは

すでに弊社の者が調べておりました。手前味噌ですがさすが弊社だ。

【小ネタ】Amazon EC2のReservation IDって何なんだろう?

リザベーションIDとはインスタンスの予約IDです。 リザベーションIDはインスタンスLaunch(作成)ごとに作られ、Launchリクエストと1対1の関係性があります。 もし複数のインスタンスを同じリクエストでLaunchする場合、1インスタンス以上に関連付けることができます。 例えば10インスタンスを1つのリクエストでLaunchした場合は10インスタンスに対して同じリザベーションIDが付与されます。

ReservationIDでくくられていないEC2インスタンス一覧が欲しい

うーん。Reservations(ReservationID)については理解できました。でも欲しいのはReservationIDとか関係ないシンプルなインスタンスの一覧なんですよね。。という訳で、describe_instances()の結果を使ってReservationID毎にまとめられていないインスタンスの一覧出力するプログラムを作成してみました。

import boto3
import pprint
ec2_client = boto3.client('ec2')

response = ec2_client.describe_instances()
instance_list = sum([reservation['Instances'] for reservation in response['Reservations']], [])
pprint.pprint(instance_list)

最初 sum( (list), []) の第二引数の意味がわからなかったのですが、この sum() は内部では以下のような処理をしているそうです。

((((第二引数値+ list要素1つ目) + list要素2つ目 ) + list要素3つ目) + list要素4つ目)…

第二引数のデフォルトは 0 です。ですので第二引数にlistを入れないと、int とlist の加算になりエラーになります。それを防ぐために第二引数に空のlist [] を入れるんですね。

補足情報

動作環境

  • python 3.7.3
  • botocore 1.12.183
  • boto3 1.9.183