はじめに
そもそもそんな操作をする事は無いのでしょう。
単純なワンライナーですが長いのでメモ。
いきさつ
Synology製NASにはGlacier BackupというNASのディレクトリをS3 Glacierにバックアップするアプリがあります。
自宅NASのバックアップ動作確認で不要になったボールトを削除する事になり、本来であればNAS側からボールト削除操作を実行するべきだったのですが・・・
パソコン初心者なので、誤ってAWS側のアクセスキーを先に削除してしまいました。(本当は深夜飲酒中にシステム操作したせいです。)
別のアクセスキーを再登録してもNAS側操作はエラーとなり、仕方なくCLIから操作する事にしました。
しかし、ボールトを削除するためには格納されているアーカイブを全削除しなければならず、アーカイブの総数は10000件以上もあったのです。リファレンスのように手動ではやってられません。
結論
- 生成したアーカイブリストJSONファイルの
ArchiveId
を抽出し、delete-archive
コマンドに渡す
どうする
こちらの記事にある通り、アーカイブリスト取得まで進めます。
「何をするにも時間がかかる」という知見は同記事から頭にいれておきます。
アーカイブリストの結果ファイルは本文もoutput.json
としています。
JSONにあるアーカイブを消す
jq '.ArchiveList[].ArchiveId' output.json | xargs -I {} aws glacier delete-archive --account-id [アカウントID] --vault-name [ボールト名] --archive-id="{}"
シェルからjq
コマンドが使えました。
これでArchiveID
キーの値だけを取り出し、xargs
コマンドで引数のアーカイブIDに該当する部分をjq
の出力で置換するだけです。
これでArchiveId
キー毎にdelete-archive
コマンドが実行されます。
エラーが無ければ標準出力はありません。
対象アーカイブが多すぎると待ち時間で接続がタイムアウトする可能性があるので、その場合はnohup
のバックグラウンド実行も併用しておきましょう。
終わりに
酒飲んでシステムを触るのはやめようね。。。
参考
AWS公式リファレンス: Delete an Archive in S3 Glacier by Using the AWS CLI