インスタンス名からインスタンスIDを特定(boto3)

こんにちは, HACKNOTEのJunya.kです。
インスタンス作成の自動化スクリプトなどでインスタンス名からインスタンスIDが知りたいとき, boto3を用いて特定する方法について説明します.

describe_instances()の中身

あるアカウントのEC2インスタンス情報はdescribe_instances()という関数で取得できます.
1つのインスタンスに対して取得できるデータは, JSON形式で以下のように格納されています.
参考 : 公式ドキュメント

{
    'Reservations': [
        {
            'Groups': [
                {
                    'GroupName': 'string',
                    'GroupId': 'string'
                },
            ],
            'Instances': [
                {
                    'AmiLaunchIndex': 123,
                    'ImageId': 'string',
                    'InstanceId': 'string',
                    'InstanceType': 
                    'KernelId': 'string',
                    'KeyName': 'string',
                    'LaunchTime': datetime(2015, 1, 1),

-----------------------------------------------------------------------------

                    'Tags': [
                        {
                            'Key': 'string',
                            'Value': 'string'
                        },

-----------------------------------------------------------------------------

特定元はインスタンス名であり, Tagsの中に格納されています. また, 特定先はインスタンスIDであり, Instancesの中にInstanceIdとして格納されています.
これらの情報を抜き出して加工していきます.

インスタンスIDの特定

boto3(AWSを扱えるPythonのSDK)を用いて特定していきます.

import boto3
import json
import sys
from collections import defaultdict

ACCESS_KEY = '*************'
SECRET_KEY = '*************'
REGION_NAME = 'ap-northeast-1'

# functions
## make ec2 client
def get_ec2_client(region = REGION_NAME):
    ec2 = boto3.session.Session(
        aws_access_key_id=ACCESS_KEY,
        aws_secret_access_key=SECRET_KEY).client('ec2', region)
    return ec2

## parse tags lists
def parse_sets(tags):
    result = {}
    for tag in tags:
        key = tag['Key']
        val = tag['Value']
        result[key] = val
    return result

## find instance with instance name
def find_ec2_instanceid(instance_name):
    ec2 = get_ec2_client()
    instances = ec2.describe_instances()
    instance_list = []
    for reservations in instances['Reservations']:
        for instance in reservations['Instances']:
            tags = parse_sets(instance['Tags'])
            if tags['Name'] == instance_name:
                return instance['InstanceId']

# functions end

インスタンスごとにループを回し, インスタンス名が一致するものを探します.
find_ec2_instanceid(instance_name)がインスタンスIDを返します.