ホスト名とインスタンスIDのマップを作る

Session Managerでリモートログインするときなど、EC2のインスタンスIDを欲しい場合がある。
インスタンスIDよりもホスト名のほうが覚えやすいのでホスト名からインスタンスIDを手軽に特定できるようにしておくと便利。

Nameタグにホスト名を登録

EC2のメタ情報としてはホスト名のフィールドはないので、EC2インスタンスのNameタグにホスト名を登録しておく。
タグであればNameタグ以外のタグでもオーケー。
運用にあわせてタグ名を読み替える。

aws ec2 describe-instances コマンドの JSON フォーマット

aws ec2 describe-instances コマンドでEC2インスタンスのメタ情報を一括取得できる。

デフォルトではJSONフォーマットで出力される。
フォーマットは以下の通り。

{
    "Reservations": [
        {
            "Groups": [],
            "Instances": [
                {
                    "AmiLaunchIndex": 0,
                    "ImageId": "ami-xxxxxxxxxxxxxxx",
                    "InstanceId": "i-xxxxxxxxxxxxxxxx",  // ← インスタンスID
                    "InstanceType": "t2.micro",
                    "LaunchTime": "2022-03-14T11:40:31+00:00",
                    ...
                    "Tags": [
                        {
                            "Key": "Name",
                            "Value": "some.example.com"  // ← 登録しておいたホスト名
                        },
                        ...
                    ],
                }
            ],
            ...
            
        }
    ]
}

必要なのはInstanceIdTags

今回の例ではNameタグにホスト名を登録しているが、別のタグで登録している場合は以降でそちらを使うようにする。

jq コマンドで整形する

JSONフォーマットなのでjqコマンドで整形する。

インスタンスの一覧はReservationsの配列の中のInstancesの配列。
Instancesで列挙されるオブジェクトのなかではインスタンスIDとホスト名は以下に記載される。

  • インスタンスID: InstanceId
  • ホスト名: Tagsの中のKeyNameとなっているオブジェクトのValue
$ aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | [.InstanceId, (.Tags[] | select(.Key=="Name") | .Value) ] | @csv'
"i-xxxxxxxxxxxxxxxx","some.example.com"

Nameタグ以外のタグ名にした場合はKey=="Name"の部分を変える。