AWSのEC2のTagにName: host名のTagを設定しているとする。このTagをもとに起動しているEC2についてhostsファイルを生成したい。

PrivateIP    host名
PrivateIP    host名
PrivateIP    host名
...

awscliのaws ec2 describe-instancesのワンライナーだけで実現できる。

$ aws ec2 describe-instances --filters "Name=instance-state-name, Values=running" --query "Reservations[*].Instances[0].[PrivateIpAddress, (Tags[?Key=='Name'].Value)[0]]" --output text
10.1.22.167    api0001
10.1.40.155    api0002
10.1.7.231     api0003

コマンドが長いので見やすさのため適宜改行を挟む。

aws ec2 describe-instances \
  --filters "Name=instance-state-name, Values=running" \
  --query "Reservations[*].Instances[0].[PrivateIpAddress, (Tags[?Key=='Name'].Value)[0]]" \
  --output text
  • --filtersで起動中のものに限定している
  • --queryでPrivateIPとTag名がNameのものを出力するようにしている

    --queryでの一番のポイントはTags[?Key=='Name'].Valueの部分。?Key=='Name'でKeyがNameのものだけを抜き出せる。

  • --output textで出力結果が配列かつダブルクォーテーションで文字列がくくられてしまう問題を解決している

    --output textがないと出力が以下のようになる。

    [
        [
            "10.1.22.167", 
            "api0001"
        ], 
        [
            "10.1.40.155", 
            "api0002"
        ], 
        [
            "10.1.7.231", 
            "api0003"
        ]
    ]