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" ] ]