読者です 読者をやめる 読者になる 読者になる

戦場のプログラマー

名前は誰も知らない。

awscliでキーペア(鍵ペア)を一括削除する

概要

AWSAPIの練習とシェルスクリプトの練習も兼ねてる。

AWS APIを叩く練習をしていてキーペアをいっぱい作っちゃいました。
こんな感じ。

% aws ec2 describe-key-pairs| jq -r '.KeyPairs [] .KeyName'
default
default2
default3
default4
default5
default6
default7
default8

ちなみにjqの -r オプションはダブルクォーテーションを消してくれるオプション。

これらのキーペアを消したい。

find+xargsを使う(失敗)

find+xargsの組合せに慣れてるから以下の様な感じにしたくなる。

aws ec2 describe-key-pairs | jq -r '.KeyPairs [] .KeyName' | xargs aws ec2 delete-key-pair --key-name
Unknown options: default3, default4, default5, default6, default7, default8, default2

でもエラー。xargsのmanページをよく見てみる。

Man page of XARGS

xargs は標準入力から読み込んだ一連の項目をその後ろに 追加していく (訳注: 作成されたコマンドラインが、 コマンドライン長の上限を 越える場合や、オプションによる特別な指定がある場合は、入力を適宜分割して、 command を複数回実行することになる)。標準入力における空行は無視する。

そういえば

find | xargs rm

find | xargs grep hoge

は引数に複数のエントリをもたせられた気がする・・・。

1個ずつ削除したいのでこれは使えない。

while+readを組み合わせる(成功)

aws ec2 describe-key-pairs | jq -r '.KeyPairs [] .KeyName' | while read key; do
  aws ec2 delete-key-pair --key-name $key
done

これならどうだ。

% aws ec2 describe-key-pairs | jq -r '.KeyPairs [] .KeyName' | while read key; do
pipe pipe while> aws ec2 delete-key-pair --key-name $key
pipe pipe while> done
{
    "return": "true"
}
{
    "return": "true"
}
{
    "return": "true"
}
{
    "return": "true"
}
{
    "return": "true"
}
{
    "return": "true"
}
{
    "return": "true"
}
{
    "return": "true"
}

あっ、うまくいった。
やったきもちいいいいい。

References

  1. jq
  2. jqに痺れた … AWS CLIで演習など - OpenGroove
  3. jqコマンドを使ってみた - mknkisk report
  4. Bash - パイプ出力を現在のシェル上のwhileに喰わせる上手いやり方 - Qiita