こんにちは, 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を返します.