Skip to content

AWSアカウント内の全EC2インスタンスの利用可能IMDSバージョンを確認するためのPythonスクリプト

Posted on:2021年5月13日 at 00:00

こんにちは。shootaceanです。

AWSアカウント内に存在している全てのEC2インスタンスの
利用可能インスタンスメタデータサービスバージョン ( IMDSv1 / IMDSv2 )
を確認する必要があったので、Pythonスクリプトを書いてみました。

コード

import boto3

profileName = "your-profile-name"

def getTargetInstances(ec2Session):
    """EC2インスタンス情報を取得する"""

    instances = ec2Session.describe_instances()
    targetInstances = []
    for r in instances['Reservations']:
        for i in r['Instances']:
            targetInstances.append({
                'App': getTagValueByName(i['Tags'], 'App'),
                'InstanceId': i["InstanceId"],
                'HttpTokens': i['MetadataOptions']['HttpTokens'],
            })

    return targetInstances

def getTagValueByName(tags: list, name: str) -> str:
    """AWSリソースのタグ配列から指定したタグ名の値を取得する"""

    for t in tags:
        if t['Key'] == name:
            return t['Value']

    return ""

if __name__ == "__main__":
    session = boto3.session.Session(profile_name=profileName)
    ec2 = session.client('ec2')
    targetInstances = getTargetInstances(ec2)
    for i in targetInstances:
        print("{}\t{}".format(i['InstanceId'], i['HttpTokens']))

IMDSの利用可能バージョン判断

boto3で取得できるEC2データ内のMetadataOptions.HttpTokensで判断できます。
optionalの場合は、IMDSv1IMDSv2の両方利用可能で、
requiredの場合は、IMDSv2のみが利用可能となります。

インスタンスメタデータサービスの設定 - Amazon Elastic Compute Cloud
IMDSv2 の使用を必須にするには
既存インスタンスに対して、インスタンスメタデータのリクエスト時に IMDSv2 の使用を必須にするようにオプトインできます。 modify-instance-metadata-options CLI コマンドを使って、http-tokens パラメータを required に設定できます。http-tokens の値を指定するときに、http-endpointenabled に設定する必要もあります。

参考

Appendix