【AWS】AWS CLIでCloudWatch Alarmが削除できずハマった話
早朝ランニングを決めてきました、saisaiです。ランニングウェアが欲しい…。
みなさん、AWS CLIは利用されておりますでしょうか。
コンソール画面をポチポチすることなく、あらゆるAWSリソースを操作することができるため大変便利ですね。シェルスクリプトから実行することで変数を渡して実行することもできるため僕もよく利用しております。
今回は、そんなAWS CLIを利用してCloudWatch Alarmを削除しようとしてどん詰まりした話をしようかと思います…。
CloudWatch Alarmを削除するコマンド
CloudWatch Alarmは以下のコマンドで削除することができます。
aws cloudwatch delete-alarms --alarm-names アラーム名
見たまんまの挙動ですね。ローカルPCやCloudShellなどで実行することでアラームをサクサク削除することが可能です。
以下のコマンドで稼働中のアラームを確認することもできますのでjqコマンドと併用し削除対象アラームもコマンドで割り出してしまうとさらに便利でしょう。
aws cloudwatch describe-alarms --alarm-names アラーム名
ところで、CloudWatch Alarmはスペースを含むアラーム名を指定することができます。(test alarmなど)
しかし、削除の際に以下のように指定してしまうと削除できません。
aws cloudwatch delete-alarms --alarm-names test alarm
これはtestという名前のアラームとalarmという名前のアラームの2つのアラームを削除する処理を行なってしまっているためです。この場合は以下のように指定してあげましょう。
aws cloudwatch delete-alarms --alarm-names "test alarm"
これでスペースを含むアラーム名のアラームも削除できます!
角括弧を含むアラーム名のアラームを削除する
さて、前置きも程々にここからが本題です。
僕が今回AWS CLIを用いて削除しようとしてかなりハマってしまったアラーム名が
[warn] test alarm
です。
アラーム名の最初にレベルを角括弧を使用して指定しています。
早速これまでの知識を踏まえてこのアラームをコマンドで削除してみましょう。
aws cloudwatch delete-alarms --alarm-names "[warn] test alarm"
アラームを作成するときは上記の指定方法ですんなり作成できましたし、問題ないと楽観していたのですが
Expecting value: line 1 column 2 (char 1)
むむむ…。なんだこれは…。
各括弧がついた途端に削除できなくなってしまったのです…。上記エラーを調べてみるとPythonがJsonを読むときに出るエラーのようですね…。
確かにAWS CLIはPythonで動いていますので、おそらく角括弧がある引数をJsonと認識してしまっているようです。なんでや….。(海外のGit hub issueにバグかも?みたいな掲載がありました。)
なので原因となる各括弧をエスケープするよう、以下のようにアラーム名を指定し削除できました。
aws cloudwatch delete-alarms --alarm-names ' ["[warn] test alarm"] '
ちなみにシェルスクリプトなどで変数展開したい場合は以下のようにすることで削除できます。
aws cloudwatch delete-alarms --alarm-names ' ["[warn] '${ALARM_NAME}'"] '
ここに至るまで結構時間がかかってしまいました…。
さいごに
アラームの作成はすんなりいくだけにめちゃくちゃ戸惑いました…。もしかしたらこの記事を投稿してから数年後にはこのバグ?は解消されてこんな回りくどい方法は必要なくなるのかもしれませんが、2021/10時点ではまだ上記の方法で対応する必要があります。
同じような状況でハマってしまっている技術者様に届きますように…。
最後まで読んでいただきありがとうございました!
↓オススメ教材